diff options
227 files changed, 13239 insertions, 560 deletions
@@ -18,6 +18,8 @@ lvjing5@huawei.com wu.zhihui1@zte.com.cn 14_ykl@tongji.edu.cn limingjiang@huawei.com +trevor.cooper@intel.com +ross.b.brattain@intel.com Link to TSC approval: http://meetbot.opnfv.org/meetings/ Link to approval of additional submitters: diff --git a/api/client.py b/api/client.py new file mode 100644 index 000000000..167754c39 --- /dev/null +++ b/api/client.py @@ -0,0 +1,37 @@ +############################################################################## +# Copyright (c) 2016 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 logging +import requests + +from oslo_serialization import jsonutils + +from yardstick.common import constants as consts + +logger = logging.getLogger(__name__) + + +def post(url, data={}): + url = '{}{}'.format(consts.BASE_URL, url) + data = jsonutils.dumps(data) + headers = {'Content-Type': 'application/json'} + try: + response = requests.post(url, data=data, headers=headers) + result = response.json() + logger.debug('The result is: %s', result) + + return result + except Exception as e: + logger.exception('Failed: %s', e) + raise + + +def get(url): + url = '{}{}'.format(consts.BASE_URL, url) + response = requests.get(url) + return response.json() diff --git a/api/conf.py b/api/conf.py index abaf34a1f..a4f332533 100644 --- a/api/conf.py +++ b/api/conf.py @@ -15,8 +15,6 @@ with IPDB() as ip: GATEWAY_IP = ip.routes['default'].gateway PORT = 8086 -TEST_ACTION = ['runTestCase'] - TEST_CASE_PATH = '../tests/opnfv/test_cases/' SAMPLE_PATH = '../samples/' diff --git a/api/database/__init__.py b/api/database/__init__.py index d7cf4f9c4..753b34684 100644 --- a/api/database/__init__.py +++ b/api/database/__init__.py @@ -13,10 +13,12 @@ from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.ext.declarative import declarative_base +from yardstick.common import constants as consts + logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) -engine = create_engine('sqlite:////tmp/yardstick.db', convert_unicode=True) +engine = create_engine(consts.SQLITE, convert_unicode=True) db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) diff --git a/api/resources/testcases.py b/api/resources/testcases.py new file mode 100644 index 000000000..6ee15efb3 --- /dev/null +++ b/api/resources/testcases.py @@ -0,0 +1,21 @@ +# ############################################################################ +# Copyright (c) 2017 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 +# ############################################################################ +from yardstick.benchmark.core.testcase import Testcase +from yardstick.benchmark.core import Param +from api.utils import common as common_utils + + +def default(args): + return listAllTestcases(args) + + +def listAllTestcases(args): + param = Param(args) + testcase_list = Testcase().list_all(param) + return common_utils.result_handler(1, testcase_list) diff --git a/api/server.py b/api/server.py index 5bac1ba47..1d42feffb 100644 --- a/api/server.py +++ b/api/server.py @@ -10,7 +10,6 @@ from __future__ import absolute_import import inspect import logging -from functools import reduce from six.moves import filter from flasgger import Swagger @@ -38,6 +37,10 @@ def shutdown_session(exception=None): db_session.remove() +for u in urlpatterns: + api.add_resource(u.resource, u.url, endpoint=u.endpoint) + + def init_db(): def func(a): try: @@ -52,12 +55,14 @@ def init_db(): Base.metadata.create_all(bind=engine) -init_db() -reduce(lambda a, b: a.add_resource(b.resource, b.url, - endpoint=b.endpoint) or a, urlpatterns, api) +def app_wrapper(*args, **kwargs): + init_db() + return app(*args, **kwargs) + if __name__ == '__main__': _init_logging() logger.setLevel(logging.DEBUG) logger.info('Starting server') + init_db() app.run(host='0.0.0.0') diff --git a/api/urls.py b/api/urls.py index 04b7485f1..3ccb67dbc 100644 --- a/api/urls.py +++ b/api/urls.py @@ -13,6 +13,7 @@ from api.utils.common import Url urlpatterns = [ Url('/yardstick/asynctask', views.Asynctask, 'asynctask'), + Url('/yardstick/testcases', views.Testcases, 'testcases'), Url('/yardstick/testcases/release/action', views.ReleaseAction, 'release'), Url('/yardstick/testcases/samples/action', views.SamplesAction, 'samples'), Url('/yardstick/testsuites/action', views.TestsuitesAction, 'testsuites'), diff --git a/api/views.py b/api/views.py index 0c39bfad0..9fd236fad 100644 --- a/api/views.py +++ b/api/views.py @@ -30,6 +30,11 @@ class Asynctask(ApiResource): return self._dispatch_get() +class Testcases(ApiResource): + def get(self): + return self._dispatch_get() + + class ReleaseAction(ApiResource): @swag_from(os.getcwd() + '/swagger/docs/release_action.yaml') def post(self): diff --git a/api/yardstick.ini b/api/yardstick.ini index 2ba881fc1..d2e8956e2 100644 --- a/api/yardstick.ini +++ b/api/yardstick.ini @@ -9,7 +9,7 @@ threads = 5 async = true max-requests = 5000 chmod-socket = 666 -callable = app +callable = app_wrapper enable-threads = true close-on-exec = 1 daemonize= /var/log/yardstick/uwsgi.log diff --git a/docker/Dockerfile b/docker/Dockerfile index 23afef74e..afb2ce5c6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -41,6 +41,7 @@ RUN apt-get update && apt-get install -y \ kpartx \ libffi-dev \ libssl-dev \ + libzmq-dev \ python \ python-dev \ libxml2-dev \ diff --git a/etc/yardstick/nodes/pod.yaml.nsb.sample b/etc/yardstick/nodes/pod.yaml.nsb.sample new file mode 100644 index 000000000..af51bdf8a --- /dev/null +++ b/etc/yardstick/nodes/pod.yaml.nsb.sample @@ -0,0 +1,78 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +nodes: +- + name: trafficgen_1 + role: TrafficGen + ip: 1.1.1.1 + user: root + password: r00t + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:05:00.0" + driver: <nic kernel driver> + dpdk_port_num: 0 + local_ip: "152.16.100.20" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:01" + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:05:00.1" + driver: <nic kernel driver> + dpdk_port_num: 1 + local_ip: "152.16.40.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:02" + +- + name: vnf + role: TrafficGen + ip: 1.1.1.2 + user: root + password: r00t + host: 1.1.1.2 # BM - Host == ip, Standalone virtualization - Host == compute node + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:05:00.0" + driver: <nic kernel driver> + dpdk_port_num: 0 + local_ip: "152.16.100.21" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:03" + + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:05:00.1" + driver: <nic kernel driver> + dpdk_port_num: 1 + local_ip: "152.16.40.21" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:04" + routing_table: + - network: "152.16.100.20" + netmask: "255.255.255.0" + gateway: "152.16.100.20" + if: "xe0" + - network: "152.16.40.20" + netmask: "255.255.255.0" + gateway: "152.16.40.20" + if: "xe1" + nd_route_tbl: + - network: "0064:ff9b:0:0:0:0:9810:6414" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:6414" + if: "xe0" + - network: "0064:ff9b:0:0:0:0:9810:2814" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:2814" + if: "xe1" diff --git a/etc/yardstick/yardstick.conf.sample b/etc/yardstick/yardstick.conf.sample index 70cf71ade..572051186 100644 --- a/etc/yardstick/yardstick.conf.sample +++ b/etc/yardstick/yardstick.conf.sample @@ -26,3 +26,7 @@ target = http://127.0.0.1:8086 db_name = yardstick username = root password = root + +[nsb] +trex_path=/opt/nsb_bin/trex/scripts +bin_path=/opt/nsb_bin diff --git a/nsb_setup.sh b/nsb_setup.sh new file mode 100755 index 000000000..02258a577 --- /dev/null +++ b/nsb_setup.sh @@ -0,0 +1,244 @@ +#! /bin/bash +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# Change to yardstick directory ( <current-dir>/.. ), and export it as REPO_DIR +# +cd "$(dirname "${BASH_SOURCE[0]}")" +export REPO_DIR=$PWD +echo "------------------------------------------------------------------------------" +echo " REPO_DIR exported as $REPO_DIR" +echo "------------------------------------------------------------------------------" + +if [ "$(whoami)" != "root" ]; then + echo "Must be root to run $0" + exit 1; +fi + +INSTALL_BIN_PATH="/opt/nsb_bin" +TREX_DOWNLOAD="https://trex-tgn.cisco.com/trex/release/v2.05.tar.gz" +DPDK_DOWNLOAD="http://dpdk.org/browse/dpdk/snapshot/dpdk-16.07.zip" +VIRTUAL_VENV="$INSTALL_BIN_PATH/yardstick_venv" + +# +# Install libs needed for NSB +# +install_libs() +{ + echo "Install libs needed to build and run NSB Testing..." + apt-get update > /dev/null 2>&1 + pkg=(git build-essential python-dev virtualenv python-virtualenv virtualenv linux-headers-$(uname -r) unzip python-pip libpcap-dev) + for i in "${pkg[@]}"; do + dpkg-query -W --showformat='${Status}\n' "${i}"|grep "install ok installed" + if [ "$?" -eq "1" ]; then + apt-get -y install "${i}"; + fi + done + echo "Done" +} + +install_yardstick() +{ + echo "Create install directory... $INSTALL_BIN_PATH" + mkdir -p $INSTALL_BIN_PATH + echo "Install yardstick dependencies and build Yardstick in venv..." + pushd . + rm -rf $VIRTUAL_VENV + echo $VIRTUAL_VENV + virtualenv $VIRTUAL_VENV + if [ ! -f "$INSTALL_BIN_PATH/yardstick_venv/bin/activate" ]; then + echo "Installation Error. Failed to create yardstick virtual env..." + exit 1 + fi + source $VIRTUAL_VENV/bin/activate + bash ./install.sh + python setup.py install + popd + + pushd . + echo "Copying yardstick sample conf & pod file to /etc/yardstick/nodes" + mkdir -p /etc/yardstick/nodes + cp "$REPO_DIR/etc/yardstick/yardstick.conf.sample" "/etc/yardstick/yardstick.conf" + cp "$REPO_DIR/etc/yardstick/nodes/pod.yaml.nsb.sample" "/etc/yardstick/nodes/" + popd +} + +# +# Install trex for TH setup +# +install_trex() +{ + TREX_DIR=$INSTALL_BIN_PATH/trex/scripts + if [ -d "$TREX_DIR" ]; then + echo "Trex v2.05already installed. Make sure it contains PYTHONPATH which is required to run TRex" + else + echo "Build TRex and installing Trex TG in $INSTALL_BIN_PATH/trex" + rm -rf ${TREX_DOWNLOAD##*/} + if [ ! -e ${TREX_DOWNLOAD##*/} ] ; then + wget $TREX_DOWNLOAD + fi + tar zxvf ${TREX_DOWNLOAD##*/} + pushd . + rm -rf trex + mkdir -p trex + mv v2.05 trex/scripts + rm -rf v2.05.tar.gz + cd trex/scripts/ko/src/ + make + make install + # workaround trex module issue + touch "$REPO_DIR/trex/scripts/automation/trex_control_plane/stl/__init__.py" + cp "$REPO_DIR/trex/scripts/dpdk_nic_bind.py" "$INSTALL_BIN_PATH" + popd + fi + echo "Done." +} + +install_dpdk() +{ + if [ -d "$INSTALL_BIN_PATH/dpdk-16.07" ]; then + echo "DPDK already installed make sure.. igb_uio is loaded." + else + echo "Build DPDK 16.07..." + pushd . + rm -rf ${DPDK_DOWNLOAD##*/} + rm -rf "$REPO_DIR/dpdk-16.07/" + if [ ! -e ${DPDK_DOWNLOAD##*/} ] ; then + wget ${DPDK_DOWNLOAD} + fi + unzip -o ${DPDK_DOWNLOAD##*/} + + cd dpdk-16.07 + make config T=x86_64-native-linuxapp-gcc O=x86_64-native-linuxapp-gcc + cd x86_64-native-linuxapp-gcc + echo "Enable Port Stats..." + sed -i -e 's/CONFIG_RTE_PORT_STATS_COLLECT=n/CONFIG_RTE_PORT_STATS_COLLECT=y/g' .config + sed -i -e 's/CONFIG_RTE_PORT_PCAP=n/CONFIG_RTE_PORT_PCAP=y/g' .config + sed -i -e 's/CONFIG_RTE_TABLE_STATS_COLLECT=n/CONFIG_RTE_TABLE_STATS_COLLECT=y/g' .config + sed -i -e 's/CONFIG_RTE_PIPELINE_STATS_COLLECT=n/CONFIG_RTE_PIPELINE_STATS_COLLECT=y/g' .config + make + + echo "Load DPDK modules and setup hugepages" + modprobe uio + mkdir -p "/lib/modules/$(uname -r)/extra" + cp -r "kmod/igb_uio.ko" "/lib/modules/$(uname -r)/extra" + depmod -a + modprobe igb_uio + sh -c "echo 'uio\nigb_uio\n' > /etc/modules-load.d/nsb.conf" + + HUGEPGSZ=$(cat < /proc/meminfo | grep Hugepagesize | cut -d : -f 2 | tr -d ' ') + Pages=16 + if [[ "$HUGEPGSZ" = "2048kB" ]] ; then + Pages=16384 + fi + grep nr_hugepages /etc/sysctl.conf + if [[ "$?" -eq '1' ]] ; then + sh -c "echo 'vm.nr_hugepages=$Pages' >> /etc/sysctl.conf" + fi + echo "echo $Pages > /sys/kernel/mm/hugepages/hugepages-${HUGEPGSZ}/nr_hugepages" > .echo_tmp + echo "Reserving hugepages" + sudo sh .echo_tmp + rm -f .echo_tmp + + service procps start + echo "Creating /mnt/huge and mounting as hugetlbfs" + sudo mkdir -p /mnt/huge + + grep -s '/mnt/huge' /proc/mounts > /dev/null + if [ $? -ne 0 ] ; then + sudo mount -t hugetlbfs nodev /mnt/huge + fi + popd + mv "$REPO_DIR/dpdk-16.07" "$INSTALL_BIN_PATH" + rm dpdk-16.07.zip + fi + export RTE_SDK="$INSTALL_BIN_PATH/dpdk-16.07" + export RTE_TARGET=x86_64-native-linuxapp-gcc + + if [ ! -f "$INSTALL_BIN_PATH/vPE_vnf" ]; then + pushd . + echo "Building vPE VNF..." + cd $INSTALL_BIN_PATH/dpdk-16.07/examples/ip_pipeline/ + make clean + make + cp build/ip_pipeline $INSTALL_BIN_PATH/vPE_vnf + popd + fi + echo "Done" +} + + +push_nsb_binary() +{ + if [ ! -d "$INSTALL_BIN_PATH/trex" ]; then + cp -fr "$REPO_DIR/trex" "$INSTALL_BIN_PATH" + fi + rm -rf "$REPO_DIR/trex" + + if [ -d "$INSTALL_BIN_PATH/trex" ]; then + echo "Setup Environment variables for Test Harness...." + PYTHONPATH="$INSTALL_BIN_PATH/trex/scripts/automation/trex_control_plane:$INSTALL_BIN_PATH/trex/scripts/automation/trex_control_plane/stl" + PY_PATH=$(grep PYTHONPATH ~/.bash_profile) + if [ "$PY_PATH" = "" ] ; then + sh -c "echo export PYTHONPATH=$PYTHONPATH >> ~/.bash_profile" > /dev/null + else + echo "Your ~/.bash_profile already contains a PYTHONPATH definition." + echo "Make sure it contains $PYTHONPATH which is required to run TRex" + fi + fi + cp "$REPO_DIR/yardstick/network_services/nfvi/collectd.sh" "$INSTALL_BIN_PATH" + cp "$REPO_DIR/yardstick/network_services/nfvi/collectd.conf" "$INSTALL_BIN_PATH" + cp "$REPO_DIR/nsb_setup.sh" "$INSTALL_BIN_PATH" + echo "Done" +} + +check_installed_files() +{ + if [ ! -f "$INSTALL_BIN_PATH/yardstick_venv/bin/activate" ]; then + echo "Installation Error. Failed to create yardstick virtual env..." + exit 1 + fi + + if [ ! -d "$INSTALL_BIN_PATH/dpdk-16.07" ]; then + echo "Installation Error. Failed to download and install dpdk-16.07..." + exit 1 + fi + + if [ ! -d "$INSTALL_BIN_PATH/trex" ]; then + echo "Installation Error. Failed to download and configure Trex" + exit 1 + fi + + if [ ! -f "$INSTALL_BIN_PATH/vPE_vnf" ]; then + echo "Installation Error. vPE VNF not present in install dir $INSTALL_BIN_PATH" + exit 1 + fi +} + +if [ "$1" == "dpdk" ]; then + install_libs + install_dpdk +else + install_libs + install_yardstick + install_dpdk + install_trex + push_nsb_binary + check_installed_files +clear +echo "Installation completed..." +echo "Virtual Environment : $INSTALL_BIN_PATH/yardstick_venv" +echo "Please Refer README.NSB.rst document on how to get started on VNF testing." +fi diff --git a/requirements.txt b/requirements.txt index 1f9d85104..d04824686 100644 --- a/requirements.txt +++ b/requirements.txt @@ -53,6 +53,7 @@ pycrypto==2.6.1 pyflakes==1.0.0 pyparsing==2.1.0 pyrsistent==0.11.12 +osc-lib==1.2.0 python-cinderclient==1.9.0 python-glanceclient==2.5.0 python-heatclient==1.5.0 @@ -60,7 +61,7 @@ python-keystoneclient==3.6.0 python-mimeparse==1.5.1 python-neutronclient==6.0.0 python-novaclient==6.0.0 -python-openstackclient==3.3.0 +python-openstackclient==3.7.0 python-subunit==1.2.0 python-swiftclient==3.0.0 pytz==2015.7 @@ -86,5 +87,6 @@ docker-py==1.10.6 flasgger==0.5.13 flask-restful-swagger==0.19 SQLAlchemy==1.1.4 -zmq==0.0.0 +# version 14.5.0 for compatibility with trex traffic generator +pyzmq==14.5.0 pika==0.10.0 diff --git a/run_tests.sh b/run_tests.sh index 972f6a27f..1f985b6c1 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -33,7 +33,33 @@ run_flake8() { fi } +get_external_libs() { + cd $(dirname ${BASH_SOURCE[0]}) + TREX_DOWNLOAD="https://trex-tgn.cisco.com/trex/release/v2.05.tar.gz" + TREX_DIR=$PWD/trex/scripts + if [ ! -d "$TREX_DIR" ]; then + rm -rf ${TREX_DOWNLOAD##*/} + if [ ! -e ${TREX_DOWNLOAD##*/} ] ; then + wget -nv $TREX_DOWNLOAD + fi + tar xf ${TREX_DOWNLOAD##*/} + pushd . + rm -rf trex && mkdir -p trex + mv v2.05 trex/scripts + rm -rf v2.05.tar.gz + touch "$PWD/trex/scripts/automation/trex_control_plane/stl/__init__.py" + popd + fi + echo "Done." + export PYTHONPATH=$PYTHONPATH:"$PWD/trex/scripts/automation/trex_control_plane" + export PYTHONPATH=$PYTHONPATH:"$PWD/trex/scripts/automation/trex_control_plane/stl" + echo $PYTHONPATH +} + run_tests() { + echo "Get external libs needed for unit test" + get_external_libs + echo "Running unittest ... " if [ $FILE_OPTION == "f" ]; then python -m unittest discover -v -s tests/unit > $logfile 2>&1 diff --git a/samples/vnf_samples/nsut/2trex/tc_trex_baremetal_context.yaml b/samples/vnf_samples/nsut/2trex/tc_trex_baremetal_context.yaml new file mode 100644 index 000000000..e0ba6d96f --- /dev/null +++ b/samples/vnf_samples/nsut/2trex/tc_trex_baremetal_context.yaml @@ -0,0 +1,43 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +schema: "yardstick:task:0.1" + +scenarios: +- + type: NSPerf + traffic_profile: ../../traffic_profiles/fixed.yaml + topology: trex_tg_topology.yaml # TODO: look in relative path where the tc.yaml is found + + nodes: # This section is copied from pod.xml or resolved via Heat + trexgen__1: trafficgen_1.yardstick + trexvnf__1: vnf.yardstick + + vnf_options: + trexgen__1: + target_ip: trexvnf__1.xe0.local_ip # TODO: resolve to config vars + trexvnf__1: + target_ip: trexgen__1.xe1.local_ip # TODO: resolve to config vars + runner: + type: Duration + duration: 10 + +context: + type: Node # Heat, Node(baremetal), Node-ovs, Node-sriov + name: yardstick + #file: pod.yaml + # image: yardstick-baremetal # only important for heat context + nfvi_type: baremetal # options: baremetal, sriov, ovs-virtio TODO: what about mixed scenarios? + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/nsut/2trex/trex_tg_topology.yaml b/samples/vnf_samples/nsut/2trex/trex_tg_topology.yaml new file mode 100644 index 000000000..1a9b50c84 --- /dev/null +++ b/samples/vnf_samples/nsut/2trex/trex_tg_topology.yaml @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +nsd:nsd-catalog: + nsd: + - id: trex-tg-topology + name: trex-tg-topology + short-name: trex-tg-topology + description: trex-tg-topology + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: trexgen__1 + VNF model: ../../vnf_descriptors/tg_trex_tpl.yaml #VNF type + - member-vnf-index: '2' + vnfd-id-ref: trexvnf__1 + VNF model: ../../vnf_descriptors/tg_trex_tpl.yaml #VNF type + + vld: + - id: private + name: trexgen__1 to trexvnf__1 link 1 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: trexgen + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: trexgen + + - id: public + name: trexvnf__1 to trexgen__1 link 2 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: trexgen + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: trexgen diff --git a/samples/vnf_samples/nsut/ping/ping_tg_topology.yaml b/samples/vnf_samples/nsut/ping/ping_tg_topology.yaml new file mode 100644 index 000000000..b2b852a79 --- /dev/null +++ b/samples/vnf_samples/nsut/ping/ping_tg_topology.yaml @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +nsd:nsd-catalog: + nsd: + - id: ping-tg-topology + name: ping-tg-topology + short-name: ping-tg-topology + description: ping-tg-topology + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/tg_ping_tpl.yaml #VNF type + - member-vnf-index: '2' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/tg_ping_tpl.yaml #VNF type + + vld: + - id: private + name: tg__1 to vnf__1 link 1 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: trexgen + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: trexgen + + - id: public + name: vnf__1 to tg__1 link 2 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: trexgen + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: trexgen diff --git a/samples/vnf_samples/nsut/ping/tc_ping_baremetal_context.yaml b/samples/vnf_samples/nsut/ping/tc_ping_baremetal_context.yaml new file mode 100644 index 000000000..5f2c55b81 --- /dev/null +++ b/samples/vnf_samples/nsut/ping/tc_ping_baremetal_context.yaml @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +schema: "yardstick:task:0.1" + +scenarios: +- + type: NSPerf + traffic_profile: ../../traffic_profiles/fixed.yaml + topology: ping_tg_topology.yaml # TODO: look in relative path where the tc.yaml is found + + nodes: # This section is copied from pod.xml or resolved via Heat + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + + vnf_options: + tg__1: + target_ip: pingvnf__1.xe0.local_ip # TODO: resolve to config vars + vnf__1: + target_ip: pinggen__1.xe1.local_ip # TODO: resolve to config vars + runner: + type: Duration + duration: 10 + +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_1518B.yaml b/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_1518B.yaml new file mode 100644 index 000000000..37687613c --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_1518B.yaml @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: "../../traffic_profiles/ipv4_throughput_vpe.yaml" + topology: vpe_vnf_topology.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + tc_options: + rfc2544: + allowed_drop_rate: 0.8 - 1 + vnf_options: + vpe: + cfg: vpe_config + runner: + type: Duration + duration: 400 + interval: 35 + traffic_options: + flow: "../../traffic_profiles/ipv4_1flow_Packets_vpe.yaml" + imix: "../../traffic_profiles/imix_storage.yaml" +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml b/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml new file mode 100644 index 000000000..fb1be35c1 --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: "../../traffic_profiles/ipv4_throughput_vpe.yaml" + topology: vpe_vnf_topology.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + tc_options: + rfc2544: + allowed_drop_rate: 0.8 - 1 + vnf_options: + vpe: + cfg: vpe_config + runner: + type: Duration + duration: 400 + interval: 35 + traffic_options: + flow: "../../traffic_profiles/ipv4_1flow_Packets_vpe.yaml" + imix: "../../traffic_profiles/imix_voice.yaml" +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_IMIX.yaml b/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_IMIX.yaml new file mode 100644 index 000000000..c481f812b --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/tc_baremetal_rfc2544_ipv4_1flow_IMIX.yaml @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: "../../traffic_profiles/ipv4_throughput_vpe.yaml" + topology: vpe_vnf_topology.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + tc_options: + rfc2544: + allowed_drop_rate: 0.8 - 1 + vnf_options: + vpe: + cfg: vpe_config + runner: + type: Duration + duration: 400 + interval: 35 + traffic_options: + flow: "../../traffic_profiles/ipv4_1flow_Packets_vpe.yaml" + imix: "../../traffic_profiles/imix_video.yaml" +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml 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 new file mode 100644 index 000000000..21731cd45 --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/vpe_config/action_bulk_512.txt @@ -0,0 +1,512 @@ +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 +flow 3 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 4 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 5 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 6 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 7 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 8 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 9 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 10 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 11 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 12 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 13 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 14 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 15 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 16 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 17 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 18 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 19 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 20 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 21 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 22 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 23 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 24 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 25 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 26 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 27 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 28 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 29 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 30 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 31 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 32 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 33 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 34 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 35 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 36 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 37 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 38 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 39 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 40 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 41 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 42 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 43 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 44 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 45 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 46 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 47 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 48 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 49 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 50 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 51 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 52 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 53 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 54 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 55 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 56 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 57 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 58 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 59 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 60 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 61 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 62 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 63 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 64 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 65 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 66 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 67 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 68 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 69 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 70 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 71 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 72 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 73 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 74 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 75 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 76 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 77 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 78 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 79 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 80 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 81 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 82 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 83 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 84 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 85 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 86 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 87 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 88 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 89 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 90 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 91 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 92 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 93 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 94 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 95 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 96 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 97 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 98 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 99 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 100 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 101 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 102 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 103 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 104 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 105 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 106 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 107 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 108 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 109 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 110 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 111 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 112 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 113 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 114 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 115 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 116 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 117 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 118 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 119 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 120 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 121 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 122 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 123 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 124 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 125 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 126 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 127 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 128 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 129 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 130 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 131 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 132 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 133 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 134 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 135 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 136 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 137 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 138 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 139 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 140 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 141 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 142 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 143 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 144 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 145 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 146 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 147 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 148 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 149 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 150 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 151 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 152 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 153 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 154 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 155 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 156 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 157 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 158 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 159 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 160 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 161 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 162 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 163 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 164 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 165 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 166 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 167 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 168 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 169 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 170 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 171 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 172 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 173 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 174 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 175 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 176 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 177 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 178 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 179 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 180 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 181 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 182 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 183 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 184 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 185 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 186 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 187 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 188 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 189 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 190 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 191 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 192 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 193 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 194 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 195 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 196 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 197 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 198 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 199 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 200 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 201 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 202 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 203 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 204 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 205 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 206 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 207 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 208 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 209 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 210 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 211 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 212 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 213 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 214 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 215 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 216 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 217 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 218 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 219 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 220 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 221 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 222 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 223 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 224 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 225 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 226 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 227 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 228 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 229 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 230 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 231 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 232 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 233 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 234 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 235 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 236 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 237 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 238 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 239 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 240 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 241 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 242 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 243 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 244 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 245 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 246 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 247 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 248 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 249 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 250 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 251 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 252 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 253 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 254 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 255 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 256 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 257 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 258 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 259 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 260 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 261 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 262 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 263 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 264 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 265 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 266 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 267 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 268 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 269 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 270 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 271 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 272 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 273 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 274 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 275 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 276 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 277 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 278 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 279 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 280 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 281 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 282 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 283 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 284 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 285 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 286 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 287 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 288 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 289 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 290 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 291 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 292 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 293 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 294 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 295 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 296 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 297 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 298 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 299 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 300 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 301 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 302 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 303 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 304 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 305 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 306 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 307 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 308 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 309 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 310 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 311 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 312 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 313 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 314 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 315 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 316 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 317 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 318 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 319 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 320 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 321 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 322 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 323 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 324 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 325 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 326 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 327 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 328 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 329 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 330 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 331 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 332 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 333 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 334 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 335 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 336 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 337 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 338 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 339 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 340 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 341 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 342 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 343 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 344 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 345 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 346 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 347 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 348 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 349 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 350 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 351 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 352 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 353 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 354 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 355 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 356 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 357 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 358 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 359 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 360 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 361 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 362 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 363 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 364 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 365 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 366 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 367 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 368 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 369 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 370 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 371 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 372 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 373 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 374 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 375 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 376 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 377 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 378 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 379 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 380 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 381 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 382 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 383 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 384 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 385 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 386 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 387 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 388 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 389 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 390 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 391 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 392 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 393 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 394 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 395 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 396 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 397 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 398 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 399 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 400 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 401 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 402 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 403 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 404 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 405 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 406 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 407 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 408 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 409 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 410 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 411 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 412 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 413 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 414 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 415 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 416 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 417 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 418 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 419 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 420 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 421 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 422 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 423 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 424 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 425 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 426 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 427 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 428 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 429 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 430 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 431 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 432 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 433 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 434 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 435 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 436 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 437 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 438 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 439 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 440 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 441 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 442 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 443 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 444 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 445 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 446 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 447 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 448 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 449 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 450 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 451 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 452 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 453 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 454 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 455 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 456 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 457 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 458 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 459 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 460 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 461 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 462 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 463 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 464 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 465 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 466 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 467 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 468 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 469 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 470 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 471 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 472 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 473 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 474 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 475 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 476 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 477 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 478 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 479 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 480 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 481 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 482 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 483 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 484 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 485 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 486 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 487 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 488 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 489 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 490 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 491 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 492 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 493 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 494 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 495 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 496 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 497 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 498 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 499 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 500 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 501 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 502 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 503 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 504 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 505 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 506 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 507 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 508 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 509 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 510 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 511 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/full_tm_profile_10G.cfg b/samples/vnf_samples/nsut/vpe/vpe_config/full_tm_profile_10G.cfg new file mode 100755 index 000000000..502655fd0 --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/vpe_config/full_tm_profile_10G.cfg @@ -0,0 +1,105 @@ +; BSD LICENSE +; +; Copyright(c) 2010-2014 Intel Corporation. All rights reserved. +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +; This file enables the following hierarchical scheduler configuration for each +; 10GbE output port: +; * Single subport (subport 0): +; - Subport rate set to 100% of port rate +; - Each of the 4 traffic classes has rate set to 100% of port rate +; * 4K pipes per subport 0 (pipes 0 .. 4095) with identical configuration: +; - Pipe rate set to 1/4K of port rate +; - Each of the 4 traffic classes has rate set to 100% of pipe rate +; - Within each traffic class, the byte-level WRR weights for the 4 queues +; are set to 1:1:1:1 +; +; For more details, please refer to chapter "Quality of Service (QoS) Framework" +; of Intel Data Plane Development Kit (Intel DPDK) Programmer's Guide. + +; Port configuration +[port] +frame overhead = 24 ; frame overhead = Preamble (7) + SFD (1) + FCS (4) + IFG (12) +mtu = 1522; mtu = Q-in-Q MTU (FCS not included) +number of subports per port = 1 +number of pipes per subport = 4096 +queue sizes = 64 64 64 64 + +; Subport configuration +[subport 0] +tb rate = 1250000000 ; Bytes per second +tb size = 1000000 ; Bytes + +tc 0 rate = 1250000000 ; Bytes per second +tc 1 rate = 1250000000 ; Bytes per second +tc 2 rate = 1250000000 ; Bytes per second +tc 3 rate = 1250000000 ; Bytes per second +tc period = 10 ; Milliseconds + +pipe 0-4095 = 0 ; These pipes are configured with pipe profile 0 + +; Pipe configuration +[pipe profile 0] +tb rate = 1250000000 ; Bytes per second +tb size = 1000000 ; Bytes + +tc 0 rate = 1250000000 ; Bytes per second +tc 1 rate = 1250000000 ; Bytes per second +tc 2 rate = 1250000000 ; Bytes per second +tc 3 rate = 1250000000 ; Bytes per second +tc period = 40 ; Milliseconds + +tc 3 oversubscription weight = 1 + +tc 0 wrr weights = 1 1 1 1 +tc 1 wrr weights = 1 1 1 1 +tc 2 wrr weights = 1 1 1 1 +tc 3 wrr weights = 1 1 1 1 + +; RED params per traffic class and color (Green / Yellow / Red) +[red] +tc 0 wred min = 48 40 32 +tc 0 wred max = 64 64 64 +tc 0 wred inv prob = 10 10 10 +tc 0 wred weight = 9 9 9 + +tc 1 wred min = 48 40 32 +tc 1 wred max = 64 64 64 +tc 1 wred inv prob = 10 10 10 +tc 1 wred weight = 9 9 9 + +tc 2 wred min = 48 40 32 +tc 2 wred max = 64 64 64 +tc 2 wred inv prob = 10 10 10 +tc 2 wred weight = 9 9 9 + +tc 3 wred min = 48 40 32 +tc 3 wred max = 64 64 64 +tc 3 wred inv prob = 10 10 10 +tc 3 wred weight = 9 9 9 diff --git a/samples/vnf_samples/nsut/vpe/vpe_config/fw_bulk_inst0_256.txt b/samples/vnf_samples/nsut/vpe/vpe_config/fw_bulk_inst0_256.txt new file mode 100644 index 000000000..307150789 --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/vpe_config/fw_bulk_inst0_256.txt @@ -0,0 +1,256 @@ +priority 1 ipv4 152.16.0.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.1.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.2.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.3.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.4.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.5.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.6.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.7.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.8.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.9.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.10.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.11.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.12.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.13.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.14.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.15.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.16.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.17.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.18.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.19.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.20.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.21.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.22.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.23.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.24.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.25.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.26.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.27.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.28.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.29.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.30.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.31.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.32.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.33.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.34.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.35.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.36.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.37.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.38.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.39.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.40.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.41.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.42.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.43.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.44.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.45.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.46.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.47.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.48.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.49.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.50.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.51.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.52.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.53.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.54.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.55.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.56.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.57.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.58.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.59.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.60.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.61.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.62.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.63.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.64.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.65.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.66.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.67.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.68.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.69.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.70.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.71.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.72.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.73.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.74.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.75.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.76.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.77.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.78.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.79.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.80.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.81.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.82.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.83.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.84.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.85.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.86.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.87.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.88.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.89.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.90.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.91.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.92.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.93.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.94.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.95.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.96.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.97.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.98.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.99.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.100.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.101.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.102.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.103.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.104.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.105.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.106.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.107.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.108.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.109.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.110.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.111.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.112.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.113.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.114.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.115.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.116.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.117.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.118.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.119.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.120.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.121.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.122.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.123.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.124.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.125.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.126.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.127.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.128.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.129.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.130.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.131.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.132.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.133.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.134.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.135.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.136.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.137.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.138.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.139.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.140.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.141.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.142.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.143.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.144.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.145.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.146.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.147.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.148.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.149.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.150.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.151.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.152.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.153.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.154.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.155.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.156.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.157.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.158.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.159.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.160.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.161.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.162.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.163.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.164.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.165.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.166.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.167.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.168.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.169.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.170.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.171.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.172.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.173.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.174.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.175.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.176.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.177.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.178.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.179.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.180.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.181.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.182.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.183.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.184.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.185.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.186.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.187.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.188.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.189.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.190.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.191.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.192.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.193.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.194.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.195.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.196.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.197.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.198.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.199.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.200.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.201.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.202.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.203.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.204.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.205.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.206.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.207.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.208.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.209.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.210.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.211.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.212.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.213.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.214.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.215.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.216.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.217.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.218.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.219.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.220.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.221.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.222.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.223.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.224.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.225.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.226.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.227.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.228.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.229.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.230.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.231.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.232.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.233.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.234.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.235.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.236.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.237.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.238.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.239.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.240.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.241.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.242.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.243.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.244.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.245.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.246.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.247.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.248.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.249.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.250.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.251.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.252.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.253.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.254.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.255.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 diff --git a/samples/vnf_samples/nsut/vpe/vpe_config/vpe_config b/samples/vnf_samples/nsut/vpe/vpe_config/vpe_config new file mode 100644 index 000000000..17ebc6a76 --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/vpe_config/vpe_config @@ -0,0 +1,101 @@ +[EAL] +log_level = 0 + +[PIPELINE0] +type = MASTER +core = s{socket}c0 + +[MEMPOOL0] +pool_size = 256K + +[MEMPOOL1] +pool_size = 2M + +[RXQ1.0] +mempool = MEMPOOL1 + +;;;;;;;;;;Begin of upstream 0;;;;;;;;;;;;;;;;;; +[PIPELINE1] +type = FIREWALL +core = s{socket}c1 +pktq_in = RXQ0.0 +pktq_out = SWQ0 SINK0 +n_rules = 4096 +pkt_type = qinq_ipv4 + +[PIPELINE2] +type = FLOW_CLASSIFICATION +core = s{socket}c1 +pktq_in = SWQ0 +pktq_out = SWQ1 SINK1 +n_flows = 65536 +key_size = 8; dma_size +key_offset = 268; dma_dst_offset +key_mask = 00000FFF00000FFF; qinq +flowid_offset = 172; mbuf (128) + 64 + +[PIPELINE3] +type = FLOW_ACTIONS +core = s{socket}c1h +pktq_in = SWQ1 +pktq_out = SWQ2 +n_flows = 65536 +n_meters_per_flow = 1;dscp is not considered for per user metering +flow_id_offset = 172; mbuf (128) + 64 +ip_hdr_offset = 278 ; should not needed, but who knows? +color_offset = 176 + +[PIPELINE4] +type = FLOW_ACTIONS +core = s{socket}c1h +pktq_in = SWQ2 +pktq_out = SWQ3 +n_flows = 65536 +n_meters_per_flow = 4; Use dscp to classify into 1 out of 4 TC +flow_id_offset = 172; mbuf (128) + 64 +ip_hdr_offset = 278 ; should not needed, but who knows? +color_offset = 176 + +[PIPELINE5] +type = ROUTING +core = s{socket}c1 +pktq_in = SWQ3 +pktq_out = TXQ1.0 SINK2 +encap = ethernet_mpls +mpls_color_mark = yes +ip_hdr_offset = 278 ; should not needed, but who knows? +color_offset = 176 + +;;;;;;;;;;Begin of downstream 0;;;;;;;;;;;;;;;;;; +[PIPELINE6] +type = ROUTING +core = s{socket}c2 +pktq_in = RXQ1.0 +pktq_out = SWQ4 SINK3 +encap = ethernet_qinq +qinq_sched = yes +ip_hdr_offset = 270; mbuf (128) + headroom (128) + ethernet header (14) = 270 + + +[PIPELINE7] +type = PASS-THROUGH +core = s{socket}c2h +pktq_in = SWQ4 +pktq_out = SWQ5 + +[PIPELINE8] +type = PASS-THROUGH +core = s{socket}c2h +pktq_in = SWQ5 TM0 +pktq_out = TM0 SWQ6 + +[PIPELINE9] +type = PASS-THROUGH +core = s{socket}c2 +pktq_in = SWQ6 +pktq_out = TXQ0.0 + +[TM0] +burst_read = 24;dequeue should be slightly slower then enqueue to create buffer +burst_write = 32 +cfg = /tmp/full_tm_profile_10G.cfg diff --git a/samples/vnf_samples/nsut/vpe/vpe_config/vpe_script b/samples/vnf_samples/nsut/vpe/vpe_config/vpe_script new file mode 100644 index 000000000..740eb6586 --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/vpe_config/vpe_script @@ -0,0 +1,384 @@ +#================================================================= +#Pipeline 1 : 256 Firewall Rules for 1 port with 0.0.X.0/24 for destination IP +#================================================================= +p 1 firewall add bulk /tmp/fw_bulk_inst0_256.txt +p 1 firewall add default 1 + +#================================================================= +#Pipeline 2 : 512 flow classfication Rules for 1 port using QinQ as input. Flow id = SVLAN * 512 + CVLAN +#================================================================= +p 2 flow add qinq 128 512 port 0 id 1 +p 2 flow add default 1 + +#================================================================= +#Pipeline 3 : 512 metering Rules for 1 port +#================================================================= +p 3 action flow bulk /tmp/action_bulk_512.txt +p 3 flows 512 ports 1 + +#================================================================= +#Pipeline 4 : 512 metering Rules and 4 traffic classes for 1 port +#================================================================= +p 4 action flow bulk /tmp/action_bulk_512.txt +p 4 flows 512 ports 1 +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 +#================================================================= +#Pipeline 5 : 32 Upstream Routing Rules for 1 ports with dst_ip : 0.0.0.0 to 0.0.255.255 +#================================================================= +p 5 route add 152.40.0.0 21 port 0 ether {port1_dst_mac} mpls 0:0 +p 5 route add 152.40.8.0 21 port 0 ether {port1_dst_mac} mpls 0:1 +p 5 route add 152.40.16.0 21 port 0 ether {port1_dst_mac} mpls 0:2 +p 5 route add 152.40.24.0 21 port 0 ether {port1_dst_mac} mpls 0:3 +p 5 route add 152.40.32.0 21 port 0 ether {port1_dst_mac} mpls 0:4 +p 5 route add 152.40.40.0 21 port 0 ether {port1_dst_mac} mpls 0:5 +p 5 route add 152.40.48.0 21 port 0 ether {port1_dst_mac} mpls 0:6 +p 5 route add 152.40.56.0 21 port 0 ether {port1_dst_mac} mpls 0:7 +p 5 route add 152.40.64.0 21 port 0 ether {port1_dst_mac} mpls 0:8 +p 5 route add 152.40.72.0 21 port 0 ether {port1_dst_mac} mpls 0:9 +p 5 route add 152.40.80.0 21 port 0 ether {port1_dst_mac} mpls 0:10 +p 5 route add 152.40.88.0 21 port 0 ether {port1_dst_mac} mpls 0:11 +p 5 route add 152.40.96.0 21 port 0 ether {port1_dst_mac} mpls 0:12 +p 5 route add 152.40.104.0 21 port 0 ether {port1_dst_mac} mpls 0:13 +p 5 route add 152.40.112.0 21 port 0 ether {port1_dst_mac} mpls 0:14 +p 5 route add 152.40.120.0 21 port 0 ether {port1_dst_mac} mpls 0:15 +p 5 route add 152.40.128.0 21 port 0 ether {port1_dst_mac} mpls 0:16 +p 5 route add 152.40.136.0 21 port 0 ether {port1_dst_mac} mpls 0:17 +p 5 route add 152.40.144.0 21 port 0 ether {port1_dst_mac} mpls 0:18 +p 5 route add 152.40.152.0 21 port 0 ether {port1_dst_mac} mpls 0:19 +p 5 route add 152.40.160.0 21 port 0 ether {port1_dst_mac} mpls 0:20 +p 5 route add 152.40.168.0 21 port 0 ether {port1_dst_mac} mpls 0:21 +p 5 route add 152.40.176.0 21 port 0 ether {port1_dst_mac} mpls 0:22 +p 5 route add 152.40.184.0 21 port 0 ether {port1_dst_mac} mpls 0:23 +p 5 route add 152.40.192.0 21 port 0 ether {port1_dst_mac} mpls 0:24 +p 5 route add 152.40.200.0 21 port 0 ether {port1_dst_mac} mpls 0:25 +p 5 route add 152.40.208.0 21 port 0 ether {port1_dst_mac} mpls 0:26 +p 5 route add 152.40.216.0 21 port 0 ether {port1_dst_mac} mpls 0:27 +p 5 route add 152.40.224.0 21 port 0 ether {port1_dst_mac} mpls 0:28 +p 5 route add 152.40.232.0 21 port 0 ether {port1_dst_mac} mpls 0:29 +p 5 route add 152.40.240.0 21 port 0 ether {port1_dst_mac} mpls 0:30 +p 5 route add 152.40.248.0 21 port 0 ether {port1_dst_mac} mpls 0:31 +p 5 route add default 1 + +#================================================================= +#Pipeline 6 : 256 Downstream Routing Rules for 1 ports with dst_ip : 0.0.0.0 to 0.0.255.255 +#================================================================= +p 6 route add 152.16.0.0 24 port 0 ether {port0_dst_mac} qinq 0 0 +p 6 route add 152.16.1.0 24 port 0 ether {port0_dst_mac} qinq 0 1 +p 6 route add 152.16.2.0 24 port 0 ether {port0_dst_mac} qinq 0 2 +p 6 route add 152.16.3.0 24 port 0 ether {port0_dst_mac} qinq 0 3 +p 6 route add 152.16.4.0 24 port 0 ether {port0_dst_mac} qinq 0 4 +p 6 route add 152.16.5.0 24 port 0 ether {port0_dst_mac} qinq 0 5 +p 6 route add 152.16.6.0 24 port 0 ether {port0_dst_mac} qinq 0 6 +p 6 route add 152.16.7.0 24 port 0 ether {port0_dst_mac} qinq 0 7 +p 6 route add 152.16.8.0 24 port 0 ether {port0_dst_mac} qinq 0 8 +p 6 route add 152.16.9.0 24 port 0 ether {port0_dst_mac} qinq 0 9 +p 6 route add 152.16.10.0 24 port 0 ether {port0_dst_mac} qinq 0 10 +p 6 route add 152.16.11.0 24 port 0 ether {port0_dst_mac} qinq 0 11 +p 6 route add 152.16.12.0 24 port 0 ether {port0_dst_mac} qinq 0 12 +p 6 route add 152.16.13.0 24 port 0 ether {port0_dst_mac} qinq 0 13 +p 6 route add 152.16.14.0 24 port 0 ether {port0_dst_mac} qinq 0 14 +p 6 route add 152.16.15.0 24 port 0 ether {port0_dst_mac} qinq 0 15 +p 6 route add 152.16.16.0 24 port 0 ether {port0_dst_mac} qinq 0 16 +p 6 route add 152.16.17.0 24 port 0 ether {port0_dst_mac} qinq 0 17 +p 6 route add 152.16.18.0 24 port 0 ether {port0_dst_mac} qinq 0 18 +p 6 route add 152.16.19.0 24 port 0 ether {port0_dst_mac} qinq 0 19 +p 6 route add 152.16.20.0 24 port 0 ether {port0_dst_mac} qinq 0 20 +p 6 route add 152.16.21.0 24 port 0 ether {port0_dst_mac} qinq 0 21 +p 6 route add 152.16.22.0 24 port 0 ether {port0_dst_mac} qinq 0 22 +p 6 route add 152.16.23.0 24 port 0 ether {port0_dst_mac} qinq 0 23 +p 6 route add 152.16.24.0 24 port 0 ether {port0_dst_mac} qinq 0 24 +p 6 route add 152.16.25.0 24 port 0 ether {port0_dst_mac} qinq 0 25 +p 6 route add 152.16.26.0 24 port 0 ether {port0_dst_mac} qinq 0 26 +p 6 route add 152.16.27.0 24 port 0 ether {port0_dst_mac} qinq 0 27 +p 6 route add 152.16.28.0 24 port 0 ether {port0_dst_mac} qinq 0 28 +p 6 route add 152.16.29.0 24 port 0 ether {port0_dst_mac} qinq 0 29 +p 6 route add 152.16.30.0 24 port 0 ether {port0_dst_mac} qinq 0 30 +p 6 route add 152.16.31.0 24 port 0 ether {port0_dst_mac} qinq 0 31 +p 6 route add 152.16.32.0 24 port 0 ether {port0_dst_mac} qinq 0 32 +p 6 route add 152.16.33.0 24 port 0 ether {port0_dst_mac} qinq 0 33 +p 6 route add 152.16.34.0 24 port 0 ether {port0_dst_mac} qinq 0 34 +p 6 route add 152.16.35.0 24 port 0 ether {port0_dst_mac} qinq 0 35 +p 6 route add 152.16.36.0 24 port 0 ether {port0_dst_mac} qinq 0 36 +p 6 route add 152.16.37.0 24 port 0 ether {port0_dst_mac} qinq 0 37 +p 6 route add 152.16.38.0 24 port 0 ether {port0_dst_mac} qinq 0 38 +p 6 route add 152.16.39.0 24 port 0 ether {port0_dst_mac} qinq 0 39 +p 6 route add 152.16.40.0 24 port 0 ether {port0_dst_mac} qinq 0 40 +p 6 route add 152.16.41.0 24 port 0 ether {port0_dst_mac} qinq 0 41 +p 6 route add 152.16.42.0 24 port 0 ether {port0_dst_mac} qinq 0 42 +p 6 route add 152.16.43.0 24 port 0 ether {port0_dst_mac} qinq 0 43 +p 6 route add 152.16.44.0 24 port 0 ether {port0_dst_mac} qinq 0 44 +p 6 route add 152.16.45.0 24 port 0 ether {port0_dst_mac} qinq 0 45 +p 6 route add 152.16.46.0 24 port 0 ether {port0_dst_mac} qinq 0 46 +p 6 route add 152.16.47.0 24 port 0 ether {port0_dst_mac} qinq 0 47 +p 6 route add 152.16.48.0 24 port 0 ether {port0_dst_mac} qinq 0 48 +p 6 route add 152.16.49.0 24 port 0 ether {port0_dst_mac} qinq 0 49 +p 6 route add 152.16.50.0 24 port 0 ether {port0_dst_mac} qinq 0 50 +p 6 route add 152.16.51.0 24 port 0 ether {port0_dst_mac} qinq 0 51 +p 6 route add 152.16.52.0 24 port 0 ether {port0_dst_mac} qinq 0 52 +p 6 route add 152.16.53.0 24 port 0 ether {port0_dst_mac} qinq 0 53 +p 6 route add 152.16.54.0 24 port 0 ether {port0_dst_mac} qinq 0 54 +p 6 route add 152.16.55.0 24 port 0 ether {port0_dst_mac} qinq 0 55 +p 6 route add 152.16.56.0 24 port 0 ether {port0_dst_mac} qinq 0 56 +p 6 route add 152.16.57.0 24 port 0 ether {port0_dst_mac} qinq 0 57 +p 6 route add 152.16.58.0 24 port 0 ether {port0_dst_mac} qinq 0 58 +p 6 route add 152.16.59.0 24 port 0 ether {port0_dst_mac} qinq 0 59 +p 6 route add 152.16.60.0 24 port 0 ether {port0_dst_mac} qinq 0 60 +p 6 route add 152.16.61.0 24 port 0 ether {port0_dst_mac} qinq 0 61 +p 6 route add 152.16.62.0 24 port 0 ether {port0_dst_mac} qinq 0 62 +p 6 route add 152.16.63.0 24 port 0 ether {port0_dst_mac} qinq 0 63 +p 6 route add 152.16.64.0 24 port 0 ether {port0_dst_mac} qinq 0 64 +p 6 route add 152.16.65.0 24 port 0 ether {port0_dst_mac} qinq 0 65 +p 6 route add 152.16.66.0 24 port 0 ether {port0_dst_mac} qinq 0 66 +p 6 route add 152.16.67.0 24 port 0 ether {port0_dst_mac} qinq 0 67 +p 6 route add 152.16.68.0 24 port 0 ether {port0_dst_mac} qinq 0 68 +p 6 route add 152.16.69.0 24 port 0 ether {port0_dst_mac} qinq 0 69 +p 6 route add 152.16.70.0 24 port 0 ether {port0_dst_mac} qinq 0 70 +p 6 route add 152.16.71.0 24 port 0 ether {port0_dst_mac} qinq 0 71 +p 6 route add 152.16.72.0 24 port 0 ether {port0_dst_mac} qinq 0 72 +p 6 route add 152.16.73.0 24 port 0 ether {port0_dst_mac} qinq 0 73 +p 6 route add 152.16.74.0 24 port 0 ether {port0_dst_mac} qinq 0 74 +p 6 route add 152.16.75.0 24 port 0 ether {port0_dst_mac} qinq 0 75 +p 6 route add 152.16.76.0 24 port 0 ether {port0_dst_mac} qinq 0 76 +p 6 route add 152.16.77.0 24 port 0 ether {port0_dst_mac} qinq 0 77 +p 6 route add 152.16.78.0 24 port 0 ether {port0_dst_mac} qinq 0 78 +p 6 route add 152.16.79.0 24 port 0 ether {port0_dst_mac} qinq 0 79 +p 6 route add 152.16.80.0 24 port 0 ether {port0_dst_mac} qinq 0 80 +p 6 route add 152.16.81.0 24 port 0 ether {port0_dst_mac} qinq 0 81 +p 6 route add 152.16.82.0 24 port 0 ether {port0_dst_mac} qinq 0 82 +p 6 route add 152.16.83.0 24 port 0 ether {port0_dst_mac} qinq 0 83 +p 6 route add 152.16.84.0 24 port 0 ether {port0_dst_mac} qinq 0 84 +p 6 route add 152.16.85.0 24 port 0 ether {port0_dst_mac} qinq 0 85 +p 6 route add 152.16.86.0 24 port 0 ether {port0_dst_mac} qinq 0 86 +p 6 route add 152.16.87.0 24 port 0 ether {port0_dst_mac} qinq 0 87 +p 6 route add 152.16.88.0 24 port 0 ether {port0_dst_mac} qinq 0 88 +p 6 route add 152.16.89.0 24 port 0 ether {port0_dst_mac} qinq 0 89 +p 6 route add 152.16.90.0 24 port 0 ether {port0_dst_mac} qinq 0 90 +p 6 route add 152.16.91.0 24 port 0 ether {port0_dst_mac} qinq 0 91 +p 6 route add 152.16.92.0 24 port 0 ether {port0_dst_mac} qinq 0 92 +p 6 route add 152.16.93.0 24 port 0 ether {port0_dst_mac} qinq 0 93 +p 6 route add 152.16.94.0 24 port 0 ether {port0_dst_mac} qinq 0 94 +p 6 route add 152.16.95.0 24 port 0 ether {port0_dst_mac} qinq 0 95 +p 6 route add 152.16.96.0 24 port 0 ether {port0_dst_mac} qinq 0 96 +p 6 route add 152.16.97.0 24 port 0 ether {port0_dst_mac} qinq 0 97 +p 6 route add 152.16.98.0 24 port 0 ether {port0_dst_mac} qinq 0 98 +p 6 route add 152.16.99.0 24 port 0 ether {port0_dst_mac} qinq 0 99 +p 6 route add 152.16.100.0 24 port 0 ether {port0_dst_mac} qinq 0 100 +p 6 route add 152.16.101.0 24 port 0 ether {port0_dst_mac} qinq 0 101 +p 6 route add 152.16.102.0 24 port 0 ether {port0_dst_mac} qinq 0 102 +p 6 route add 152.16.103.0 24 port 0 ether {port0_dst_mac} qinq 0 103 +p 6 route add 152.16.104.0 24 port 0 ether {port0_dst_mac} qinq 0 104 +p 6 route add 152.16.105.0 24 port 0 ether {port0_dst_mac} qinq 0 105 +p 6 route add 152.16.106.0 24 port 0 ether {port0_dst_mac} qinq 0 106 +p 6 route add 152.16.107.0 24 port 0 ether {port0_dst_mac} qinq 0 107 +p 6 route add 152.16.108.0 24 port 0 ether {port0_dst_mac} qinq 0 108 +p 6 route add 152.16.109.0 24 port 0 ether {port0_dst_mac} qinq 0 109 +p 6 route add 152.16.110.0 24 port 0 ether {port0_dst_mac} qinq 0 110 +p 6 route add 152.16.111.0 24 port 0 ether {port0_dst_mac} qinq 0 111 +p 6 route add 152.16.112.0 24 port 0 ether {port0_dst_mac} qinq 0 112 +p 6 route add 152.16.113.0 24 port 0 ether {port0_dst_mac} qinq 0 113 +p 6 route add 152.16.114.0 24 port 0 ether {port0_dst_mac} qinq 0 114 +p 6 route add 152.16.115.0 24 port 0 ether {port0_dst_mac} qinq 0 115 +p 6 route add 152.16.116.0 24 port 0 ether {port0_dst_mac} qinq 0 116 +p 6 route add 152.16.117.0 24 port 0 ether {port0_dst_mac} qinq 0 117 +p 6 route add 152.16.118.0 24 port 0 ether {port0_dst_mac} qinq 0 118 +p 6 route add 152.16.119.0 24 port 0 ether {port0_dst_mac} qinq 0 119 +p 6 route add 152.16.120.0 24 port 0 ether {port0_dst_mac} qinq 0 120 +p 6 route add 152.16.121.0 24 port 0 ether {port0_dst_mac} qinq 0 121 +p 6 route add 152.16.122.0 24 port 0 ether {port0_dst_mac} qinq 0 122 +p 6 route add 152.16.123.0 24 port 0 ether {port0_dst_mac} qinq 0 123 +p 6 route add 152.16.124.0 24 port 0 ether {port0_dst_mac} qinq 0 124 +p 6 route add 152.16.125.0 24 port 0 ether {port0_dst_mac} qinq 0 125 +p 6 route add 152.16.126.0 24 port 0 ether {port0_dst_mac} qinq 0 126 +p 6 route add 152.16.127.0 24 port 0 ether {port0_dst_mac} qinq 0 127 +p 6 route add 152.16.128.0 24 port 0 ether {port0_dst_mac} qinq 0 128 +p 6 route add 152.16.129.0 24 port 0 ether {port0_dst_mac} qinq 0 129 +p 6 route add 152.16.130.0 24 port 0 ether {port0_dst_mac} qinq 0 130 +p 6 route add 152.16.131.0 24 port 0 ether {port0_dst_mac} qinq 0 131 +p 6 route add 152.16.132.0 24 port 0 ether {port0_dst_mac} qinq 0 132 +p 6 route add 152.16.133.0 24 port 0 ether {port0_dst_mac} qinq 0 133 +p 6 route add 152.16.134.0 24 port 0 ether {port0_dst_mac} qinq 0 134 +p 6 route add 152.16.135.0 24 port 0 ether {port0_dst_mac} qinq 0 135 +p 6 route add 152.16.136.0 24 port 0 ether {port0_dst_mac} qinq 0 136 +p 6 route add 152.16.137.0 24 port 0 ether {port0_dst_mac} qinq 0 137 +p 6 route add 152.16.138.0 24 port 0 ether {port0_dst_mac} qinq 0 138 +p 6 route add 152.16.139.0 24 port 0 ether {port0_dst_mac} qinq 0 139 +p 6 route add 152.16.140.0 24 port 0 ether {port0_dst_mac} qinq 0 140 +p 6 route add 152.16.141.0 24 port 0 ether {port0_dst_mac} qinq 0 141 +p 6 route add 152.16.142.0 24 port 0 ether {port0_dst_mac} qinq 0 142 +p 6 route add 152.16.143.0 24 port 0 ether {port0_dst_mac} qinq 0 143 +p 6 route add 152.16.144.0 24 port 0 ether {port0_dst_mac} qinq 0 144 +p 6 route add 152.16.145.0 24 port 0 ether {port0_dst_mac} qinq 0 145 +p 6 route add 152.16.146.0 24 port 0 ether {port0_dst_mac} qinq 0 146 +p 6 route add 152.16.147.0 24 port 0 ether {port0_dst_mac} qinq 0 147 +p 6 route add 152.16.148.0 24 port 0 ether {port0_dst_mac} qinq 0 148 +p 6 route add 152.16.149.0 24 port 0 ether {port0_dst_mac} qinq 0 149 +p 6 route add 152.16.150.0 24 port 0 ether {port0_dst_mac} qinq 0 150 +p 6 route add 152.16.151.0 24 port 0 ether {port0_dst_mac} qinq 0 151 +p 6 route add 152.16.152.0 24 port 0 ether {port0_dst_mac} qinq 0 152 +p 6 route add 152.16.153.0 24 port 0 ether {port0_dst_mac} qinq 0 153 +p 6 route add 152.16.154.0 24 port 0 ether {port0_dst_mac} qinq 0 154 +p 6 route add 152.16.155.0 24 port 0 ether {port0_dst_mac} qinq 0 155 +p 6 route add 152.16.156.0 24 port 0 ether {port0_dst_mac} qinq 0 156 +p 6 route add 152.16.157.0 24 port 0 ether {port0_dst_mac} qinq 0 157 +p 6 route add 152.16.158.0 24 port 0 ether {port0_dst_mac} qinq 0 158 +p 6 route add 152.16.159.0 24 port 0 ether {port0_dst_mac} qinq 0 159 +p 6 route add 152.16.160.0 24 port 0 ether {port0_dst_mac} qinq 0 160 +p 6 route add 152.16.161.0 24 port 0 ether {port0_dst_mac} qinq 0 161 +p 6 route add 152.16.162.0 24 port 0 ether {port0_dst_mac} qinq 0 162 +p 6 route add 152.16.163.0 24 port 0 ether {port0_dst_mac} qinq 0 163 +p 6 route add 152.16.164.0 24 port 0 ether {port0_dst_mac} qinq 0 164 +p 6 route add 152.16.165.0 24 port 0 ether {port0_dst_mac} qinq 0 165 +p 6 route add 152.16.166.0 24 port 0 ether {port0_dst_mac} qinq 0 166 +p 6 route add 152.16.167.0 24 port 0 ether {port0_dst_mac} qinq 0 167 +p 6 route add 152.16.168.0 24 port 0 ether {port0_dst_mac} qinq 0 168 +p 6 route add 152.16.169.0 24 port 0 ether {port0_dst_mac} qinq 0 169 +p 6 route add 152.16.170.0 24 port 0 ether {port0_dst_mac} qinq 0 170 +p 6 route add 152.16.171.0 24 port 0 ether {port0_dst_mac} qinq 0 171 +p 6 route add 152.16.172.0 24 port 0 ether {port0_dst_mac} qinq 0 172 +p 6 route add 152.16.173.0 24 port 0 ether {port0_dst_mac} qinq 0 173 +p 6 route add 152.16.174.0 24 port 0 ether {port0_dst_mac} qinq 0 174 +p 6 route add 152.16.175.0 24 port 0 ether {port0_dst_mac} qinq 0 175 +p 6 route add 152.16.176.0 24 port 0 ether {port0_dst_mac} qinq 0 176 +p 6 route add 152.16.177.0 24 port 0 ether {port0_dst_mac} qinq 0 177 +p 6 route add 152.16.178.0 24 port 0 ether {port0_dst_mac} qinq 0 178 +p 6 route add 152.16.179.0 24 port 0 ether {port0_dst_mac} qinq 0 179 +p 6 route add 152.16.180.0 24 port 0 ether {port0_dst_mac} qinq 0 180 +p 6 route add 152.16.181.0 24 port 0 ether {port0_dst_mac} qinq 0 181 +p 6 route add 152.16.182.0 24 port 0 ether {port0_dst_mac} qinq 0 182 +p 6 route add 152.16.183.0 24 port 0 ether {port0_dst_mac} qinq 0 183 +p 6 route add 152.16.184.0 24 port 0 ether {port0_dst_mac} qinq 0 184 +p 6 route add 152.16.185.0 24 port 0 ether {port0_dst_mac} qinq 0 185 +p 6 route add 152.16.186.0 24 port 0 ether {port0_dst_mac} qinq 0 186 +p 6 route add 152.16.187.0 24 port 0 ether {port0_dst_mac} qinq 0 187 +p 6 route add 152.16.188.0 24 port 0 ether {port0_dst_mac} qinq 0 188 +p 6 route add 152.16.189.0 24 port 0 ether {port0_dst_mac} qinq 0 189 +p 6 route add 152.16.190.0 24 port 0 ether {port0_dst_mac} qinq 0 190 +p 6 route add 152.16.191.0 24 port 0 ether {port0_dst_mac} qinq 0 191 +p 6 route add 152.16.192.0 24 port 0 ether {port0_dst_mac} qinq 0 192 +p 6 route add 152.16.193.0 24 port 0 ether {port0_dst_mac} qinq 0 193 +p 6 route add 152.16.194.0 24 port 0 ether {port0_dst_mac} qinq 0 194 +p 6 route add 152.16.195.0 24 port 0 ether {port0_dst_mac} qinq 0 195 +p 6 route add 152.16.196.0 24 port 0 ether {port0_dst_mac} qinq 0 196 +p 6 route add 152.16.197.0 24 port 0 ether {port0_dst_mac} qinq 0 197 +p 6 route add 152.16.198.0 24 port 0 ether {port0_dst_mac} qinq 0 198 +p 6 route add 152.16.199.0 24 port 0 ether {port0_dst_mac} qinq 0 199 +p 6 route add 152.16.200.0 24 port 0 ether {port0_dst_mac} qinq 0 200 +p 6 route add 152.16.201.0 24 port 0 ether {port0_dst_mac} qinq 0 201 +p 6 route add 152.16.202.0 24 port 0 ether {port0_dst_mac} qinq 0 202 +p 6 route add 152.16.203.0 24 port 0 ether {port0_dst_mac} qinq 0 203 +p 6 route add 152.16.204.0 24 port 0 ether {port0_dst_mac} qinq 0 204 +p 6 route add 152.16.205.0 24 port 0 ether {port0_dst_mac} qinq 0 205 +p 6 route add 152.16.206.0 24 port 0 ether {port0_dst_mac} qinq 0 206 +p 6 route add 152.16.207.0 24 port 0 ether {port0_dst_mac} qinq 0 207 +p 6 route add 152.16.208.0 24 port 0 ether {port0_dst_mac} qinq 0 208 +p 6 route add 152.16.209.0 24 port 0 ether {port0_dst_mac} qinq 0 209 +p 6 route add 152.16.210.0 24 port 0 ether {port0_dst_mac} qinq 0 210 +p 6 route add 152.16.211.0 24 port 0 ether {port0_dst_mac} qinq 0 211 +p 6 route add 152.16.212.0 24 port 0 ether {port0_dst_mac} qinq 0 212 +p 6 route add 152.16.213.0 24 port 0 ether {port0_dst_mac} qinq 0 213 +p 6 route add 152.16.214.0 24 port 0 ether {port0_dst_mac} qinq 0 214 +p 6 route add 152.16.215.0 24 port 0 ether {port0_dst_mac} qinq 0 215 +p 6 route add 152.16.216.0 24 port 0 ether {port0_dst_mac} qinq 0 216 +p 6 route add 152.16.217.0 24 port 0 ether {port0_dst_mac} qinq 0 217 +p 6 route add 152.16.218.0 24 port 0 ether {port0_dst_mac} qinq 0 218 +p 6 route add 152.16.219.0 24 port 0 ether {port0_dst_mac} qinq 0 219 +p 6 route add 152.16.220.0 24 port 0 ether {port0_dst_mac} qinq 0 220 +p 6 route add 152.16.221.0 24 port 0 ether {port0_dst_mac} qinq 0 221 +p 6 route add 152.16.222.0 24 port 0 ether {port0_dst_mac} qinq 0 222 +p 6 route add 152.16.223.0 24 port 0 ether {port0_dst_mac} qinq 0 223 +p 6 route add 152.16.224.0 24 port 0 ether {port0_dst_mac} qinq 0 224 +p 6 route add 152.16.225.0 24 port 0 ether {port0_dst_mac} qinq 0 225 +p 6 route add 152.16.226.0 24 port 0 ether {port0_dst_mac} qinq 0 226 +p 6 route add 152.16.227.0 24 port 0 ether {port0_dst_mac} qinq 0 227 +p 6 route add 152.16.228.0 24 port 0 ether {port0_dst_mac} qinq 0 228 +p 6 route add 152.16.229.0 24 port 0 ether {port0_dst_mac} qinq 0 229 +p 6 route add 152.16.230.0 24 port 0 ether {port0_dst_mac} qinq 0 230 +p 6 route add 152.16.231.0 24 port 0 ether {port0_dst_mac} qinq 0 231 +p 6 route add 152.16.232.0 24 port 0 ether {port0_dst_mac} qinq 0 232 +p 6 route add 152.16.233.0 24 port 0 ether {port0_dst_mac} qinq 0 233 +p 6 route add 152.16.234.0 24 port 0 ether {port0_dst_mac} qinq 0 234 +p 6 route add 152.16.235.0 24 port 0 ether {port0_dst_mac} qinq 0 235 +p 6 route add 152.16.236.0 24 port 0 ether {port0_dst_mac} qinq 0 236 +p 6 route add 152.16.237.0 24 port 0 ether {port0_dst_mac} qinq 0 237 +p 6 route add 152.16.238.0 24 port 0 ether {port0_dst_mac} qinq 0 238 +p 6 route add 152.16.239.0 24 port 0 ether {port0_dst_mac} qinq 0 239 +p 6 route add 152.16.240.0 24 port 0 ether {port0_dst_mac} qinq 0 240 +p 6 route add 152.16.241.0 24 port 0 ether {port0_dst_mac} qinq 0 241 +p 6 route add 152.16.242.0 24 port 0 ether {port0_dst_mac} qinq 0 242 +p 6 route add 152.16.243.0 24 port 0 ether {port0_dst_mac} qinq 0 243 +p 6 route add 152.16.244.0 24 port 0 ether {port0_dst_mac} qinq 0 244 +p 6 route add 152.16.245.0 24 port 0 ether {port0_dst_mac} qinq 0 245 +p 6 route add 152.16.246.0 24 port 0 ether {port0_dst_mac} qinq 0 246 +p 6 route add 152.16.247.0 24 port 0 ether {port0_dst_mac} qinq 0 247 +p 6 route add 152.16.248.0 24 port 0 ether {port0_dst_mac} qinq 0 248 +p 6 route add 152.16.249.0 24 port 0 ether {port0_dst_mac} qinq 0 249 +p 6 route add 152.16.250.0 24 port 0 ether {port0_dst_mac} qinq 0 250 +p 6 route add 152.16.251.0 24 port 0 ether {port0_dst_mac} qinq 0 251 +p 6 route add 152.16.252.0 24 port 0 ether {port0_dst_mac} qinq 0 252 +p 6 route add 152.16.253.0 24 port 0 ether {port0_dst_mac} qinq 0 253 +p 6 route add 152.16.254.0 24 port 0 ether {port0_dst_mac} qinq 0 254 +p 6 route add 152.16.255.0 24 port 0 ether {port0_dst_mac} qinq 0 255 +p 6 route add default 1 diff --git a/samples/vnf_samples/nsut/vpe/vpe_vnf_topology.yaml b/samples/vnf_samples/nsut/vpe/vpe_vnf_topology.yaml new file mode 100644 index 000000000..0de4b6e79 --- /dev/null +++ b/samples/vnf_samples/nsut/vpe/vpe_vnf_topology.yaml @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +nsd:nsd-catalog: + nsd: + - id: VPE + name: VPE + short-name: VPE + description: scenario with VPE,L3fwd and VNF + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #tg_vpe_upstream.yaml #VPE VNF + - member-vnf-index: '2' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/vpe_vnf.yaml #tg_l3fwd.yaml #tg_trex_tpl.yaml #TREX + + vld: + - id: private + name: tg__1 to vnf__1 link 1 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 #TREX + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 #VNF + + - id: public + name: vnf__1 to tg__1 link 2 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 #L3fwd + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__1 #VPE VNF diff --git a/samples/vnf_samples/traffic_profiles/example.yaml b/samples/vnf_samples/traffic_profiles/example.yaml new file mode 100644 index 000000000..71371995e --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/example.yaml @@ -0,0 +1,198 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +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 : rfc2544 # defines traffic behavior - constant or look for highest possible throughput + frame_rate : 100 # pc of linerate + flow_number: {{ flow.number }} #This decides how many frames should be generated. Each frame should have a random of the field + # that specifies a range (e.g. ipv4 address, port) + +private: + - ipv4_1: + outer_l2: + framesize: + 64B: {{ get(imix_small, 12) }} + 128B: {{get(imix_128B, 12) }} + 256B: {{get(imix_256B, 12) }} + 373b: {{ get(imix_373B, 12) }} + 570B: {{get(imix_570B, 12) }} + 1400B: {{get(imix_1400B, 12) }} + 1518b: {{get(imix_1500B, 12) }} + srcmac: {{src_mac}} # xe0.local_mac + dstmac: {{dst_mac}} # xe0.dst_mac + QinQ: + S-VLAN: + id: {{ get(flow.s_vlan_range, "0") }} + priority: 0 + cfi: 0 + C-VLAN: + id: {{ get(flow.c_vlan_range, "0") }} + priority: 0 + cfi: 0 + mpls: + label: {{ get(flow.mpls_label, "0") }} + + outer_l3v4: + proto: {{ get(flow.outer_proto, "udp") }}, + srcip4: {{ get(flow.outer_srcip4, "1.1.1.1") }} + dstip4: {{ get(flow.outer_dstip4, "90.90.90.90") }} + ttl: 32 + dscp: {{ get(flow.tos, 0) }} + + outer_l4: + srcport: {{ get(flow.outer_srcport, "3002") }} + dstport: {{ get(flow.outer_dstport, "3001") }} + vni: {{ get(flow.vxlan_vni, "2345") }} #optional + inner_l2: #optional + srcmac: {{ get(flow.inner_srcmac, "00:00:00:00:00:00") }} + dstmac: {{ get(flow.inner_dstmac, "00:00:00:00:00:00") }} + + inner_l3v4: #optional + proto: {{ get(flow.inner_proto, "udp") }}, + srcip4: {{ get(flow.inner_srcip4, "1.1.1.1") }} + dstip4: {{ get(flow.inner_dstip4, "90.90.90.90") }} + ttl: 32 + dscp: {{ get(flow.inner_tos, 0) }} + + inner_l3v6: + proto: {{ get(flow.inner_proto, "udp") }}, + srcip6: {{ get(flow.inner_srcip6, "2001::1") }} + dstip6: {{ get(flow.outer_dstip6, "2001::11") }} + ttl: 32 + tc: {{ get(flow.inner_tos, 0) }} + + inner_l4: + srcport: {{ get(flow.inner_srcport, "3002") }} + dstport: {{ get(flow.inner_dstport, "3001") }} + + - ipv6_2: + outer_l2: + framesize: + 64B: {{ get(imix_small, 12) }} + 128B: {{get(imix_128B, 12) }} + 256B: {{get(imix_256B, 12) }} + 373b: {{ get(imix_373B, 12) }} + 570B: {{get(imix_570B, 12) }} + 1400B: {{get(imix_1400B, 12) }} + 1518b: {{get(imix_1500B, 12) }} + srcmac: {{src_mac}} # xe0.local_mac + dstmac: {{dst_mac}} # xe0.dst_mac + QinQ: + S-VLAN: + id: {{ get(flow.s_vlan_range, "0") }} + priority: 0 + cfi: 0 + C-VLAN: + id: {{ get(flow.c_vlan_range, "0") }} + priority: 0 + cfi: 0 + mpls: + label: {{ get(flow.mpls_label, "0") }} + + outer_l3v6: + proto: {{ get(flow.outer_proto, "udp") }}, + srcip6: {{ get(flow.outer_srcip6, "2001::1") }} + dstip6: {{ get(flow.outer_dstip6, "2001::11") }} + ttl: 32 + tc: {{ get(flow.outer_tos, 0) }} + + outer_l4: + srcport: {{ get(flow.outer_srcport, "3002") }} + dstport: {{ get(flow.outer_dstport, "3001") }} + vni: {{ get(flow.vxlan_vni, "2345") }} #optional + inner_l2: #optional + srcmac: {{ get(flow.inner_srcmac, "00:00:00:00:00:00") }} + dstmac: {{ get(flow.inner_dstmac, "00:00:00:00:00:00") }} + + inner_l3v4: #optional + proto: {{ get(flow.inner_proto, "udp") }}, + srcip4: {{ get(flow.inner_srcip4, "1.1.1.1") }} + dstip4: {{ get(flow.inner_dstip4, "90.90.90.90") }} + ttl: 32 + dscp: {{ get(flow.inner_tos, 0) }} + + inner_l3v6: + proto: {{ get(flow.inner_proto, "udp") }}, + srcip6: {{ get(flow.inner_srcip6, "2001::1") }} + dstip6: {{ get(flow.outer_dstip6, "2001::11") }} + ttl: 32 + tc: {{ get(flow.inner_tos, 0) }} + + inner_l4: + srcport: {{ get(flow.inner_srcport, "3002") }} + dstport: {{ get(flow.inner_dstport, "3001") }} + +public: + - ipv4_2: + outer_l2: + framesize: + 64B: {{ get(imix_small, 12) }} + 128B: {{get(imix_128B, 12) }} + 256B: {{get(imix_256B, 12) }} + 373b: {{ get(imix_373B, 12) }} + 570B: {{get(imix_570B, 12) }} + 1400B: {{get(imix_1400B, 12) }} + 1518b: {{get(imix_1500B, 12) }} + srcmac: {{get(private.ipv4_1.dst_mac}} # xe0.local_mac + dstmac: {{get)private.ipv4_1.src_mac}} # xe0.dst_mac + QinQ: + S-VLAN: + id: {{ get(flow.s_vlan_range, "0") }} + priority: 0 + cfi: 0 + C-VLAN: + id: {{ get(flow.c_vlan_range, "0") }} + priority: 0 + cfi: 0 + mpls: + label: {{ get(flow.mpls_label, "0") }} + + outer_l3v4: + proto: {{ get(flow.outer_proto, "udp") }}, + srcip4: {{ get(private.ipv4_1.outer_l3v4.dstip4) }} + dstip4: {{ get(private.ipv4_1.outer_l3v4.srcip4) }} + ttl: 32 + dscp: {{ get(flow.tos, 0) }} + + outer_l4: + srcport: {{ get(private.ipv4_1.outer_l4.dstport) }} + dstport: {{ get(private.ipv4_1.outer_l4.srcport) }} + vni: {{ get(flow.vxlan_vni, "2345") }} #optional + inner_l2: #optional + srcmac: {{ get(private.ipv4_1.outer_l4.inner_l2.dstmac) }} + dstmac: {{ get(private.ipv4_1.outer_l4.inner_l2.srcmac) }} + + inner_l3v4: #optional + proto: {{ get(flow.inner_proto, "udp") }}, + srcip4: {{ get(private.ipv4_1.inner_l3v4.dstip4) }} + dstip4: {{ get(private.ipv4_1.inner_l3v4.srcip4) }} + ttl: 32 + dscp: {{ get(flow.inner_tos, 0) }} + + inner_l3v6: + proto: {{ get(flow.inner_proto, "udp") }}, + srcip6: {{ get(private.ipv4_1.inner_l3v6.dstip6) }} + dstip6: {{ get(private.ipv4_1.inner_l3v6.srcip6) }} + ttl: 32 + tc: {{ get(flow.inner_tos, 0) }} + + inner_l4: + srcport: {{ get(private.ipv4_1.inner_l4.dstport) }} + dstport: {{ get(private.ipv4_1.inner_l4.srcport) }} diff --git a/samples/vnf_samples/traffic_profiles/fixed.yaml b/samples/vnf_samples/traffic_profiles/fixed.yaml new file mode 100644 index 000000000..afccd6fd4 --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/fixed.yaml @@ -0,0 +1,24 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +schema: "nsb:traffic_profile:0.1" + +name: fixed +description: Fixed traffic profile to run UDP traffic + +traffic_profile: + traffic_type: FixedProfile + frame_rate: 100 # pps + flow_number: 10 + frame_size: 64 diff --git a/samples/vnf_samples/traffic_profiles/imix_storage.yaml b/samples/vnf_samples/traffic_profiles/imix_storage.yaml new file mode 100644 index 000000000..8fd10ecbe --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/imix_storage.yaml @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#imix definition for storage traffic +# +# it is a typical case for testing the synthetic VNF performance. +# +#percentage of the packets can be less than 100% +#the traffic in downstream and upstream direction could be different + +schema: "nsb:imix:0.1" + +imix: + private: + imix_small: 0 #ipv4 case - 72B should be 0 ipv6 case - 84B + imix_128B: 0 + imix_256B: 0 + imix_373B: 0 + imix_570B: 0 + imix_1400B: 0 + imix_1500B: 100 + + public: + imix_small: 0 #ipv4 case - 72B ipv6 - 84B + imix_128B: 0 + imix_256B: 0 + imix_373B: 0 + imix_570B: 0 + imix_1400B: 0 + imix_1500B: 100 diff --git a/samples/vnf_samples/traffic_profiles/imix_video.yaml b/samples/vnf_samples/traffic_profiles/imix_video.yaml new file mode 100644 index 000000000..36324bfa4 --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/imix_video.yaml @@ -0,0 +1,43 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#imix definition for video traffic +# +# this is a real traffic profile when video/data traffic only is present +# +#percentage of the packets can be less than 100% +#the traffic in downstream and upstream direction could be different +# +#small means ipv4 case - 72B should be 0, ipv6 case - 84B + +schema: "nsb:imix:0.1" + +imix: + private: + imix_small: 5 #ipv4 case - 72B should be 0 ipv6 case - 84B + imix_128B: 11 + imix_256B: 16 + imix_373B: 10 + imix_570B: 35 + imix_1400B: 10 + imix_1500B: 13 + + public: + imix_small: 5 #ipv4 case - 72B ipv6 - 84B + imix_128B: 3 + imix_256B: 4 + imix_373B: 6 + imix_570B: 8 + imix_1400B: 36 + imix_1500B: 38 diff --git a/samples/vnf_samples/traffic_profiles/imix_voice.yaml b/samples/vnf_samples/traffic_profiles/imix_voice.yaml new file mode 100644 index 000000000..b8f8e5358 --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/imix_voice.yaml @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#imix definition for voice traffic +# +# it is a typical case for testing the synthetic VNF performance. +# +#percentage of the packets can be less than 100% +#the traffic in downstream and upstream direction could be different + +schema: "nsb:imix:0.1" + +imix: + private: + imix_small: 100 #ipv4 case - 72B should be 0 ipv6 case - 84B + imix_128B: 0 + imix_256B: 0 + imix_373B: 0 + imix_570B: 0 + imix_1400B: 0 + imix_1500B: 0 + + public: + imix_small: 100 #ipv4 case - 72B ipv6 - 84B + imix_128B: 0 + imix_256B: 0 + imix_373B: 0 + imix_570B: 0 + imix_1400B: 0 + imix_1500B: 0 diff --git a/samples/vnf_samples/traffic_profiles/ipv4_1flow_Packets_vpe.yaml b/samples/vnf_samples/traffic_profiles/ipv4_1flow_Packets_vpe.yaml new file mode 100644 index 000000000..f3046f463 --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/ipv4_1flow_Packets_vpe.yaml @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +flow: + srcip4_range: '152.16.0.20' + dstip4_range: '152.40.0.20' + count: 1 diff --git a/samples/vnf_samples/traffic_profiles/ipv4_throughput_vpe.yaml b/samples/vnf_samples/traffic_profiles/ipv4_throughput_vpe.yaml new file mode 100644 index 000000000..cfa166a74 --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/ipv4_throughput_vpe.yaml @@ -0,0 +1,101 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# flow definition for ACL tests - 1K flows - ipv4 only +# +# the number of flows defines the widest range of parameters +# for example if srcip_range=1.0.0.1-1.0.0.255 and dst_ip_range=10.0.0.1-10.0.1.255 +# and it should define only 16 flows +# +#there is assumption that packets generated will have a random sequences of following addresses pairs +# in the packets +# 1. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# 2. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# ... +# 512. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# +# not all combination should be filled +# Any other field with random range will be added to flow definition +# +# the example.yaml provides all possibilities for traffic generation +# +# the profile defines a public and private side to make limited traffic correlation +# between private and public side same way as it is made by IXIA solution. +# +schema: "isb: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 : RFC2544Profile # defines traffic behavior - constant or look for highest possible throughput + frame_rate : 100 # pc of linerate + # that specifies a range (e.g. ipv4 address, port) + + +private: + ipv4: + outer_l2: + framesize: + 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}" + 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}" + 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}" + 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}" + 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}" + 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}" + 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}" + + QinQ: + S-VLAN: + id: 128 + priority: 0 + cfi: 0 + C-VLAN: + id: 512 + priority: 0 + cfi: 0 + + outer_l3v4: + proto: "tcp" + srcip4: "{{get(flow, 'flow.srcip4_range', '192.168.0.0-192.168.255.255') }}" + dstip4: "{{get(flow, 'flow.dstip4_range', '192.16.0.0-192.16.0.31') }}" + ttl: 32 + dscp: 32 + + outer_l4: + srcport: "{{get(flow, 'flow.srcport_range', '0') }}" + dstport: "{{get(flow, 'flow.dstport_range', '0') }}" +public: + ipv4: + outer_l2: + framesize: + 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}" + 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}" + 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}" + 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}" + 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}" + 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}" + 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}" + + outer_l3v4: + proto: "tcp" + srcip4: "{{get(flow, 'flow.dstip4_range', '192.16.0.0-192.16.0.31') }}" + dstip4: "{{get(flow, 'flow.srcip4_range', '192.168.0.0-192.168.255.255') }}" + ttl: 32 + dscp: 32 + + outer_l4: + srcport: "{{get(flow, 'flow.dstport_range', '0') }}" + dstport: "{{get(flow, 'flow.srcport_range', '0') }}" diff --git a/samples/vnf_samples/vnf_descriptors/tg_ping_tpl.yaml b/samples/vnf_samples/vnf_descriptors/tg_ping_tpl.yaml new file mode 100644 index 000000000..6e8fcf77e --- /dev/null +++ b/samples/vnf_samples/vnf_descriptors/tg_ping_tpl.yaml @@ -0,0 +1,68 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +vnfd:vnfd-catalog: + vnfd: + - id: PingTrafficGen + name: pinggen + short-name: pinggen + description: Sample 1-port ping generator + vm-flavor: + vcpu-count: '4' + memory-mb: '4096' + mgmt-interface: + vdu-id: pinggen-baremetal + user: '{{user}}' # Value filled by vnfdgen + password: '{{password}}' # Value filled by vnfdgen + ip: '{{ip}}' # Value filled by vnfdgen + connection-point: + - name: xe0 + type: VPORT + - name: xe1 + type: VPORT + vdu: + - id: pinggen-baremetal + name: pinggen-baremetal + description: Sample 1-port ping generator + external-interface: + - name: xe0 + virtual-interface: + type: virtio + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen + local_iface_name: '{{ interfaces.xe0.local_iface_name }}' # Value filled by vnfdgen + driver: '{{ interfaces.xe0.driver}}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe0 + - name: xe1 + virtual-interface: + type: virtio + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen + local_iface_name: '{{ interfaces.xe1.local_iface_name }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen + driver: '{{ interfaces.xe1.driver}}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe0 + benchmark: + kpi: + - rtt + - packets_trasmitted diff --git a/samples/vnf_samples/vnf_descriptors/tg_rfc2544_tpl.yaml b/samples/vnf_samples/vnf_descriptors/tg_rfc2544_tpl.yaml new file mode 100644 index 000000000..97feae5ba --- /dev/null +++ b/samples/vnf_samples/vnf_descriptors/tg_rfc2544_tpl.yaml @@ -0,0 +1,69 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +vnfd:vnfd-catalog: + vnfd: + - id: TrexTrafficGenRFC # nsb class mapping + name: trexverifier + short-name: trexverifier + description: TRex stateless traffic verifier + mgmt-interface: + vdu-id: trexgen-baremetal + user: '{{user}}' # Value filled by vnfdgen + password: '{{password}}' # Value filled by vnfdgen + ip: '{{ip}}' # Value filled by vnfdgen + connection-point: + - name: xe0 + type: VPORT + - name: xe1 + type: VPORT + vdu: + - id: trexgen-baremetal + name: trexgen-baremetal + description: TRex stateless traffic verifier + external-interface: + - name: xe0 + virtual-interface: + type: PCI-PASSTHROUGH + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen + local_iface_name: '{{ interfaces.xe0.local_iface_name }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen + driver: '{{ interfaces.xe0.driver}}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe0 + - name: xe1 + virtual-interface: + type: PCI-PASSTHROUGH + vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen + local_iface_name: '{{ interfaces.xe1.local_iface_name }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen + driver: '{{ interfaces.xe1.driver}}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe1 + + benchmark: + kpi: + - rx_throughput_fps + - tx_throughput_fps + - tx_throughput_mbps + - rx_throughput_mbps + - in_packets + - out_packets diff --git a/samples/vnf_samples/vnf_descriptors/tg_trex_tpl.yaml b/samples/vnf_samples/vnf_descriptors/tg_trex_tpl.yaml new file mode 100644 index 000000000..b1641836b --- /dev/null +++ b/samples/vnf_samples/vnf_descriptors/tg_trex_tpl.yaml @@ -0,0 +1,75 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +vnfd:vnfd-catalog: + vnfd: + - id: TrexTrafficGen # NSPerf class mapping + name: trexgen + short-name: trexgen + description: TRex stateless traffic generator for tests + vm-flavor: + vcpu-count: '4' + memory-mb: '4096' + mgmt-interface: + vdu-id: trexgen-baremetal + user: '{{user}}' # Value filled by vnfdgen + password: '{{password}}' # Value filled by vnfdgen + ip: '{{ip}}' # Value filled by vnfdgen + connection-point: + - name: xe0 + type: VPORT + - name: xe1 + type: VPORT + vdu: + - id: trexgen-baremetal + name: trexgen-baremetal + description: TRex stateless traffic generator for tests + external-interface: + - name: xe0 + virtual-interface: + type: PCI-PASSTHROUGH + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen + driver: '{{ interfaces.xe0.driver}}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen + vld_id: '{{ interfaces.xe0.vld_id }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe0 + - name: xe1 + virtual-interface: + type: PCI-PASSTHROUGH + vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen + driver: '{{ interfaces.xe1.driver}}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen + vld_id: '{{ interfaces.xe1.vld_id }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe1 + + benchmark: + kpi: + - rx_throughput_fps + - tx_throughput_fps + - tx_throughput_mbps + - rx_throughput_mbps + - tx_throughput_pc_linerate + - rx_throughput_pc_linerate + - min_latency + - max_latency + - avg_latency diff --git a/samples/vnf_samples/vnf_descriptors/vpe_vnf.yaml b/samples/vnf_samples/vnf_descriptors/vpe_vnf.yaml new file mode 100644 index 000000000..75041c3ce --- /dev/null +++ b/samples/vnf_samples/vnf_descriptors/vpe_vnf.yaml @@ -0,0 +1,66 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +vnfd:vnfd-catalog: + vnfd: + - id: VpeApproxVnf + name: VpeVnfSshIntel + short-name: VpeVnf + description: vPe approximation using DPDK + mgmt-interface: + vdu-id: vpevnf-baremetal + user: '{{user}}' # Value filled by vnfdgen + password: '{{password}}' # Value filled by vnfdgen + ip: '{{ip}}' # Value filled by vnfdgen + host: '{{host}}' # Value filled by vnfdgen + connection-point: + - name: xe0 + type: VPORT + - name: xe1 + type: VPORT + vdu: + - id: vpevnf-baremetal + name: vpevnf-baremetal + description: vpe approximation using DPDK + external-interface: + - name: xe0 + virtual-interface: + type: PCI-PASSTHROUGH + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen + netmask: '{{ interfaces.xe0.netmask }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe0 + - name: xe1 + virtual-interface: + type: PCI-PASSTHROUGH + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen + netmask: '{{ interfaces.xe1.netmask }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe1 + routing_table: {{ routing_table }} + benchmark: + kpi: + - packets_in + - packets_fwd + - packets_dropped diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml index aa2980f69..ceec6cf5e 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml @@ -1,11 +1,11 @@ --- -# Yardstick TC001 config file -# Measure network throughput using pktgen -# Different amounts of flows are tested with, from 2 up to 1001000 -# All tests are run twice. First twice with the least amount of -#ports and further on. schema: "yardstick:task:0.1" +description: > + Yardstick TC001 config file; + Measure network throughput using pktgen; + Different amounts of flows are tested with, from 2 up to 1001000; + All tests are run twice. First twice with the least amount of ports and further on. scenarios: {% for num_ports in [1, 10, 50, 100, 500, 1000] %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc002.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc002.yaml index 3c7b988c0..6830dcd72 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc002.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc002.yaml @@ -1,7 +1,10 @@ --- -# measure network latency using ping schema: "yardstick:task:0.1" +description: > + Yardstick TC002 config file; + measure network latency using ping; + {% set image = image or "cirros-0.3.3" %} scenarios: {% for i in range(2) %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml index f5a2778e8..82e85dbd1 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml @@ -1,8 +1,10 @@ --- -# Yardstick TC005 config file -# Measure Storage IOPS, throughput and latency using fio schema: "yardstick:task:0.1" +description: > + Yardstick TC005 config file; + Measure Storage IOPS, throughput and latency using fio. + scenarios: {% for rw in ['read', 'write', 'randwrite', 'randread', 'rw'] %} {% for bs in ['4k', '64k', '1024k'] %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc006.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc006.yaml index 7221518ab..5dfb29b97 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc006.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc006.yaml @@ -1,5 +1,8 @@ --- + schema: "yardstick:task:0.1" +description: > + Yardstick TC006 config file. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc007.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc007.yaml index 6f99ea6f2..882b3cf9c 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc007.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc007.yaml @@ -1,8 +1,9 @@ --- -# Sample benchmark task config file -# vTC schema: "yardstick:task:0.1" +description: > + Sample benchmark task config file; + vTC. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml index a2f5f3adc..89986f7f1 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml @@ -1,15 +1,16 @@ --- -# Yardstick TC008 config file -# Measure network throughput and packet loss using Pktgen. -# Different amount of flows, from 2 up to 1001000, in combination -# with different packet sizes are run in each test. -# Each combination of packet size and flow amount is run 10 times. -# First 10 times with the smallest packet size, starting with the -# least amount of ports/flows, then next amount of ports with same -# packet size, and so on. The test sequence continues with the next -# packet size, with same ports/flows sequence as before. schema: "yardstick:task:0.1" +description: > + Yardstick TC008 config file; + Measure network throughput and packet loss using Pktgen; + Different amount of flows, from 2 up to 1001000, in combination + with different packet sizes are run in each test. + Each combination of packet size and flow amount is run 10 times. + First 10 times with the smallest packet size, starting with the + least amount of ports/flows, then next amount of ports with same + packet size, and so on. The test sequence continues with the next + packet size, with same ports/flows sequence as before. scenarios: {% for pkt_size in [64, 128, 256, 512, 1024, 1280, 1518] %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml index f9fa1b778..e18ca789d 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml @@ -1,12 +1,13 @@ --- -# Yardstick TC009 config file -# Measure network throughput and packet loss using pktgen. -# Different amounts of flows are tested with, from 2 up to 1001000. -# All tests are run 10 times each. First 10 times with the least -# amount of ports, then 10 times with the next amount of ports, -# and so on until all packet sizes have been run with. schema: "yardstick:task:0.1" +description: > + Yardstick TC009 config file; + Measure network throughput and packet loss using pktgen; + Different amounts of flows are tested with, from 2 up to 1001000; + All tests are run 10 times each. First 10 times with the least + amount of ports, then 10 times with the next amount of ports, + and so on until all packet sizes have been run with; scenarios: {% for num_ports in [1, 10, 50, 100, 500, 1000] %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml index 6c7f96799..ad344e58f 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml @@ -1,8 +1,9 @@ --- -# Yardstick TC010 config file -# measure memory read latency using lmbench schema: "yardstick:task:0.1" +description: > + Yardstick TC010 config file; + measure memory read latency using lmbench. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml index 4cd3119bb..5ff31ea9b 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml @@ -1,8 +1,9 @@ --- -# Yardstick TC011 config file -# Measure packet delay variation (jitter) using iperf3 schema: "yardstick:task:0.1" +description: > + Yardstick TC011 config file; + Measure packet delay variation (jitter) using iperf3. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml index ba246ff11..805f627c0 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml @@ -1,8 +1,9 @@ --- -# Yardstick TC012 config file -# Measure memory read and write bandwidth using lmbench schema: "yardstick:task:0.1" +description: > + Yardstick TC012 config file; + Measure memory read and write bandwidth using lmbench. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml index 1ac0f2961..fc1446206 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml @@ -1,8 +1,9 @@ --- -# Yardstick TC014 config file -# Measure Processing speed using unixbench schema: "yardstick:task:0.1" +description: > + Yardstick TC014 config file; + Measure Processing speed using unixbench. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc019.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc019.yaml index 2e5a4a56f..b49019633 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc019.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc019.yaml @@ -1,7 +1,8 @@ --- -# Sample test case for the HA of controller node Openstack service schema: "yardstick:task:0.1" +description: > + Sample test case for the HA of controller node Openstack service. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc020.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc020.yaml index cbdaf3970..3bcabaac6 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc020.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc020.yaml @@ -1,5 +1,8 @@ --- + schema: "yardstick:task:0.1" +description: > + Yardstick TC020 config file. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc021.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc021.yaml index 17249785a..263663ebe 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc021.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc021.yaml @@ -1,5 +1,8 @@ --- + schema: "yardstick:task:0.1" +description: > + Yardstick TC021 config file. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc025.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc025.yaml index b083f6f20..0bbc5b8a6 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc025.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc025.yaml @@ -1,7 +1,8 @@ --- -# Sample test case for the HA of OpenStack Controll Node abnormally shutdown schema: "yardstick:task:0.1" +description: > + Sample test case for the HA of OpenStack Controll Node abnormally shutdown. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc027.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc027.yaml index 5032f3de3..036b6e9fd 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc027.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc027.yaml @@ -1,8 +1,10 @@ --- -# Yardstick TC027 config file -# Measure IPV6 network latency using ping6 schema: "yardstick:task:0.1" +description: > + Yardstick TC027 config file; + Measure IPV6 network latency using ping6. + {% set openrc = openrc or "/opt/admin-openrc.sh" %} {% set external_network = external_network or "ext-net" %} {% set pod_info = pod_info or "etc/yardstick/nodes/compass_sclab_physical/pod.yaml" %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml index cd42098d2..0db490a15 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml @@ -1,15 +1,15 @@ --- -# Yardstick TC037 config file -# Measure network throughput and packet loss using pktgen. -# Different amounts of flows are tested with, from 2 up to 1001000. -# All tests are run 2 times each. First 2 times with the least -# amount of ports, then 2 times with the next amount of ports, -# and so on until all packet sizes have been run with. -# -# During the measurements system load and network latency are -# recorded/measured using ping and mpstat, respectively. schema: "yardstick:task:0.1" +description: > + Yardstick TC037 config file; + Measure network throughput and packet loss using pktgen; + Different amounts of flows are tested with, from 2 up to 1001000; + All tests are run 2 times each. First 2 times with the least + amount of ports, then 2 times with the next amount of ports, + and so on until all packet sizes have been run with; + During the measurements system load and network latency are + recorded/measured using ping and mpstat, respectively; scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml index c2e5b4028..e6ba0c1a4 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml @@ -1,15 +1,15 @@ --- -# Yardstick TC038 config file -# Measure network throughput and packet loss using pktgen. -# Different amounts of flows are tested with, from 2 up to 1001000. -# All tests are run 10 times each. First 10 times with the least -# amount of ports, then 10 times with the next amount of ports, -# and so on until all packet sizes have been run with. -# -# During the measurements system load and network latency are -# recorded/measured using ping and mpstat, respectively. schema: "yardstick:task:0.1" +description: > + Yardstick TC038 config file; + Measure network throughput and packet loss using pktgen; + Different amounts of flows are tested with, from 2 up to 1001000; + All tests are run 10 times each. First 10 times with the least + amount of ports, then 10 times with the next amount of ports, + and so on until all packet sizes have been run with; + During the measurements system load and network latency are + recorded/measured using ping and mpstat, respectively; scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc040.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc040.yaml index 0a6dee656..c6094678e 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc040.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc040.yaml @@ -1,8 +1,9 @@ --- -# Yardstick TC040 config file -# Running Parser Yang-to-Tosca module as a tool, validating output against expected outcome schema: "yardstick:task:0.1" +description: > + Yardstick TC040 config file; + Running Parser Yang-to-Tosca module as a tool, validating output against expected outcome. scenarios: diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc042.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc042.yaml index 158f5076e..c233acb2f 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc042.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc042.yaml @@ -1,8 +1,9 @@ --- -# Yardstick TC042 config file -# Measure network latency using testpmd and pktgen-dpdk schema: "yardstick:task:0.1" +description: > + Yardstick TC042 config file; + Measure network latency using testpmd and pktgen-dpdk. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml index d5754b966..2546b6209 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml @@ -1,8 +1,10 @@ --- -# Yardstick TC043 config file -# Measure latency between NFVI nodes using ping schema: "yardstick:task:0.1" +description: > + Yardstick TC043 config file; + Measure latency between NFVI nodes using ping. + {% set host = host or "node1.LF" %} {% set target = target or "node2.LF" %} {% set pod_info = pod_info or "etc/yardstick/nodes/compass_sclab_physical/pod.yaml" %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc045.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc045.yaml index 79ad61e86..196994544 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc045.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc045.yaml @@ -1,7 +1,8 @@ --- -# Test case for TC045 :Control node Openstack service down - neutron server schema: "yardstick:task:0.1" +description: > + Test case for TC045 :Control node Openstack service down - neutron server. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc046.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc046.yaml index 69cef40a8..1af561964 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc046.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc046.yaml @@ -1,7 +1,8 @@ --- -# Test case for TC046 :Control node Openstack service down - keystone schema: "yardstick:task:0.1" +description: > + Test case for TC046 :Control node Openstack service down - keystone. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc047.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc047.yaml index f6019f6d5..24c28f5de 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc047.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc047.yaml @@ -1,7 +1,8 @@ --- -# Test case for TC047 :Control node Openstack service down - glance api schema: "yardstick:task:0.1" +description: > + Test case for TC047 :Control node Openstack service down - glance api. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc048.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc048.yaml index 543db9780..190084db9 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc048.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc048.yaml @@ -1,7 +1,8 @@ --- -# Test case for TC048 :Control node Openstack service down - cinder api schema: "yardstick:task:0.1" +description: > + Test case for TC048 :Control node Openstack service down - cinder api. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc049.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc049.yaml index 759867d46..66c154117 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc049.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc049.yaml @@ -1,7 +1,8 @@ --- -# Test case for TC049 :Control node Openstack service down - swift proxy schema: "yardstick:task:0.1" +description: > + Test case for TC049 :Control node Openstack service down - swift proxy. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc050.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc050.yaml index 0b21f8861..a8cb920ea 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc050.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc050.yaml @@ -1,8 +1,10 @@ --- -# Test case for TC050 :OpenStack Controller Node Network High Availability -# This test case is written by new scenario-based HA testing framework schema: "yardstick:task:0.1" +description: > + Test case for TC050 :OpenStack Controller Node Network High Availability; + This test case is written by new scenario-based HA testing framework. + scenarios: - type: "GeneralHA" diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc051.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc051.yaml index 8e2e0c789..1115b35f6 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc051.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc051.yaml @@ -1,8 +1,10 @@ --- -# Test case for TC051 :OpenStack Controller Node CPU Overload High Availability -# This test case is written by new scenario-based HA testing framework schema: "yardstick:task:0.1" +description: > + Test case for TC051 :OpenStack Controller Node CPU Overload High Availability; + This test case is written by new scenario-based HA testing framework. + scenarios: - type: "GeneralHA" diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc052.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc052.yaml index 714306881..67619d3d0 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc052.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc052.yaml @@ -1,8 +1,10 @@ --- -# Test case for TC052 :OpenStack Controller Node Disk I/O Block High Availability -# This test case is written by new scenario-based HA testing framework schema: "yardstick:task:0.1" +description: > + Test case for TC052 :OpenStack Controller Node Disk I/O Block High Availability; + This test case is written by new scenario-based HA testing framework. + scenarios: - type: "GeneralHA" diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc053.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc053.yaml index 696ed3ba4..16a971124 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc053.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc053.yaml @@ -1,8 +1,10 @@ --- -# Test case for TC053 :Openstack Controller Load Balance Service High Availability -# This test case is written by new scenario-based HA testing framework schema: "yardstick:task:0.1" +description: > + Test case for TC053 :Openstack Controller Load Balance Service High Availability; + This test case is written by new scenario-based HA testing framework. + scenarios: - type: "GeneralHA" diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc054.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc054.yaml index 7d94e3de8..93948d3b1 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc054.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc054.yaml @@ -1,8 +1,10 @@ --- -# Test case for TC054 :OpenStack VIP Master Node abnormally shutdown High Availability -# This test case is written by new scenario-based HA testing framework schema: "yardstick:task:0.1" +description: > + Test case for TC054 :OpenStack VIP Master Node abnormally shutdown High Availability; + This test case is written by new scenario-based HA testing framework. + scenarios: - type: "GeneralHA" diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc055.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc055.yaml index 54fc965c6..405247f4e 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc055.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc055.yaml @@ -1,15 +1,16 @@ --- -# Yardstick TC055 config file -# Collect hardware specification from /proc/cpuinfo /proc/meminfo -# compute capacity and scale. - -# the results have -# number of CPUs, number of physical cores in a single CPU -# number of logical cores, total memory size -# cache size per CPU, total cache size -# HT (Hyper-Thread) support status, 1 for open, 0 for close schema: "yardstick:task:0.1" +description: > + Yardstick TC055 config file; + Collect hardware specification from /proc/cpuinfo /proc/meminfo; + compute capacity and scale. + the results have, + number of CPUs, number of physical cores in a single CPU; + number of logical cores, total memory size; + cache size per CPU, total cache size; + HT (Hyper-Thread) support status, 1 for open, 0 for close. + {% set host = host or "node5.yardstick-TC055" %} {% set pod_info = pod_info or "etc/yardstick/nodes/compass_sclab_virtual/pod.yaml" %} scenarios: diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc063.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc063.yaml index 981783765..f1eb3c63e 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc063.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc063.yaml @@ -1,8 +1,10 @@ --- -# Yardstick TC063 config file -# Measure disk size, block size and disk utilization using fdisk and iostat schema: "yardstick:task:0.1" +description: > + Yardstick TC063 config file; + Measure disk size, block size and disk utilization using fdisk and iostat. + {% set host = host or "node5.yardstick-TC063" %} {% set pod_info = pod_info or "etc/yardstick/nodes/compass_sclab_virtual/pod.yaml" %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml index dcc34d80d..a11337d4f 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml @@ -1,8 +1,9 @@ --- -# Yardstick TC069 config file -# Measure memory read and write bandwidth using ramspeed schema: "yardstick:task:0.1" +description: > + Yardstick TC069 config file; + Measure memory read and write bandwidth using ramspeed. scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml index 931587b5b..c4ad715ec 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml @@ -1,15 +1,15 @@ --- -# Yardstick TC070 config file -# Measure network throughput and packet loss using pktgen. -# Different amounts of flows are tested with, from 2 up to 1001000. -# All tests are run 2 times each. First 2 times with the least -# amount of ports, then 2 times with the next amount of ports, -# and so on until all packet sizes have been run with. -# -# During the measurements memory usage statistics and network latency are -# recorded/measured using free and ping, respectively. schema: "yardstick:task:0.1" +description: > + Yardstick TC070 config file; + Measure network throughput and packet loss using pktgen; + Different amounts of flows are tested with, from 2 up to 1001000; + All tests are run 2 times each. First 2 times with the least + amount of ports, then 2 times with the next amount of ports, + and so on until all packet sizes have been run with; + During the measurements memory usage statistics and network latency are + recorded/measured using free and ping, respectively; scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml index 6f006eeaf..59bfc24bd 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml @@ -1,15 +1,15 @@ --- -# Yardstick TC071 config file -# Measure cache hit/miss ratio and usage, network throughput and latency. -# Different amounts of flows are tested with, from 2 up to 1001000. -# All tests are run 2 times each. First 2 times with the least -# amount of ports, then 2 times with the next amount of ports, -# and so on until all packet sizes have been run with. -# -# During the measurements cache hit/miss ration, cache usage statistics and -# network latency are recorded/measured using cachestat and ping, respectively. schema: "yardstick:task:0.1" +description: > + Yardstick TC071 config file; + Measure cache hit/miss ratio and usage, network throughput and latency; + Different amounts of flows are tested with, from 2 up to 1001000; + All tests are run 2 times each. First 2 times with the least + amount of ports, then 2 times with the next amount of ports, + and so on until all packet sizes have been run with; + During the measurements cache hit/miss ration, cache usage statistics and + network latency are recorded/measured using cachestat and ping, respectively; scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml index e1fa33173..10db287cf 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml @@ -1,15 +1,15 @@ --- -# Yardstick TC072 config file -# Measure network throughput and packet loss using pktgen. -# Different amounts of flows are tested with, from 2 up to 1001000. -# All tests are run 2 times each. First 2 times with the least -# amount of ports, then 2 times with the next amount of ports, -# and so on until all packet sizes have been run with. -# -# During the measurements network usage statistics and network latency are -# recorded/measured using sar and ping, respectively. schema: "yardstick:task:0.1" +description: > + Yardstick TC072 config file; + Measure network throughput and packet loss using pktgen; + Different amounts of flows are tested with, from 2 up to 1001000; + All tests are run 2 times each. First 2 times with the least + amount of ports, then 2 times with the next amount of ports, + and so on until all packet sizes have been run with; + During the measurements network usage statistics and network latency are + recorded/measured using sar and ping, respectively; scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc073.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc073.yaml index fd95b8c9d..99a0ffe81 100755 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc073.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc073.yaml @@ -1,13 +1,15 @@ --- -# Yardstick TC073 config file -# measure network latency and throughput using netperf -# There are two sample scenarios: bulk test and request/response test -# In bulk test, UDP_STREAM and TCP_STREAM can be used -# send_msg_size and recv_msg_size are options of bulk test -# In req/rsp test, TCP_RR TCP_CRR UDP_RR can be used -# req_rsp_size is option of req/rsp test schema: "yardstick:task:0.1" +description: > + Yardstick TC073 config file; + measure network latency and throughput using netperf; + There are two sample scenarios: bulk test and request/response test; + In bulk test, UDP_STREAM and TCP_STREAM can be used; + send_msg_size and recv_msg_size are options of bulk test; + In req/rsp test, TCP_RR TCP_CRR UDP_RR can be used; + req_rsp_size is option of req/rsp test; + {% set host = host or "node1.LF" %} {% set target = target or "node2.LF" %} {% set pod_info = pod_info or "etc/yardstick/nodes/compass_sclab_physical/pod.yaml" %} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc074.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc074.yaml index 6dda2d436..3fb3a05be 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc074.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc074.yaml @@ -1,8 +1,10 @@ --- -# Test case for TC074 StorPerf benchmark task config file -# StorPerf is a tool to measure block and object storage performance in an NFVI schema: "yardstick:task:0.1" +description: > + Test case for TC074 StorPerf benchmark task config file; + StorPerf is a tool to measure block and object storage performance in an NFVI. + {% set public_network = public_network or "ext-net" %} {% set StorPerf_ip = StorPerf_ip or "192.168.200.1" %} scenarios: diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc075.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc075.yaml index fb5a12e8a..1c1a7e4cd 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc075.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc075.yaml @@ -1,9 +1,11 @@ --- -# Yardstick TC075 config file -# Measure network capacity and scale. -# Measure number of connections, number of frames received schema: "yardstick:task:0.1" +description: > + Yardstick TC075 config file; + Measure network capacity and scale. + Measure number of connections, number of frames received; + {% set host = host or "node1.LF" %} {% set pod_info = pod_info or "etc/yardstick/nodes/compass_sclab_virtual/pod.yaml" %} diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk-ha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk-ha_daily.yaml new file mode 100644 index 000000000..705ccaaa8 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk-ha_daily.yaml @@ -0,0 +1,54 @@ +--- +# os-nosdn-kvm_ovs_dpdk-ha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-kvm_ovs_dpdk-ha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml +- + file_name: opnfv_yardstick_tc075.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node1.LF"}' diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk-noha_daily.yaml new file mode 100644 index 000000000..c60ce56c8 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk-noha_daily.yaml @@ -0,0 +1,46 @@ +--- +# os-nosdn-kvm_ovs_dpdk-noha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-kvm_ovs_dpdk-noha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-ha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-ha_daily.yaml new file mode 100644 index 000000000..eb3f95eff --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-ha_daily.yaml @@ -0,0 +1,54 @@ +--- +# os-nosdn-kvm_ovs_dpdk_bar-ha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-kvm_ovs_dpdk_bar-ha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml +- + file_name: opnfv_yardstick_tc075.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node1.LF"}' diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-noha_daily.yaml new file mode 100644 index 000000000..8d7ac7b01 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-kvm_ovs_dpdk_bar-noha_daily.yaml @@ -0,0 +1,46 @@ +--- +# os-nosdn-kvm_ovs_dpdk_bar-noha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-kvm_ovs_dpdk_bar-noha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"pod_info": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml diff --git a/tests/unit/apiserver/__init__.py b/tests/unit/apiserver/__init__.py new file mode 100644 index 000000000..021415296 --- /dev/null +++ b/tests/unit/apiserver/__init__.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import + +import os +import unittest +import tempfile + +from oslo_serialization import jsonutils + +from yardstick.common import constants as consts + + +class APITestCase(unittest.TestCase): + + def setUp(self): + self.db_fd, self.db_path = tempfile.mkstemp() + consts.SQLITE = 'sqlite:///{}'.format(self.db_path) + from api import server + + server.app.config['TESTING'] = True + self.app = server.app.test_client() + + server.init_db() + + def tearDown(self): + os.close(self.db_fd) + os.unlink(self.db_path) + + def _post(self, url, data): + headers = {'Content-Type': 'application/json'} + resp = self.app.post(url, data=jsonutils.dumps(data), headers=headers) + return jsonutils.loads(resp.data) + + def _get(self, url): + resp = self.app.get(url) + return jsonutils.loads(resp.data) diff --git a/tests/unit/apiserver/resources/__init__.py b/tests/unit/apiserver/resources/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/unit/apiserver/resources/__init__.py diff --git a/tests/unit/apiserver/resources/test_env_action.py b/tests/unit/apiserver/resources/test_env_action.py new file mode 100644 index 000000000..0411a66c4 --- /dev/null +++ b/tests/unit/apiserver/resources/test_env_action.py @@ -0,0 +1,32 @@ +from __future__ import absolute_import + +import time +import unittest + +from tests.unit.apiserver import APITestCase + + +class EnvTestCase(APITestCase): + + def test_create_grafana(self): + url = 'yardstick/env/action' + data = {'action': 'createGrafanaContainer'} + resp = self._post(url, data) + + time.sleep(1) + + task_id = resp['result']['task_id'] + url = '/yardstick/asynctask?task_id={}'.format(task_id) + resp = self._get(url) + + time.sleep(2) + + self.assertTrue(u'status' in resp) + + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/tests/unit/api/utils/test_common.py b/tests/unit/apiserver/utils/test_common.py index acf6e41b1..acf6e41b1 100644 --- a/tests/unit/api/utils/test_common.py +++ b/tests/unit/apiserver/utils/test_common.py diff --git a/tests/unit/api/utils/test_influx.py b/tests/unit/apiserver/utils/test_influx.py index aff0cab5c..aff0cab5c 100644 --- a/tests/unit/api/utils/test_influx.py +++ b/tests/unit/apiserver/utils/test_influx.py diff --git a/tests/unit/benchmark/contexts/standalone_duplicate_sample.yaml b/tests/unit/benchmark/contexts/standalone_duplicate_sample.yaml new file mode 100644 index 000000000..e468d0465 --- /dev/null +++ b/tests/unit/benchmark/contexts/standalone_duplicate_sample.yaml @@ -0,0 +1,135 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +# Sample config file about the POD information, including the +# name/IP/user/ssh key of Bare Metal and Controllers/Computes +# +# The options of this config file include: +# name: the name of this node +# role: node's role, support role: Master/Controller/Comupte/BareMetal +# ip: the node's IP address +# user: the username for login +# key_filename:the path of the private key file for login + +nodes: +- + name: node1 + role: TrafficGen + ip: 1.1.1.1 + user: root + password: r00t + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:05:00.0" + driver: i40e + dpdk_port_num: 0 + local_ip: "152.16.100.20" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:01" + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:05:00.1" + driver: i40e + dpdk_port_num: 1 + local_ip: "152.16.100.21" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:02" +- + name: node2 + role: nfvi_node + class: OvsDpdk + ip: 1.1.1.2 + user: root + password: r00t + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure sriov + - "0000:05:00.0" + - "0000:05:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu.qcow2" +- + name: node2 + role: nfvi_node + class: OvsDpdk + ip: 1.1.1.5 + user: root + password: r00t + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure sriov + - "0000:05:00.0" + - "0000:05:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu.qcow2" + +- + name: node3 + role: vnf + ip: 1.1.1.3 + user: root + password: r00t + host: 1.1.1.1 + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:04.0" + driver: virtio-pci + dpdk_port_num: 0 + local_ip: "152.16.100.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:05" + + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:05.0" + driver: virtio-pci + dpdk_port_num: 1 + local_ip: "152.16.40.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:06" + routing_table: + - network: "152.16.100.20" + netmask: "255.255.255.0" + gateway: "152.16.100.20" + if: "xe0" + - network: "152.16.40.20" + netmask: "255.255.255.0" + gateway: "152.16.40.20" + if: "xe1" + nd_route_tbl: + - network: "0064:ff9b:0:0:0:0:9810:6414" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:6414" + if: "xe0" + - network: "0064:ff9b:0:0:0:0:9810:2814" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:2814" + if: "xe1" diff --git a/tests/unit/benchmark/contexts/standalone_sample.yaml b/tests/unit/benchmark/contexts/standalone_sample.yaml new file mode 100644 index 000000000..95e12d62f --- /dev/null +++ b/tests/unit/benchmark/contexts/standalone_sample.yaml @@ -0,0 +1,112 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +# Sample config file about the POD information, including the +# name/IP/user/ssh key of Bare Metal and Controllers/Computes +# +# The options of this config file include: +# name: the name of this node +# role: node's role, support role: Master/Controller/Comupte/BareMetal +# ip: the node's IP address +# user: the username for login +# key_filename:the path of the private key file for login + +nodes: +- + name: node1 + role: TrafficGen + ip: 1.1.1.1 + user: root + password: r00t + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:05:00.0" + driver: i40e + dpdk_port_num: 0 + local_ip: "152.16.100.20" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:01" + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:05:00.1" + driver: i40e + dpdk_port_num: 1 + local_ip: "152.16.100.21" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:02" +- + name: node2 + role: nfvi_node + class: OvsDpdk + ip: 1.1.1.2 + user: root + password: r00t + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure sriov + - "0000:05:00.0" + - "0000:05:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu.qcow2" + +- + name: node3 + role: vnf + ip: 1.1.1.3 + user: root + password: r00t + host: 1.1.1.1 + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:04.0" + driver: virtio-pci + dpdk_port_num: 0 + local_ip: "152.16.100.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:05" + + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:05.0" + driver: virtio-pci + dpdk_port_num: 1 + local_ip: "152.16.40.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:06" + routing_table: + - network: "152.16.100.20" + netmask: "255.255.255.0" + gateway: "152.16.100.20" + if: "xe0" + - network: "152.16.40.20" + netmask: "255.255.255.0" + gateway: "152.16.40.20" + if: "xe1" + nd_route_tbl: + - network: "0064:ff9b:0:0:0:0:9810:6414" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:6414" + if: "xe0" + - network: "0064:ff9b:0:0:0:0:9810:2814" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:2814" + if: "xe1" diff --git a/tests/unit/benchmark/contexts/test_node.py b/tests/unit/benchmark/contexts/test_node.py index de5ba7066..64fe4a566 100644 --- a/tests/unit/benchmark/contexts/test_node.py +++ b/tests/unit/benchmark/contexts/test_node.py @@ -42,7 +42,7 @@ class NodeContextTestCase(unittest.TestCase): 'file': self._get_file_abspath("error_file") } - self.assertRaises(SystemExit, self.test_context.init, attrs) + self.assertRaises(IOError, self.test_context.init, attrs) def test_successful_init(self): @@ -100,7 +100,7 @@ class NodeContextTestCase(unittest.TestCase): attr_name = 'node1.foo' - self.assertRaises(SystemExit, self.test_context._get_server, attr_name) + self.assertRaises(ValueError, self.test_context._get_server, attr_name) def test__get_server_found(self): diff --git a/tests/unit/benchmark/contexts/test_standalone.py b/tests/unit/benchmark/contexts/test_standalone.py new file mode 100644 index 000000000..687ef7305 --- /dev/null +++ b/tests/unit/benchmark/contexts/test_standalone.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Unittest for yardstick.benchmark.contexts.standalone + +from __future__ import absolute_import +import os +import unittest + +from yardstick.benchmark.contexts import standalone + + +class StandaloneContextTestCase(unittest.TestCase): + + NODES_SAMPLE = "standalone_sample.yaml" + NODES_DUPLICATE_SAMPLE = "standalone_duplicate_sample.yaml" + + def setUp(self): + self.test_context = standalone.StandaloneContext() + + def test_construct(self): + + self.assertIsNone(self.test_context.name) + self.assertIsNone(self.test_context.file_path) + self.assertEqual(self.test_context.nodes, []) + self.assertEqual(self.test_context.nfvi_node, []) + + def test_unsuccessful_init(self): + + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath("error_file") + } + + self.assertRaises(IOError, self.test_context.init, attrs) + + def test_successful_init(self): + + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE) + } + + self.test_context.init(attrs) + + self.assertEqual(self.test_context.name, "foo") + self.assertEqual(len(self.test_context.nodes), 3) + self.assertEqual(len(self.test_context.nfvi_node), 1) + self.assertEqual(self.test_context.nfvi_node[0]["name"], "node2") + + def test__get_server_with_dic_attr_name(self): + + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE) + } + + self.test_context.init(attrs) + + attr_name = {'name': 'foo.bar'} + result = self.test_context._get_server(attr_name) + + self.assertEqual(result, None) + + def test__get_server_not_found(self): + + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE) + } + + self.test_context.init(attrs) + + attr_name = 'bar.foo' + result = self.test_context._get_server(attr_name) + + self.assertEqual(result, None) + + def test__get_server_duplicate(self): + + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_DUPLICATE_SAMPLE) + } + + self.test_context.init(attrs) + + attr_name = 'node2.foo' + + self.assertRaises(ValueError, self.test_context._get_server, attr_name) + + def test__get_server_found(self): + + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE) + } + + self.test_context.init(attrs) + + attr_name = 'node1.foo' + result = self.test_context._get_server(attr_name) + + self.assertEqual(result['ip'], '1.1.1.1') + self.assertEqual(result['name'], 'node1.foo') + self.assertEqual(result['user'], 'root') + + def test_deploy(self): + self.assertIsNone(self.test_context.deploy()) + + def test_undeploy(self): + self.assertIsNone(self.test_context.undeploy()) + + def _get_file_abspath(self, filename): + curr_path = os.path.dirname(os.path.abspath(__file__)) + file_path = os.path.join(curr_path, filename) + return file_path diff --git a/tests/unit/benchmark/core/test_task.py b/tests/unit/benchmark/core/test_task.py index 5dd32ea17..c56e21047 100644 --- a/tests/unit/benchmark/core/test_task.py +++ b/tests/unit/benchmark/core/test_task.py @@ -24,6 +24,7 @@ except ImportError: from yardstick.benchmark.core import task +from yardstick.common import constants as consts class TaskTestCase(unittest.TestCase): @@ -92,10 +93,10 @@ class TaskTestCase(unittest.TestCase): task_files, task_args, task_args_fnames = t.parse_suite() print("files=%s, args=%s, fnames=%s" % (task_files, task_args, task_args_fnames)) - self.assertEqual(task_files[0], - 'tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml') - self.assertEqual(task_files[1], - 'tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml') + self.assertEqual(task_files[0], self.change_to_abspath( + 'tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml')) + self.assertEqual(task_files[1], self.change_to_abspath( + 'tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml')) self.assertEqual(task_args[0], None) self.assertEqual(task_args[1], None) self.assertEqual(task_args_fnames[0], None) @@ -109,10 +110,10 @@ class TaskTestCase(unittest.TestCase): task_files, task_args, task_args_fnames = t.parse_suite() print("files=%s, args=%s, fnames=%s" % (task_files, task_args, task_args_fnames)) - self.assertEqual(task_files[0], - 'tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml') - self.assertEqual(task_files[1], - 'tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml') + self.assertEqual(task_files[0], self.change_to_abspath( + 'tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml')) + self.assertEqual(task_files[1], self.change_to_abspath( + 'tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml')) self.assertEqual(task_args[0], None) self.assertEqual(task_args[1], '{"host": "node1.LF","target": "node2.LF"}') @@ -127,10 +128,10 @@ class TaskTestCase(unittest.TestCase): task_files, task_args, task_args_fnames = t.parse_suite() print("files=%s, args=%s, fnames=%s" % (task_files, task_args, task_args_fnames)) - self.assertEqual(task_files[0], - 'tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml') - self.assertEqual(task_files[1], - 'tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml') + self.assertEqual(task_files[0], self.change_to_abspath( + 'tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml')) + self.assertEqual(task_files[1], self.change_to_abspath( + 'tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml')) self.assertEqual(task_args[0], None) self.assertEqual(task_args[1], None) self.assertEqual(task_args_fnames[0], None) @@ -144,10 +145,10 @@ class TaskTestCase(unittest.TestCase): task_files, task_args, task_args_fnames = t.parse_suite() print("files=%s, args=%s, fnames=%s" % (task_files, task_args, task_args_fnames)) - self.assertEqual(task_files[0], - 'tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml') - self.assertEqual(task_files[1], - 'tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml') + self.assertEqual(task_files[0], self.change_to_abspath( + 'tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml')) + self.assertEqual(task_files[1], self.change_to_abspath( + 'tests/opnfv/test_cases/opnfv_yardstick_tc043.yaml')) self.assertEqual(task_args[0], None) self.assertEqual(task_args[1], '{"host": "node1.LF","target": "node2.LF"}') @@ -159,6 +160,9 @@ class TaskTestCase(unittest.TestCase): file_path = os.path.join(curr_path, filename) return file_path + def change_to_abspath(self, filepath): + return os.path.join(consts.YARDSTICK_ROOT_PATH, filepath) + def main(): unittest.main() diff --git a/tests/unit/benchmark/core/test_testcase.py b/tests/unit/benchmark/core/test_testcase.py index c7da2de7c..1f5aad75e 100644 --- a/tests/unit/benchmark/core/test_testcase.py +++ b/tests/unit/benchmark/core/test_testcase.py @@ -28,13 +28,13 @@ class TestcaseUT(unittest.TestCase): def test_list_all(self): t = testcase.Testcase() result = t.list_all("") - self.assertEqual(result, True) + self.assertIsInstance(result, list) def test_show(self): t = testcase.Testcase() casename = Arg() result = t.show(casename) - self.assertEqual(result, True) + self.assertTrue(result) def main(): diff --git a/tests/unit/benchmark/scenarios/networking/imix_voice.yaml b/tests/unit/benchmark/scenarios/networking/imix_voice.yaml new file mode 100644 index 000000000..b8f8e5358 --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/imix_voice.yaml @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#imix definition for voice traffic +# +# it is a typical case for testing the synthetic VNF performance. +# +#percentage of the packets can be less than 100% +#the traffic in downstream and upstream direction could be different + +schema: "nsb:imix:0.1" + +imix: + private: + imix_small: 100 #ipv4 case - 72B should be 0 ipv6 case - 84B + imix_128B: 0 + imix_256B: 0 + imix_373B: 0 + imix_570B: 0 + imix_1400B: 0 + imix_1500B: 0 + + public: + imix_small: 100 #ipv4 case - 72B ipv6 - 84B + imix_128B: 0 + imix_256B: 0 + imix_373B: 0 + imix_570B: 0 + imix_1400B: 0 + imix_1500B: 0 diff --git a/tests/unit/benchmark/scenarios/networking/ipv4_1flow_Packets_vpe.yaml b/tests/unit/benchmark/scenarios/networking/ipv4_1flow_Packets_vpe.yaml new file mode 100644 index 000000000..f3046f463 --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/ipv4_1flow_Packets_vpe.yaml @@ -0,0 +1,18 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +flow: + srcip4_range: '152.16.0.20' + dstip4_range: '152.40.0.20' + count: 1 diff --git a/tests/unit/benchmark/scenarios/networking/ipv4_throughput_vpe.yaml b/tests/unit/benchmark/scenarios/networking/ipv4_throughput_vpe.yaml new file mode 100644 index 000000000..cfa166a74 --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/ipv4_throughput_vpe.yaml @@ -0,0 +1,101 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# flow definition for ACL tests - 1K flows - ipv4 only +# +# the number of flows defines the widest range of parameters +# for example if srcip_range=1.0.0.1-1.0.0.255 and dst_ip_range=10.0.0.1-10.0.1.255 +# and it should define only 16 flows +# +#there is assumption that packets generated will have a random sequences of following addresses pairs +# in the packets +# 1. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# 2. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# ... +# 512. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512) +# +# not all combination should be filled +# Any other field with random range will be added to flow definition +# +# the example.yaml provides all possibilities for traffic generation +# +# the profile defines a public and private side to make limited traffic correlation +# between private and public side same way as it is made by IXIA solution. +# +schema: "isb: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 : RFC2544Profile # defines traffic behavior - constant or look for highest possible throughput + frame_rate : 100 # pc of linerate + # that specifies a range (e.g. ipv4 address, port) + + +private: + ipv4: + outer_l2: + framesize: + 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}" + 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}" + 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}" + 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}" + 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}" + 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}" + 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}" + + QinQ: + S-VLAN: + id: 128 + priority: 0 + cfi: 0 + C-VLAN: + id: 512 + priority: 0 + cfi: 0 + + outer_l3v4: + proto: "tcp" + srcip4: "{{get(flow, 'flow.srcip4_range', '192.168.0.0-192.168.255.255') }}" + dstip4: "{{get(flow, 'flow.dstip4_range', '192.16.0.0-192.16.0.31') }}" + ttl: 32 + dscp: 32 + + outer_l4: + srcport: "{{get(flow, 'flow.srcport_range', '0') }}" + dstport: "{{get(flow, 'flow.dstport_range', '0') }}" +public: + ipv4: + outer_l2: + framesize: + 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}" + 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}" + 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}" + 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}" + 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}" + 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}" + 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}" + + outer_l3v4: + proto: "tcp" + srcip4: "{{get(flow, 'flow.dstip4_range', '192.16.0.0-192.16.0.31') }}" + dstip4: "{{get(flow, 'flow.srcip4_range', '192.168.0.0-192.168.255.255') }}" + ttl: 32 + dscp: 32 + + outer_l4: + srcport: "{{get(flow, 'flow.dstport_range', '0') }}" + dstport: "{{get(flow, 'flow.srcport_range', '0') }}" diff --git a/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py b/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py new file mode 100644 index 000000000..1b02b6eff --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py @@ -0,0 +1,490 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Unittest for yardstick.benchmark.scenarios.networking.test_vnf_generic + +from __future__ import absolute_import + +import os +import unittest + +import mock + +from yardstick.benchmark.scenarios.networking.vnf_generic import \ + SshManager, NetworkServiceTestCase, IncorrectConfig, IncorrectSetup +from yardstick.network_services.collector.subscriber import Collector +from yardstick.network_services.vnf_generic.vnf.base import \ + GenericTrafficGen, GenericVNF + +STL_MOCKS = { + 'stl': mock.MagicMock(), + 'stl.trex_stl_lib': mock.MagicMock(), + 'stl.trex_stl_lib.base64': mock.MagicMock(), + 'stl.trex_stl_lib.binascii': mock.MagicMock(), + 'stl.trex_stl_lib.collections': mock.MagicMock(), + 'stl.trex_stl_lib.copy': mock.MagicMock(), + 'stl.trex_stl_lib.datetime': mock.MagicMock(), + 'stl.trex_stl_lib.functools': mock.MagicMock(), + 'stl.trex_stl_lib.imp': mock.MagicMock(), + 'stl.trex_stl_lib.inspect': mock.MagicMock(), + 'stl.trex_stl_lib.json': mock.MagicMock(), + 'stl.trex_stl_lib.linecache': mock.MagicMock(), + 'stl.trex_stl_lib.math': mock.MagicMock(), + 'stl.trex_stl_lib.os': mock.MagicMock(), + 'stl.trex_stl_lib.platform': mock.MagicMock(), + 'stl.trex_stl_lib.pprint': mock.MagicMock(), + 'stl.trex_stl_lib.random': mock.MagicMock(), + 'stl.trex_stl_lib.re': mock.MagicMock(), + 'stl.trex_stl_lib.scapy': mock.MagicMock(), + 'stl.trex_stl_lib.socket': mock.MagicMock(), + 'stl.trex_stl_lib.string': mock.MagicMock(), + 'stl.trex_stl_lib.struct': mock.MagicMock(), + 'stl.trex_stl_lib.sys': mock.MagicMock(), + 'stl.trex_stl_lib.threading': mock.MagicMock(), + 'stl.trex_stl_lib.time': mock.MagicMock(), + 'stl.trex_stl_lib.traceback': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(), + 'stl.trex_stl_lib.types': mock.MagicMock(), + 'stl.trex_stl_lib.utils': mock.MagicMock(), + 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(), + 'stl.trex_stl_lib.utils.collections': mock.MagicMock(), + 'stl.trex_stl_lib.utils.common': mock.MagicMock(), + 'stl.trex_stl_lib.utils.json': mock.MagicMock(), + 'stl.trex_stl_lib.utils.os': mock.MagicMock(), + 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(), + 'stl.trex_stl_lib.utils.random': mock.MagicMock(), + 'stl.trex_stl_lib.utils.re': mock.MagicMock(), + 'stl.trex_stl_lib.utils.string': mock.MagicMock(), + 'stl.trex_stl_lib.utils.sys': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(), + 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(), + 'stl.trex_stl_lib.warnings': mock.MagicMock(), + 'stl.trex_stl_lib.yaml': mock.MagicMock(), + 'stl.trex_stl_lib.zlib': mock.MagicMock(), + 'stl.trex_stl_lib.zmq': mock.MagicMock(), +} + +COMPLETE_TREX_VNFD = \ + {'vnfd:vnfd-catalog': + {'vnfd': + [{'benchmark': + {'kpi': + ['rx_throughput_fps', + 'tx_throughput_fps', + 'tx_throughput_mbps', + 'rx_throughput_mbps', + 'tx_throughput_pc_linerate', + 'rx_throughput_pc_linerate', + 'min_latency', + 'max_latency', + 'avg_latency']}, + 'connection-point': [{'name': 'xe0', + 'type': 'VPORT'}, + {'name': 'xe1', + 'type': 'VPORT'}], + 'description': 'TRex stateless traffic generator for RFC2544', + 'id': 'TrexTrafficGen', + 'mgmt-interface': {'ip': '1.1.1.1', + 'password': 'berta', + 'user': 'berta', + 'vdu-id': 'trexgen-baremetal'}, + 'name': 'trexgen', + 'short-name': 'trexgen', + 'vdu': [{'description': 'TRex stateless traffic generator for RFC2544', + 'external-interface': + [{'name': 'xe0', + 'virtual-interface': {'bandwidth': '10 Gbps', + 'dst_ip': '1.1.1.1', + 'dst_mac': '00:01:02:03:04:05', + 'local_ip': '1.1.1.2', + 'local_mac': '00:01:02:03:05:05', + 'type': 'PCI-PASSTHROUGH', + 'netmask': "255.255.255.0", + 'driver': 'i40', + 'vpci': '0000:00:10.2'}, + 'vnfd-connection-point-ref': 'xe0'}, + {'name': 'xe1', + 'virtual-interface': {'bandwidth': '10 Gbps', + 'dst_ip': '2.1.1.1', + 'dst_mac': '00:01:02:03:04:06', + 'local_ip': '2.1.1.2', + 'local_mac': '00:01:02:03:05:06', + 'type': 'PCI-PASSTHROUGH', + 'netmask': "255.255.255.0", + 'driver': 'i40', + 'vpci': '0000:00:10.1'}, + 'vnfd-connection-point-ref': 'xe1'}], + 'id': 'trexgen-baremetal', + 'name': 'trexgen-baremetal'}]}]}} + +IP_ADDR_SHOW = """ +28: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP """ +"""group default qlen 1000 + link/ether 90:e2:ba:a7:6a:c8 brd ff:ff:ff:ff:ff:ff + inet 1.1.1.1/8 brd 1.255.255.255 scope global eth1 + inet6 fe80::92e2:baff:fea7:6ac8/64 scope link + valid_lft forever preferred_lft forever +29: eth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP """ +"""group default qlen 1000 + link/ether 90:e2:ba:a7:6a:c9 brd ff:ff:ff:ff:ff:ff + inet 2.1.1.1/8 brd 2.255.255.255 scope global eth5 + inet6 fe80::92e2:baff:fea7:6ac9/64 scope link tentative + valid_lft forever preferred_lft forever +""" + +SYS_CLASS_NET = """ +lrwxrwxrwx 1 root root 0 sie 10 14:16 eth1 -> """ +"""../../devices/pci0000:80/0000:80:02.2/0000:84:00.1/net/eth1 +lrwxrwxrwx 1 root root 0 sie 3 10:37 eth2 -> """ +"""../../devices/pci0000:00/0000:00:01.1/0000:84:00.2/net/eth5 +""" + +TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + +class TestNetworkServiceTestCase(unittest.TestCase): + def setUp(self): + self.context_cfg = \ + {'nodes': + {'trexgen__1': {'role': 'TrafficGen', + 'name': 'trafficgen_1.yardstick', + 'ip': '10.10.10.11', + 'interfaces': + {'xe0': + {'netmask': '255.255.255.0', + 'local_ip': '152.16.100.20', + 'local_mac': '00:00:00:00:00:01', + 'driver': 'i40e', + 'vpci': '0000:07:00.0', + 'dpdk_port_num': 0}, + 'xe1': + {'netmask': '255.255.255.0', + 'local_ip': '152.16.40.20', + 'local_mac': '00:00:00:00:00:02', + 'driver': 'i40e', + 'vpci': '0000:07:00.1', + 'dpdk_port_num': 1}}, + 'password': 'r00t', + 'user': 'root'}, + 'trexvnf__1': {'name': 'vnf.yardstick', + 'ip': '10.10.10.12', + 'interfaces': + {'xe0': + {'netmask': '255.255.255.0', + 'local_ip': '152.16.100.19', + 'local_mac': '00:00:00:00:00:03', + 'driver': 'i40e', + 'vpci': '0000:07:00.0', + 'dpdk_port_num': 0}, + 'xe1': {'netmask': '255.255.255.0', + 'local_ip': '152.16.40.19', + 'local_mac': '00:00:00:00:00:04', + 'driver': 'i40e', + 'vpci': '0000:07:00.1', + 'dpdk_port_num': 1}}, + 'routing_table': [{'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'network': '152.16.100.20', + 'if': 'xe0'}, + {'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'network': '152.16.40.20', + 'if': 'xe1'}], + 'host': '10.223.197.164', + 'role': 'vnf', + 'user': 'root', + 'nd_route_tbl': + [{'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'network': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'network': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'password': 'r00t'}}} + + self.topology = { + 'short-name': 'trex-tg-topology', + 'constituent-vnfd': + [{'member-vnf-index': '1', + 'VNF model': 'tg_trex_tpl.yaml', + 'vnfd-id-ref': 'trexgen__1'}, + {'member-vnf-index': '2', + 'VNF model': 'tg_trex_tpl.yaml', + 'vnfd-id-ref': 'trexvnf__1'}], + 'description': 'trex-tg-topology', + 'name': 'trex-tg-topology', + 'vld': [ + { + 'vnfd-connection-point-ref': [ + { + 'vnfd-connection-point-ref': 'xe0', + 'member-vnf-index-ref': '1', + 'vnfd-id-ref': 'trexgen' + }, + { + 'vnfd-connection-point-ref': 'xe0', + 'member-vnf-index-ref': '2', + 'vnfd-id-ref': 'trexgen' + } + ], + 'type': 'ELAN', + 'id': 'private', + 'name': 'trexgen__1 to trexvnf__1 link 1' + }, + { + 'vnfd-connection-point-ref': [ + { + 'vnfd-connection-point-ref': 'xe1', + 'member-vnf-index-ref': '1', + 'vnfd-id-ref': 'trexgen' + }, + { + 'vnfd-connection-point-ref': 'xe1', + 'member-vnf-index-ref': '2', + 'vnfd-id-ref': 'trexgen' + } + ], + 'type': 'ELAN', + 'id': 'public', + 'name': 'trexvnf__1 to trexgen__1 link 2' + }], + 'id': 'trex-tg-topology', + } + + self.scenario_cfg = { + 'tc_options': {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}}, + 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', + 'tc': 'tc_ipv4_1Mflow_64B_packetsize', + 'runner': {'object': 'NetworkServiceTestCase', + 'interval': 35, + 'output_filename': 'yardstick.out', + 'runner_id': 74476, + 'duration': 400, 'type': 'Duration'}, + 'traffic_profile': 'ipv4_throughput_vpe.yaml', + 'traffic_options': {'flow': 'ipv4_1flow_Packets_vpe.yaml', + 'imix': 'imix_voice.yaml'}, 'type': 'ISB', + 'nodes': {'tg__2': 'trafficgen_2.yardstick', + 'tg__1': 'trafficgen_1.yardstick', + 'vnf__1': 'vnf.yardstick'}, + "topology": self._get_file_abspath("vpe_vnf_topology.yaml")} + + self.s = NetworkServiceTestCase(self.scenario_cfg, self.context_cfg) + + def _get_file_abspath(self, filename): + curr_path = os.path.dirname(os.path.abspath(__file__)) + file_path = os.path.join(curr_path, filename) + return file_path + + def test_ssh_manager(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) + ssh.return_value = ssh_mock + for node, node_dict in self.context_cfg["nodes"].items(): + with SshManager(node_dict) as conn: + self.assertIsNotNone(conn) + + def test___init__(self): + assert self.topology + + def test___get_traffic_flow(self): + self.scenario_cfg["traffic_options"]["flow"] = \ + self._get_file_abspath("ipv4_1flow_Packets_vpe.yaml") + result = {'flow': {'dstip4_range': '152.40.0.20', + 'srcip4_range': '152.16.0.20', 'count': 1}} + self.assertEqual(result, self.s._get_traffic_flow(self.scenario_cfg)) + + def test___get_traffic_flow_error(self): + self.scenario_cfg["traffic_options"]["flow"] = \ + "ipv4_1flow_Packets_vpe.yaml1" + self.assertEqual({}, self.s._get_traffic_flow(self.scenario_cfg)) + + def test_get_vnf_imp(self): + vnfd = COMPLETE_TREX_VNFD['vnfd:vnfd-catalog']['vnfd'][0] + with mock.patch.dict("sys.modules", STL_MOCKS): + self.assertIsNotNone(self.s.get_vnf_impl(vnfd)) + + def test_load_vnf_models_invalid(self): + self.context_cfg["nodes"]['trexgen__1']['VNF model'] = \ + self._get_file_abspath("tg_trex_tpl.yaml") + self.context_cfg["nodes"]['trexvnf__1']['VNF model'] = \ + self._get_file_abspath("tg_trex_tpl.yaml") + + vnf = mock.Mock(autospec=GenericVNF) + self.s.get_vnf_impl = mock.Mock(return_value=vnf) + + self.assertIsNotNone(self.s.load_vnf_models(self.context_cfg)) + + def test_map_topology_to_infrastructure(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) + ssh.return_value = ssh_mock + self.s.map_topology_to_infrastructure(self.context_cfg, + self.topology) + self.assertEqual("tg_trex_tpl.yaml", + self.context_cfg["nodes"]['trexgen__1']['VNF model']) + self.assertEqual("tg_trex_tpl.yaml", + self.context_cfg["nodes"]['trexvnf__1']['VNF model']) + + def test_map_topology_to_infrastructure_insufficient_nodes(self): + del self.context_cfg['nodes']['trexvnf__1'] + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, SYS_CLASS_NET + IP_ADDR_SHOW, "")) + ssh.return_value = ssh_mock + + self.assertRaises(IncorrectSetup, + self.s.map_topology_to_infrastructure, + self.context_cfg, self.topology) + + def test_map_topology_to_infrastructure_config_invalid(self): + cfg = dict(self.context_cfg) + del cfg['nodes']['trexvnf__1']['interfaces']['xe0']['local_mac'] + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) + ssh.return_value = ssh_mock + + self.assertRaises(IncorrectConfig, + self.s.map_topology_to_infrastructure, + self.context_cfg, self.topology) + + def test__resolve_topology_invalid_config(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) + ssh.return_value = ssh_mock + + del self.context_cfg['nodes'] + self.assertRaises(IncorrectConfig, self.s._resolve_topology, + self.context_cfg, self.topology) + + self.topology['vld'][0]['vnfd-connection-point-ref'].append( + self.topology['vld'][0]['vnfd-connection-point-ref']) + self.assertRaises(IncorrectConfig, self.s._resolve_topology, + self.context_cfg, self.topology) + + def test_run(self): + tgen = mock.Mock(autospec=GenericTrafficGen) + tgen.traffic_finished = True + verified_dict = {"verified": True} + tgen.verify_traffic = lambda x: verified_dict + tgen.name = "tgen__1" + vnf = mock.Mock(autospec=GenericVNF) + vnf.runs_traffic = False + self.s.vnfs = [tgen, vnf] + self.s.traffic_profile = mock.Mock() + self.s.collector = mock.Mock(autospec=Collector) + self.s.collector.get_kpi = \ + mock.Mock(return_value={tgen.name: verified_dict}) + result = {} + self.s.run(result) + self.assertDictEqual(result, {tgen.name: verified_dict}) + + def test_setup(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, SYS_CLASS_NET + IP_ADDR_SHOW, "")) + ssh.return_value = ssh_mock + + tgen = mock.Mock(autospec=GenericTrafficGen) + tgen.traffic_finished = True + verified_dict = {"verified": True} + tgen.verify_traffic = lambda x: verified_dict + tgen.terminate = mock.Mock(return_value=True) + tgen.name = "tgen__1" + vnf = mock.Mock(autospec=GenericVNF) + vnf.runs_traffic = False + vnf.terminate = mock.Mock(return_value=True) + self.s.vnfs = [tgen, vnf] + self.s.traffic_profile = mock.Mock() + self.s.collector = mock.Mock(autospec=Collector) + self.s.collector.get_kpi = \ + mock.Mock(return_value={tgen.name: verified_dict}) + self.s.map_topology_to_infrastructure = mock.Mock(return_value=0) + self.s.load_vnf_models = mock.Mock(return_value=self.s.vnfs) + self.s._fill_traffic_profile = \ + mock.Mock(return_value=TRAFFIC_PROFILE) + self.assertEqual(None, self.s.setup()) + + def test__get_traffic_profile(self): + self.scenario_cfg["traffic_profile"] = \ + self._get_file_abspath("ipv4_throughput_vpe.yaml") + self.assertIsNotNone(self.s._get_traffic_profile(self.scenario_cfg, + self.context_cfg)) + + def test__get_traffic_profile_exception(self): + cfg = dict(self.scenario_cfg) + cfg["traffic_profile"] = "" + self.assertRaises(IOError, self.s._get_traffic_profile, cfg, + self.context_cfg) + + def test___get_traffic_imix_exception(self): + cfg = dict(self.scenario_cfg) + cfg["traffic_options"]["imix"] = "" + self.assertEqual({}, self.s._get_traffic_imix(cfg)) + + def test__fill_traffic_profile(self): + with mock.patch.dict("sys.modules", STL_MOCKS): + self.scenario_cfg["traffic_profile"] = \ + self._get_file_abspath("ipv4_throughput_vpe.yaml") + self.scenario_cfg["traffic_options"]["flow"] = \ + self._get_file_abspath("ipv4_1flow_Packets_vpe.yaml") + self.scenario_cfg["traffic_options"]["imix"] = \ + self._get_file_abspath("imix_voice.yaml") + self.assertIsNotNone(self.s._fill_traffic_profile(self.scenario_cfg, + self.context_cfg)) + + def test_teardown(self): + vnf = mock.Mock(autospec=GenericVNF) + vnf.terminate = \ + mock.Mock(return_value=True) + self.s.vnfs = [vnf] + self.s.traffic_profile = mock.Mock() + self.s.collector = mock.Mock(autospec=Collector) + self.s.collector.stop = \ + mock.Mock(return_value=True) + self.assertIsNone(self.s.teardown()) diff --git a/tests/unit/benchmark/scenarios/networking/tg_trex_tpl.yaml b/tests/unit/benchmark/scenarios/networking/tg_trex_tpl.yaml new file mode 100644 index 000000000..b1641836b --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/tg_trex_tpl.yaml @@ -0,0 +1,75 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +vnfd:vnfd-catalog: + vnfd: + - id: TrexTrafficGen # NSPerf class mapping + name: trexgen + short-name: trexgen + description: TRex stateless traffic generator for tests + vm-flavor: + vcpu-count: '4' + memory-mb: '4096' + mgmt-interface: + vdu-id: trexgen-baremetal + user: '{{user}}' # Value filled by vnfdgen + password: '{{password}}' # Value filled by vnfdgen + ip: '{{ip}}' # Value filled by vnfdgen + connection-point: + - name: xe0 + type: VPORT + - name: xe1 + type: VPORT + vdu: + - id: trexgen-baremetal + name: trexgen-baremetal + description: TRex stateless traffic generator for tests + external-interface: + - name: xe0 + virtual-interface: + type: PCI-PASSTHROUGH + # Substitution variables MUST be quoted. Otherwise Python can misinterpet them. + vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen + driver: '{{ interfaces.xe0.driver}}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen + vld_id: '{{ interfaces.xe0.vld_id }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe0 + - name: xe1 + virtual-interface: + type: PCI-PASSTHROUGH + vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen + local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen + driver: '{{ interfaces.xe1.driver}}' # Value filled by vnfdgen + dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen + local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen + dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen + vld_id: '{{ interfaces.xe1.vld_id }}' # Value filled by vnfdgen + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe1 + + benchmark: + kpi: + - rx_throughput_fps + - tx_throughput_fps + - tx_throughput_mbps + - rx_throughput_mbps + - tx_throughput_pc_linerate + - rx_throughput_pc_linerate + - min_latency + - max_latency + - avg_latency diff --git a/tests/unit/benchmark/scenarios/networking/vpe_vnf_topology.yaml b/tests/unit/benchmark/scenarios/networking/vpe_vnf_topology.yaml new file mode 100644 index 000000000..0de4b6e79 --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/vpe_vnf_topology.yaml @@ -0,0 +1,50 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +nsd:nsd-catalog: + nsd: + - id: VPE + name: VPE + short-name: VPE + description: scenario with VPE,L3fwd and VNF + constituent-vnfd: + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #tg_vpe_upstream.yaml #VPE VNF + - member-vnf-index: '2' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/vpe_vnf.yaml #tg_l3fwd.yaml #tg_trex_tpl.yaml #TREX + + vld: + - id: private + name: tg__1 to vnf__1 link 1 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 #TREX + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 #VNF + + - id: public + name: vnf__1 to tg__1 link 2 + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 #L3fwd + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__1 #VPE VNF diff --git a/tests/unit/cmd/commands/test_testcase.py b/tests/unit/cmd/commands/test_testcase.py new file mode 100644 index 000000000..515784352 --- /dev/null +++ b/tests/unit/cmd/commands/test_testcase.py @@ -0,0 +1,21 @@ +import unittest +from mock import patch + +from yardstick.cmd.commands.testcase import TestcaseCommands + + +class TestcaseCommandsUT(unittest.TestCase): + @patch('yardstick.cmd.commands.testcase.TestcaseCommands._format_print') + @patch('yardstick.cmd.commands.client') + def test_do_list(self, mock_client, mock_print): + mock_client.get.return_value = {'result': []} + TestcaseCommands().do_list({}) + self.assertTrue(mock_print.called) + + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/tests/unit/cmd/test_NSBperf.py b/tests/unit/cmd/test_NSBperf.py new file mode 100644 index 000000000..a14c08464 --- /dev/null +++ b/tests/unit/cmd/test_NSBperf.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +import unittest +import mock +import subprocess +import os + +from yardstick.cmd.NSBperf import YardstickNSCli +from yardstick.cmd import NSBperf + + +@mock.patch('six.moves.input', return_value='0') +class TestHandler(unittest.TestCase): + def test_handler(self, test): + subprocess.call = mock.Mock(return_value=0) + self.assertRaises(SystemExit, NSBperf.handler) + + +class TestYardstickNSCli(unittest.TestCase): + def test___init__(self): + yardstick_ns_cli = YardstickNSCli() + self.assertIsNotNone(yardstick_ns_cli) + + def test_generate_final_report(self): + yardstick_ns_cli = YardstickNSCli() + test_case = "tc_baremetal_rfc2544_ipv4_1flow_1518B.yaml" + subprocess.call(["touch", "/tmp/yardstick.out"]) + self.assertIsNone(yardstick_ns_cli.generate_final_report(test_case)) + + def test_generate_kpi_results(self): + yardstick_ns_cli = YardstickNSCli() + tkey = "cpu" + tgen = {"cpu": {"ipc": 0}} + self.assertIsNone(yardstick_ns_cli.generate_kpi_results(tkey, tgen)) + + def test_generate_nfvi_results(self): + yardstick_ns_cli = YardstickNSCli() + nfvi = {"collect_stats": {"cpu": {"ipc": 0, "Hz": 2.6}}} + self.assertIsNone(yardstick_ns_cli.generate_nfvi_results(nfvi)) + + def test_handle_list_options(self): + yardstick_ns_cli = YardstickNSCli() + CLI_PATH = os.path.dirname(os.path.realpath(__file__)) + repo_dir = CLI_PATH + "/../../" + test_path = os.path.join(repo_dir, "../samples/vnf_samples/nsut/") + args = {"list_vnfs": True, "list": False} + self.assertRaises(SystemExit, yardstick_ns_cli.handle_list_options, + args, test_path) + args = {"list_vnfs": False, "list": True} + self.assertRaises(SystemExit, + yardstick_ns_cli.handle_list_options, + args, test_path) + + def test_main(self): + yardstick_ns_cli = YardstickNSCli() + yardstick_ns_cli.parse_arguments = mock.Mock(return_value=0) + yardstick_ns_cli.handle_list_options = mock.Mock(return_value=0) + yardstick_ns_cli.terminate_if_less_options = mock.Mock(return_value=0) + yardstick_ns_cli.run_test = mock.Mock(return_value=0) + self.assertIsNone(yardstick_ns_cli.main()) + + def test_parse_arguments(self): + yardstick_ns_cli = YardstickNSCli() + self.assertRaises(SystemExit, yardstick_ns_cli.parse_arguments) + + def test_run_test(self): + cur_dir = os.getcwd() + CLI_PATH = os.path.dirname(os.path.realpath(__file__)) + YARDSTICK_REPOS_DIR = os.path.join(CLI_PATH + "/../../") + test_path = os.path.join(YARDSTICK_REPOS_DIR, + "../samples/vnf_samples/nsut/") + yardstick_ns_cli = YardstickNSCli() + subprocess.check_output = mock.Mock(return_value=0) + args = {"vnf": "vpe", + "test": "tc_baremetal_rfc2544_ipv4_1flow_1518B.yaml"} + self.assertEqual(None, yardstick_ns_cli.run_test(args, test_path)) + os.chdir(cur_dir) + args = {"vnf": "vpe1"} + self.assertEqual(None, yardstick_ns_cli.run_test(args, test_path)) + os.chdir(cur_dir) + args = {"vnf": "vpe", + "test": "tc_baremetal_rfc2544_ipv4_1flow_1518B.yaml."} + self.assertEqual(None, yardstick_ns_cli.run_test(args, test_path)) + os.chdir(cur_dir) + args = [] + self.assertEqual(None, yardstick_ns_cli.run_test(args, test_path)) + os.chdir(cur_dir) + + def test_terminate_if_less_options(self): + yardstick_ns_cli = YardstickNSCli() + args = {"vnf": False} + self.assertRaises(SystemExit, + yardstick_ns_cli.terminate_if_less_options, args) + + def test_validate_input(self): + yardstick_ns_cli = YardstickNSCli() + self.assertEqual(1, yardstick_ns_cli.validate_input("", 4)) + NSBperf.input = lambda _: 'yes' + self.assertEqual(1, yardstick_ns_cli.validate_input(5, 4)) + subprocess.call = mock.Mock(return_value=0) + self.assertEqual(0, yardstick_ns_cli.validate_input(2, 4)) + subprocess.call = mock.Mock(return_value=0) diff --git a/tests/unit/network_services/__init__.py b/tests/unit/network_services/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/unit/network_services/__init__.py diff --git a/tests/unit/network_services/collector/__init__.py b/tests/unit/network_services/collector/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/unit/network_services/collector/__init__.py diff --git a/tests/unit/network_services/collector/test_publisher.py b/tests/unit/network_services/collector/test_publisher.py new file mode 100644 index 000000000..d1e56e114 --- /dev/null +++ b/tests/unit/network_services/collector/test_publisher.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Unittest for yardstick.network_services.collector.publisher + +from __future__ import absolute_import +import unittest + +from yardstick.network_services.collector import publisher + + +class PublisherTestCase(unittest.TestCase): + + def setUp(self): + self.test_publisher = publisher.Publisher() + + def test_successful_init(self): + pass + + def test_unsuccessful_init(self): + pass + + def test_start(self): + self.assertIsNone(self.test_publisher.start()) + + def test_stop(self): + self.assertIsNone(self.test_publisher.stop()) diff --git a/tests/unit/network_services/collector/test_subscriber.py b/tests/unit/network_services/collector/test_subscriber.py new file mode 100644 index 000000000..373f5dccf --- /dev/null +++ b/tests/unit/network_services/collector/test_subscriber.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Unittest for yardstick.network_services.collector.subscriber + +from __future__ import absolute_import +import unittest + +from yardstick.network_services.collector import subscriber + + +class CollectorTestCase(unittest.TestCase): + + TRAFFIC_PROFILE = {} + VNFS = {} + + def setUp(self): + self.test_subscriber = subscriber.Collector(self.TRAFFIC_PROFILE, + self.VNFS) + + def test_successful_init(self): + + self.assertEqual(self.test_subscriber.traffic_profile, {}) + self.assertEqual(self.test_subscriber.service, {}) + + def test_unsuccessful_init(self): + pass + + def test_start(self): + self.assertIsNone(self.test_subscriber.start()) + + def test_stop(self): + self.assertIsNone(self.test_subscriber.stop()) + + def test_get_kpi(self): + + class VnfAprrox(object): + def __init__(self): + self.result = {} + self.name = "vnf__1" + + def collect_kpi(self): + self.result = {'pkt_in_up_stream': 100, + 'pkt_drop_up_stream': 5, + 'pkt_in_down_stream': 50, + 'pkt_drop_down_stream': 40} + return self.result + + vnf = VnfAprrox() + result = self.test_subscriber.get_kpi(vnf) + + self.assertEqual(result["vnf__1"]["pkt_in_up_stream"], 100) + self.assertEqual(result["vnf__1"]["pkt_drop_up_stream"], 5) + self.assertEqual(result["vnf__1"]["pkt_in_down_stream"], 50) + self.assertEqual(result["vnf__1"]["pkt_drop_down_stream"], 40) diff --git a/tests/unit/network_services/nfvi/__init__.py b/tests/unit/network_services/nfvi/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/unit/network_services/nfvi/__init__.py diff --git a/tests/unit/network_services/nfvi/test_collectd.py b/tests/unit/network_services/nfvi/test_collectd.py new file mode 100644 index 000000000..866c31d32 --- /dev/null +++ b/tests/unit/network_services/nfvi/test_collectd.py @@ -0,0 +1,157 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +import unittest +import multiprocessing +import mock + +from yardstick.network_services.nfvi.collectd import AmqpConsumer + + +class TestAmqpConsumer(unittest.TestCase): + def setUp(self): + self.queue = multiprocessing.Queue() + self.url = 'amqp://admin:admin@127.0.0.1:5672/%2F' + self.amqp_consumer = AmqpConsumer(self.url, self.queue) + + def test___init__(self): + self.assertEqual(self.url, self.amqp_consumer._url) + + def test_on_connection_open(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer._connection.add_on_close_callback = \ + mock.Mock(return_value=0) + self.amqp_consumer._connection.channel = mock.Mock(return_value=0) + self.assertEqual(None, self.amqp_consumer.on_connection_open(10)) + + def test_on_connection_closed(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer._connection.ioloop = mock.Mock() + self.amqp_consumer._connection.ioloop.stop = mock.Mock(return_value=0) + self.amqp_consumer._connection.add_timeout = mock.Mock(return_value=0) + self.amqp_consumer._closing = True + self.assertEqual(None, + self.amqp_consumer.on_connection_closed("", 404, + "Not Found")) + self.amqp_consumer._closing = False + self.assertEqual(None, + self.amqp_consumer.on_connection_closed("", 404, + "Not Found")) + + def test_reconnect(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer._connection.ioloop = mock.Mock() + self.amqp_consumer._connection.ioloop.stop = mock.Mock(return_value=0) + self.amqp_consumer.connect = mock.Mock(return_value=0) + self.amqp_consumer._closing = True + self.assertEqual(None, self.amqp_consumer.reconnect()) + + def test_on_channel_open(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer._connection.add_on_close_callback = \ + mock.Mock(return_value=0) + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer.add_on_channel_close_callback = mock.Mock() + self.amqp_consumer._channel.exchange_declare = \ + mock.Mock(return_value=0) + self.assertEqual(None, + self.amqp_consumer.on_channel_open( + self.amqp_consumer._channel)) + + def test_add_on_channel_close_callback(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer._connection.add_on_close_callback = \ + mock.Mock(return_value=0) + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.add_on_close_callback = mock.Mock() + self.assertEqual(None, + self.amqp_consumer.add_on_channel_close_callback()) + + def test_on_channel_closed(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer._connection.close = mock.Mock(return_value=0) + _channel = mock.Mock() + self.assertEqual(None, + self.amqp_consumer.on_channel_closed(_channel, + "", "")) + + def test_ion_exchange_declareok(self): + self.amqp_consumer.setup_queue = mock.Mock(return_value=0) + self.assertEqual(None, self.amqp_consumer.on_exchange_declareok(10)) + + def test_setup_queue(self): + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.add_on_close_callback = mock.Mock() + self.assertEqual(None, self.amqp_consumer.setup_queue("collectd")) + + def test_on_queue_declareok(self): + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.queue_bind = mock.Mock() + self.assertEqual(None, self.amqp_consumer.on_queue_declareok(10)) + + def test__on_bindok(self): + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.basic_consume = mock.Mock() + self.amqp_consumer.add_on_cancel_callback = mock.Mock() + self.assertEqual(None, self.amqp_consumer._on_bindok(10)) + + def test_add_on_cancel_callback(self): + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.add_on_cancel_callback = mock.Mock() + self.assertEqual(None, self.amqp_consumer.add_on_cancel_callback()) + + def test_on_consumer_cancelled(self): + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.close = mock.Mock() + self.assertEqual(None, self.amqp_consumer.on_consumer_cancelled(10)) + + def test_on_message(self): + body = "msg {} cpu/cpu-0/ipc 101010:10" + properties = "" + basic_deliver = mock.Mock() + basic_deliver.delivery_tag = mock.Mock(return_value=0) + self.amqp_consumer.ack_message = mock.Mock() + self.assertEqual(None, + self.amqp_consumer.on_message(10, basic_deliver, + properties, body)) + + def test_ack_message(self): + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.basic_ack = mock.Mock() + self.assertEqual(None, self.amqp_consumer.ack_message(10)) + + def test_on_cancelok(self): + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.close = mock.Mock() + self.assertEqual(None, self.amqp_consumer.on_cancelok(10)) + + def test_run(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer.connect = mock.Mock() + self.amqp_consumer._connection.ioloop.start = mock.Mock() + self.assertEqual(None, self.amqp_consumer.run()) + + def test_stop(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer.connect = mock.Mock() + self.amqp_consumer._connection.ioloop.start = mock.Mock() + self.amqp_consumer._channel = mock.Mock() + self.amqp_consumer._channel.basic_cancel = mock.Mock() + self.assertEqual(None, self.amqp_consumer.stop()) + + def test_close_connection(self): + self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) + self.amqp_consumer._connection.close = mock.Mock() + self.assertEqual(None, self.amqp_consumer.close_connection()) diff --git a/tests/unit/network_services/nfvi/test_resource.py b/tests/unit/network_services/nfvi/test_resource.py new file mode 100644 index 000000000..26d18838b --- /dev/null +++ b/tests/unit/network_services/nfvi/test_resource.py @@ -0,0 +1,158 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +import unittest +import multiprocessing +import mock + +from yardstick.network_services.nfvi.resource import ResourceProfile +from yardstick.network_services.nfvi import resource, collectd + + +class TestResourceProfile(unittest.TestCase): + VNFD = {'vnfd:vnfd-catalog': + {'vnfd': + [{'short-name': 'VpeVnf', + 'vdu': + [{'routing_table': + [{'network': '172.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '172.16.100.20', + 'if': 'xe0'}, + {'network': '172.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '172.16.40.20', + 'if': 'xe1'}], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': + [{'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'id': 'vpevnf-baremetal', + 'external-interface': + [{'virtual-interface': + {'dst_mac': '3c:fd:fe:9e:64:38', + 'vpci': '0000:05:00.0', + 'local_ip': '172.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '0', + 'bandwidth': '10 Gbps', + 'dst_ip': '172.16.100.20', + 'local_mac': '3c:fd:fe:a1:2b:80'}, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0'}, + {'virtual-interface': + {'dst_mac': '00:1e:67:d0:60:5c', + 'vpci': '0000:05:00.1', + 'local_ip': '172.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '1', + 'bandwidth': '10 Gbps', + 'dst_ip': '172.16.40.20', + 'local_mac': '3c:fd:fe:a1:2b:81'}, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1'}]}], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': + {'vdu-id': 'vpevnf-baremetal', + 'host': '127.0.0.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '127.0.0.1'}, + 'benchmark': + {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, + 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, + {'type': 'VPORT', 'name': 'xe1'}], + 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} + + def setUp(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + + self.resource_profile = \ + ResourceProfile(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0], + [1, 2, 3]) + + def test___init__(self): + self.assertEqual(True, self.resource_profile.enable) + + def test_check_if_sa_running(self): + self.assertEqual(self.resource_profile.check_if_sa_running("collectd"), + [True, {}]) + + def test_get_cpu_data(self): + reskey = ["", "cpufreq", "cpufreq-0"] + value = "metric:10" + val = self.resource_profile.get_cpu_data(reskey, value) + self.assertEqual(val, ['0', 'cpufreq', '10', 'metric']) + + def test_get_cpu_data_error(self): + reskey = ["", "", ""] + value = "metric:10" + val = self.resource_profile.get_cpu_data(reskey, value) + self.assertEqual(val, ['error', 'Invalid', '']) + + def test__start_collectd(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + resource_profile = \ + ResourceProfile(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0], + [1, 2, 3]) + self.assertIsNone( + resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin")) + + def test_initiate_systemagent(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + resource_profile = \ + ResourceProfile(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0], + [1, 2, 3]) + self.assertIsNone( + resource_profile.initiate_systemagent("/opt/nsb_bin")) + + def test_parse_collectd_result(self): + res = self.resource_profile.parse_collectd_result({}, [0, 1, 2]) + self.assertDictEqual(res, {'timestamp': '', 'cpu': {}, 'memory': {}}) + + def test_run_collectd_amqp(self): + _queue = multiprocessing.Queue() + resource.AmqpConsumer = mock.Mock(autospec=collectd) + self.assertIsNone(self.resource_profile.run_collectd_amqp(_queue)) + + def test_start(self): + self.assertIsNone(self.resource_profile.start()) + + def test_stop(self): + self.assertIsNone(self.resource_profile.stop()) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/unit/network_services/test_utils.py b/tests/unit/network_services/test_utils.py new file mode 100644 index 000000000..8d9e74adf --- /dev/null +++ b/tests/unit/network_services/test_utils.py @@ -0,0 +1,64 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Unittest for yardstick.network_services.utils + +from __future__ import absolute_import + +import os +import unittest +import mock + +from yardstick.network_services import utils + + +class UtilsTestCase(unittest.TestCase): + """Test all VNF helper methods.""" + + DPDK_PATH = os.path.join(utils.NSB_ROOT, "dpdk_nic_bind.py") + + def setUp(self): + super(UtilsTestCase, self).setUp() + + def test_get_nsb_options(self): + result = utils.get_nsb_option("bin_path", None) + self.assertEqual(result, utils.NSB_ROOT) + + def test_get_nsb_option_is_invalid_key(self): + result = utils.get_nsb_option("bin", None) + self.assertEqual(result, None) + + def test_get_nsb_option_default(self): + default = object() + result = utils.get_nsb_option("nosuch", default) + self.assertIs(result, default) + + def test_provision_tool(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, self.DPDK_PATH, "")) + ssh.return_value = ssh_mock + tool_path = utils.provision_tool(ssh_mock, self.DPDK_PATH) + self.assertEqual(tool_path, self.DPDK_PATH) + + def test_provision_tool_no_path(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, self.DPDK_PATH, "")) + ssh.return_value = ssh_mock + tool_path = utils.provision_tool(ssh_mock, self.DPDK_PATH) + self.assertEqual(tool_path, self.DPDK_PATH) diff --git a/tests/unit/network_services/traffic_profile/__init__.py b/tests/unit/network_services/traffic_profile/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/unit/network_services/traffic_profile/__init__.py diff --git a/tests/unit/network_services/traffic_profile/test_base.py b/tests/unit/network_services/traffic_profile/test_base.py new file mode 100644 index 000000000..72b097b52 --- /dev/null +++ b/tests/unit/network_services/traffic_profile/test_base.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Unittest for yardstick.network_services.traffic_profile.test_base + +from __future__ import absolute_import +import unittest +import mock + +from yardstick.network_services.traffic_profile.base import \ + TrafficProfile, DummyProfile + + +class TestTrafficProfile(unittest.TestCase): + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + def _get_res_mock(self, **kw): + _mock = mock.MagicMock() + for k, v in kw.items(): + setattr(_mock, k, v) + return _mock + + def test___init__(self): + traffic_profile = TrafficProfile(self.TRAFFIC_PROFILE) + self.assertEqual(self.TRAFFIC_PROFILE, traffic_profile.params) + + def test_execute(self): + traffic_profile = TrafficProfile(self.TRAFFIC_PROFILE) + self.assertRaises(NotImplementedError, traffic_profile.execute, {}) + + def test_get(self): + traffic_profile = TrafficProfile(self.TRAFFIC_PROFILE) + self.assertRaises(RuntimeError, traffic_profile.get, + self.TRAFFIC_PROFILE) + + +class TestDummyProfile(unittest.TestCase): + def test_execute(self): + dummy_profile = DummyProfile(TrafficProfile) + self.assertIsNone(dummy_profile.execute({})) diff --git a/tests/unit/network_services/traffic_profile/test_fixed.py b/tests/unit/network_services/traffic_profile/test_fixed.py new file mode 100644 index 000000000..8b44719a1 --- /dev/null +++ b/tests/unit/network_services/traffic_profile/test_fixed.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +import unittest +import mock + +STL_MOCKS = { + 'stl': mock.MagicMock(), + 'stl.trex_stl_lib': mock.MagicMock(), + 'stl.trex_stl_lib.base64': mock.MagicMock(), + 'stl.trex_stl_lib.binascii': mock.MagicMock(), + 'stl.trex_stl_lib.collections': mock.MagicMock(), + 'stl.trex_stl_lib.copy': mock.MagicMock(), + 'stl.trex_stl_lib.datetime': mock.MagicMock(), + 'stl.trex_stl_lib.functools': mock.MagicMock(), + 'stl.trex_stl_lib.imp': mock.MagicMock(), + 'stl.trex_stl_lib.inspect': mock.MagicMock(), + 'stl.trex_stl_lib.json': mock.MagicMock(), + 'stl.trex_stl_lib.linecache': mock.MagicMock(), + 'stl.trex_stl_lib.math': mock.MagicMock(), + 'stl.trex_stl_lib.os': mock.MagicMock(), + 'stl.trex_stl_lib.platform': mock.MagicMock(), + 'stl.trex_stl_lib.pprint': mock.MagicMock(), + 'stl.trex_stl_lib.random': mock.MagicMock(), + 'stl.trex_stl_lib.re': mock.MagicMock(), + 'stl.trex_stl_lib.scapy': mock.MagicMock(), + 'stl.trex_stl_lib.socket': mock.MagicMock(), + 'stl.trex_stl_lib.string': mock.MagicMock(), + 'stl.trex_stl_lib.struct': mock.MagicMock(), + 'stl.trex_stl_lib.sys': mock.MagicMock(), + 'stl.trex_stl_lib.threading': mock.MagicMock(), + 'stl.trex_stl_lib.time': mock.MagicMock(), + 'stl.trex_stl_lib.traceback': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(), + 'stl.trex_stl_lib.types': mock.MagicMock(), + 'stl.trex_stl_lib.utils': mock.MagicMock(), + 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(), + 'stl.trex_stl_lib.utils.collections': mock.MagicMock(), + 'stl.trex_stl_lib.utils.common': mock.MagicMock(), + 'stl.trex_stl_lib.utils.json': mock.MagicMock(), + 'stl.trex_stl_lib.utils.os': mock.MagicMock(), + 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(), + 'stl.trex_stl_lib.utils.random': mock.MagicMock(), + 'stl.trex_stl_lib.utils.re': mock.MagicMock(), + 'stl.trex_stl_lib.utils.string': mock.MagicMock(), + 'stl.trex_stl_lib.utils.sys': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(), + 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(), + 'stl.trex_stl_lib.warnings': mock.MagicMock(), + 'stl.trex_stl_lib.yaml': mock.MagicMock(), + 'stl.trex_stl_lib.zlib': mock.MagicMock(), + 'stl.trex_stl_lib.zmq': mock.MagicMock(), +} + +STLClient = mock.MagicMock() +stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) +stl_patch.start() + +if stl_patch: + from yardstick.network_services.traffic_profile.base import TrafficProfile + from yardstick.network_services.traffic_profile.fixed import FixedProfile + + +class TestFixedProfile(unittest.TestCase): + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + VNFD = {'vnfd:vnfd-catalog': + {'vnfd': + [{'short-name': 'VpeVnf', + 'vdu': + [{'routing_table': + [{'network': '152.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'if': 'xe0'}, + {'network': '152.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'if': 'xe1'}], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': + [{'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'id': 'vpevnf-baremetal', + 'external-interface': + [{'virtual-interface': + {'dst_mac': '00:00:00:00:00:04', + 'vpci': '0000:05:00.0', + 'local_ip': '152.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '0', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.100.20', + 'local_mac': '00:00:00:00:00:01'}, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0'}, + {'virtual-interface': + {'dst_mac': '00:00:00:00:00:03', + 'vpci': '0000:05:00.1', + 'local_ip': '152.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '1', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.40.20', + 'local_mac': '00:00:00:00:00:02'}, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1'}]}], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': + {'vdu-id': 'vpevnf-baremetal', + 'host': '1.1.1.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '1.1.1.1'}, + 'benchmark': + {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, + 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, + {'type': 'VPORT', 'name': 'xe1'}], + 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} + + def test___init__(self): + fixed_profile = \ + FixedProfile(TrafficProfile) + self.assertIsNotNone(fixed_profile) + + def test_execute(self): + traffic_generator = mock.Mock(autospec=TrafficProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + traffic_generator.client = \ + mock.Mock(return_value=True) + fixed_profile = FixedProfile(self.TRAFFIC_PROFILE) + fixed_profile.params = self.TRAFFIC_PROFILE + fixed_profile.first_run = True + self.assertEqual(None, fixed_profile.execute(traffic_generator)) diff --git a/tests/unit/network_services/traffic_profile/test_http.py b/tests/unit/network_services/traffic_profile/test_http.py new file mode 100644 index 000000000..e818a0528 --- /dev/null +++ b/tests/unit/network_services/traffic_profile/test_http.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +import unittest + +from yardstick.network_services.traffic_profile.base import TrafficProfile +from yardstick.network_services.traffic_profile.http import \ + TrafficProfileGenericHTTP + + +class TestTrafficProfileGenericHTTP(unittest.TestCase): + def test___init__(self): + traffic_profile_generic_htt_p = \ + TrafficProfileGenericHTTP(TrafficProfile) + self.assertIsNotNone(traffic_profile_generic_htt_p) + + def test_execute(self): + traffic_profile_generic_htt_p = \ + TrafficProfileGenericHTTP(TrafficProfile) + traffic_generator = {} + self.assertEqual(None, + traffic_profile_generic_htt_p.execute( + traffic_generator)) + + def test__send_http_request(self): + traffic_profile_generic_htt_p = \ + TrafficProfileGenericHTTP(TrafficProfile) + self.assertEqual(None, + traffic_profile_generic_htt_p._send_http_request( + "10.1.1.1", "250", "/req")) diff --git a/tests/unit/network_services/traffic_profile/test_rfc2544.py b/tests/unit/network_services/traffic_profile/test_rfc2544.py new file mode 100644 index 000000000..1e9409b2a --- /dev/null +++ b/tests/unit/network_services/traffic_profile/test_rfc2544.py @@ -0,0 +1,247 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +from __future__ import division +import unittest +import mock + +STL_MOCKS = { + 'stl': mock.MagicMock(), + 'stl.trex_stl_lib': mock.MagicMock(), + 'stl.trex_stl_lib.base64': mock.MagicMock(), + 'stl.trex_stl_lib.binascii': mock.MagicMock(), + 'stl.trex_stl_lib.collections': mock.MagicMock(), + 'stl.trex_stl_lib.copy': mock.MagicMock(), + 'stl.trex_stl_lib.datetime': mock.MagicMock(), + 'stl.trex_stl_lib.functools': mock.MagicMock(), + 'stl.trex_stl_lib.imp': mock.MagicMock(), + 'stl.trex_stl_lib.inspect': mock.MagicMock(), + 'stl.trex_stl_lib.json': mock.MagicMock(), + 'stl.trex_stl_lib.linecache': mock.MagicMock(), + 'stl.trex_stl_lib.math': mock.MagicMock(), + 'stl.trex_stl_lib.os': mock.MagicMock(), + 'stl.trex_stl_lib.platform': mock.MagicMock(), + 'stl.trex_stl_lib.pprint': mock.MagicMock(), + 'stl.trex_stl_lib.random': mock.MagicMock(), + 'stl.trex_stl_lib.re': mock.MagicMock(), + 'stl.trex_stl_lib.scapy': mock.MagicMock(), + 'stl.trex_stl_lib.socket': mock.MagicMock(), + 'stl.trex_stl_lib.string': mock.MagicMock(), + 'stl.trex_stl_lib.struct': mock.MagicMock(), + 'stl.trex_stl_lib.sys': mock.MagicMock(), + 'stl.trex_stl_lib.threading': mock.MagicMock(), + 'stl.trex_stl_lib.time': mock.MagicMock(), + 'stl.trex_stl_lib.traceback': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(), + 'stl.trex_stl_lib.types': mock.MagicMock(), + 'stl.trex_stl_lib.utils': mock.MagicMock(), + 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(), + 'stl.trex_stl_lib.utils.collections': mock.MagicMock(), + 'stl.trex_stl_lib.utils.common': mock.MagicMock(), + 'stl.trex_stl_lib.utils.json': mock.MagicMock(), + 'stl.trex_stl_lib.utils.os': mock.MagicMock(), + 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(), + 'stl.trex_stl_lib.utils.random': mock.MagicMock(), + 'stl.trex_stl_lib.utils.re': mock.MagicMock(), + 'stl.trex_stl_lib.utils.string': mock.MagicMock(), + 'stl.trex_stl_lib.utils.sys': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(), + 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(), + 'stl.trex_stl_lib.warnings': mock.MagicMock(), + 'stl.trex_stl_lib.yaml': mock.MagicMock(), + 'stl.trex_stl_lib.zlib': mock.MagicMock(), + 'stl.trex_stl_lib.zmq': mock.MagicMock(), +} + +STLClient = mock.MagicMock() +stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) +stl_patch.start() + +if stl_patch: + from yardstick.network_services.traffic_profile.traffic_profile \ + import TrexProfile + from yardstick.network_services.traffic_profile.rfc2544 import \ + RFC2544Profile + + +class TestRFC2544Profile(unittest.TestCase): + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + PROFILE = {'description': 'Traffic profile to run RFC2544 latency', + 'name': 'rfc2544', + 'traffic_profile': {'traffic_type': 'RFC2544Profile', + 'frame_rate': 100}, + 'public': {'ipv4': + {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}}, + 'outer_l3v4': {'dstip4': '1.1.1.1-1.15.255.255', + 'proto': 'udp', + 'srcip4': '90.90.1.1-90.105.255.255', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'srcport': '2001', + 'dsrport': '1234'}}}, + 'private': {'ipv4': + {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}}, + 'outer_l3v4': {'dstip4': '9.9.1.1-90.105.255.255', + 'proto': 'udp', + 'srcip4': '1.1.1.1-1.15.255.255', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'dstport': '2001', + 'srcport': '1234'}}}, + 'schema': 'isb:traffic_profile:0.1'} + + def test___init__(self): + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + assert r_f_c2544_profile.rate + + def test_execute(self): + traffic_generator = mock.Mock(autospec=TrexProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.client = \ + mock.Mock(return_value=True) + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.params = self.PROFILE + r_f_c2544_profile.first_run = True + self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator)) + + def test_get_drop_percentage(self): + traffic_generator = mock.Mock(autospec=TrexProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.client = \ + mock.Mock(return_value=True) + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.params = self.PROFILE + self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator)) + samples = {} + for ifname in range(1): + name = "xe{}".format(ifname) + samples[name] = {"rx_throughput_fps": 20, + "tx_throughput_fps": 20, + "rx_throughput_mbps": 10, + "tx_throughput_mbps": 10, + "in_packets": 1000, + "out_packets": 1000} + tol_min = 100.0 + tolerance = 0.0 + expected = {'DropPercentage': 0.0, 'RxThroughput': 100/3.0, + 'TxThroughput': 100/3.0, 'CurrentDropPercentage': 0.0, + 'Throughput': 100/3.0, + 'xe0': {'tx_throughput_fps': 20, 'in_packets': 1000, + 'out_packets': 1000, 'rx_throughput_mbps': 10, + 'tx_throughput_mbps': 10, 'rx_throughput_fps': 20}} + self.assertDictEqual(expected, + r_f_c2544_profile.get_drop_percentage( + traffic_generator, samples, + tol_min, tolerance)) + + def test_get_drop_percentage_update(self): + traffic_generator = mock.Mock(autospec=TrexProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.client = \ + mock.Mock(return_value=True) + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.params = self.PROFILE + self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator)) + samples = {} + for ifname in range(1): + name = "xe{}".format(ifname) + samples[name] = {"rx_throughput_fps": 20, + "tx_throughput_fps": 20, + "rx_throughput_mbps": 10, + "tx_throughput_mbps": 10, + "in_packets": 1000, + "out_packets": 1002} + tol_min = 0.0 + tolerance = 1.0 + expected = {'DropPercentage': 0.2, 'RxThroughput': 100/3.0, + 'TxThroughput': 33.4, 'CurrentDropPercentage': 0.2, + 'Throughput': 100/3.0, + 'xe0': {'tx_throughput_fps': 20, 'in_packets': 1000, + 'out_packets': 1002, 'rx_throughput_mbps': 10, + 'tx_throughput_mbps': 10, 'rx_throughput_fps': 20}} + self.assertDictEqual(expected, + r_f_c2544_profile.get_drop_percentage( + traffic_generator, samples, + tol_min, tolerance)) + + def test_get_drop_percentage_div_zero(self): + traffic_generator = mock.Mock(autospec=TrexProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.client = \ + mock.Mock(return_value=True) + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.params = self.PROFILE + self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator)) + samples = {} + for ifname in range(1): + name = "xe{}".format(ifname) + samples[name] = {"rx_throughput_fps": 20, + "tx_throughput_fps": 20, + "rx_throughput_mbps": 10, + "tx_throughput_mbps": 10, + "in_packets": 1000, + "out_packets": 0} + tol_min = 0.0 + tolerance = 0.0 + r_f_c2544_profile.tmp_throughput = 0 + expected = {'DropPercentage': 100.0, 'RxThroughput': 100/3.0, + 'TxThroughput': 0.0, 'CurrentDropPercentage': 100.0, + 'Throughput': 100/3.0, + 'xe0': {'tx_throughput_fps': 20, 'in_packets': 1000, + 'out_packets': 0, 'rx_throughput_mbps': 10, + 'tx_throughput_mbps': 10, 'rx_throughput_fps': 20}} + self.assertDictEqual(expected, + r_f_c2544_profile.get_drop_percentage( + traffic_generator, samples, + tol_min, tolerance)) + + def test_get_multiplier(self): + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.max_rate = 100 + r_f_c2544_profile.min_rate = 100 + self.assertEqual("1.0", r_f_c2544_profile.get_multiplier()) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/unit/network_services/traffic_profile/test_traffic_profile.py b/tests/unit/network_services/traffic_profile/test_traffic_profile.py new file mode 100644 index 000000000..ec07e83a6 --- /dev/null +++ b/tests/unit/network_services/traffic_profile/test_traffic_profile.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +import unittest + +import mock + +STL_MOCKS = { + 'stl': mock.MagicMock(), + 'stl.trex_stl_lib': mock.MagicMock(), + 'stl.trex_stl_lib.base64': mock.MagicMock(), + 'stl.trex_stl_lib.binascii': mock.MagicMock(), + 'stl.trex_stl_lib.collections': mock.MagicMock(), + 'stl.trex_stl_lib.copy': mock.MagicMock(), + 'stl.trex_stl_lib.datetime': mock.MagicMock(), + 'stl.trex_stl_lib.functools': mock.MagicMock(), + 'stl.trex_stl_lib.imp': mock.MagicMock(), + 'stl.trex_stl_lib.inspect': mock.MagicMock(), + 'stl.trex_stl_lib.json': mock.MagicMock(), + 'stl.trex_stl_lib.linecache': mock.MagicMock(), + 'stl.trex_stl_lib.math': mock.MagicMock(), + 'stl.trex_stl_lib.os': mock.MagicMock(), + 'stl.trex_stl_lib.platform': mock.MagicMock(), + 'stl.trex_stl_lib.pprint': mock.MagicMock(), + 'stl.trex_stl_lib.random': mock.MagicMock(), + 'stl.trex_stl_lib.re': mock.MagicMock(), + 'stl.trex_stl_lib.scapy': mock.MagicMock(), + 'stl.trex_stl_lib.socket': mock.MagicMock(), + 'stl.trex_stl_lib.string': mock.MagicMock(), + 'stl.trex_stl_lib.struct': mock.MagicMock(), + 'stl.trex_stl_lib.sys': mock.MagicMock(), + 'stl.trex_stl_lib.threading': mock.MagicMock(), + 'stl.trex_stl_lib.time': mock.MagicMock(), + 'stl.trex_stl_lib.traceback': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(), + 'stl.trex_stl_lib.types': mock.MagicMock(), + 'stl.trex_stl_lib.utils': mock.MagicMock(), + 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(), + 'stl.trex_stl_lib.utils.collections': mock.MagicMock(), + 'stl.trex_stl_lib.utils.common': mock.MagicMock(), + 'stl.trex_stl_lib.utils.json': mock.MagicMock(), + 'stl.trex_stl_lib.utils.os': mock.MagicMock(), + 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(), + 'stl.trex_stl_lib.utils.random': mock.MagicMock(), + 'stl.trex_stl_lib.utils.re': mock.MagicMock(), + 'stl.trex_stl_lib.utils.string': mock.MagicMock(), + 'stl.trex_stl_lib.utils.sys': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(), + 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(), + 'stl.trex_stl_lib.warnings': mock.MagicMock(), + 'stl.trex_stl_lib.yaml': mock.MagicMock(), + 'stl.trex_stl_lib.zlib': mock.MagicMock(), + 'stl.trex_stl_lib.zmq': mock.MagicMock(), +} + +STLClient = mock.MagicMock() +stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) +stl_patch.start() + +if stl_patch: + from yardstick.network_services.traffic_profile.base import TrafficProfile + from yardstick.network_services.traffic_profile.traffic_profile import \ + TrexProfile + + +class TestTrexProfile(unittest.TestCase): + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + PROFILE = {'description': 'Traffic profile to run RFC2544 latency', + 'name': 'rfc2544', + 'traffic_profile': {'traffic_type': 'RFC2544Profile', + 'frame_rate': 100}, + 'public': {'ipv4': {'outer_l2': {'framesize': {'64B': '100', + '1518B': '0', + '128B': '0', + '1400B': '0', + '256B': '0', + '373b': '0', + '570B': '0'}, + "srcmac": "00:00:00:00:00:02", + "dstmac": "00:00:00:00:00:01"}, + 'outer_l3v4': {'dstip4': '1.1.1.1-1.1.2.2', + 'proto': 'udp', + 'srcip4': '9.9.1.1-90.1.2.2', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'srcport': '2001', + 'dsrport': '1234'}}}, + 'private': {'ipv4': + {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}, + "srcmac": "00:00:00:00:00:01", + "dstmac": "00:00:00:00:00:02"}, + 'outer_l3v4': {'dstip4': '9.9.1.1-90.105.255.255', + 'proto': 'udp', + 'srcip4': '1.1.1.1-1.15.255.255', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'dstport': '2001', + 'srcport': '1234'}}}, + 'schema': 'isb:traffic_profile:0.1'} + PROFILE_v6 = {'description': 'Traffic profile to run RFC2544 latency', + 'name': 'rfc2544', + 'traffic_profile': {'traffic_type': 'RFC2544Profile', + 'frame_rate': 100}, + 'public': {'ipv6': {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}, + "srcmac": "00:00:00:00:00:02", + "dstmac": "00:00:00:00:00:01"}, + 'outer_l3v4': {'dstip6': '0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420', + 'proto': 'udp', + 'srcip6': '0064:ff9b:0:0:0:0:9810:2814-0064:ff9b:0:0:0:0:9810:2820', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'srcport': '2001', + 'dsrport': '1234'}}}, + 'private': + {'ipv6': {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}, + "srcmac": "00:00:00:00:00:01", + "dstmac": "00:00:00:00:00:02"}, + 'outer_l3v4': {'dstip6': '0064:ff9b:0:0:0:0:9810:2814-0064:ff9b:0:0:0:0:9810:2820', + 'proto': 'udp', + 'srcip6': '0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'dstport': '2001', + 'srcport': '1234'}}}, + 'schema': 'isb:traffic_profile:0.1'} + + def test___init__(self): + TrafficProfile.params = self.PROFILE + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(trex_profile.pps, 100) + + def test_execute(self): + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.execute({})) + + def test_set_src_mac(self): + src_mac = "00:00:00:00:00:01" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_src_mac(src_mac)) + + src_mac = "00:00:00:00:00:01-00:00:00:00:00:02" + self.assertEqual(None, trex_profile.set_src_mac(src_mac)) + + def test_set_dst_mac(self): + dst_mac = "00:00:00:00:00:03" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dst_mac(dst_mac)) + + dst_mac = "00:00:00:00:00:03-00:00:00:00:00:04" + self.assertEqual(None, trex_profile.set_dst_mac(dst_mac)) + + def test_set_src_ip4(self): + src_ipv4 = "152.16.100.20" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_src_ip4(src_ipv4)) + + src_ipv4 = "152.16.100.20-152.16.100.30" + self.assertEqual(None, trex_profile.set_src_ip4(src_ipv4)) + + def test_set_dst_ip4(self): + dst_ipv4 = "152.16.100.20" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dst_ip4(dst_ipv4)) + + dst_ipv4 = "152.16.100.20-152.16.100.30" + self.assertEqual(None, trex_profile.set_dst_ip4(dst_ipv4)) + + def test_set_src_ip6(self): + src_ipv6 = "0064:ff9b:0:0:0:0:9810:6414" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_src_ip6(src_ipv6)) + + src_ipv6 = "0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420" + self.assertEqual(None, trex_profile.set_src_ip6(src_ipv6)) + + def test_set_dst_ip6(self): + dst_ipv6 = "0064:ff9b:0:0:0:0:9810:6414" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dst_ip6(dst_ipv6)) + + dst_ipv6 = "0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420" + self.assertEqual(None, trex_profile.set_dst_ip6(dst_ipv6)) + + def test_dscp(self): + dscp = "0" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dscp(dscp)) + + dscp = "0-1" + self.assertEqual(None, trex_profile.set_dscp(dscp)) + + def test_src_port(self): + port = "1234" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_src_port(port)) + + port = "1234-5678" + self.assertEqual(None, trex_profile.set_src_port(port)) + + def test_dst_port(self): + port = "1234" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dst_port(port)) + + port = "1234-5678" + self.assertEqual(None, trex_profile.set_dst_port(port)) + + def test_qinq(self): + qinq = {"S-VLAN": {"id": 128, "priority": 0, "cfi": 0}, + "C-VLAN": {"id": 512, "priority": 0, "cfi": 0}} + + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_qinq(qinq)) + + qinq = {"S-VLAN": {"id": "128-130", "priority": 0, "cfi": 0}, + "C-VLAN": {"id": "512-515", "priority": 0, "cfi": 0}} + self.assertEqual(None, trex_profile.set_qinq(qinq)) + + def test_set_outer_l2_fields(self): + trex_profile = \ + TrexProfile(TrafficProfile) + qinq = {"S-VLAN": {"id": 128, "priority": 0, "cfi": 0}, + "C-VLAN": {"id": 512, "priority": 0, "cfi": 0}} + outer_l2 = self.PROFILE['private']['ipv4']['outer_l2'] + outer_l2['QinQ'] = qinq + self.assertEqual(None, trex_profile.set_outer_l2_fields(outer_l2)) + + def test_set_outer_l3v4_fields(self): + trex_profile = \ + TrexProfile(TrafficProfile) + outer_l3v4 = self.PROFILE['private']['ipv4']['outer_l3v4'] + outer_l3v4['proto'] = 'tcp' + self.assertEqual(None, trex_profile.set_outer_l3v4_fields(outer_l3v4)) + + def test_set_outer_l3v6_fields(self): + trex_profile = \ + TrexProfile(TrafficProfile) + outer_l3v6 = self.PROFILE_v6['private']['ipv6']['outer_l3v4'] + outer_l3v6['proto'] = 'tcp' + outer_l3v6['tc'] = 1 + outer_l3v6['hlim'] = 10 + self.assertEqual(None, trex_profile.set_outer_l3v6_fields(outer_l3v6)) + + def test_set_outer_l4_fields(self): + trex_profile = \ + TrexProfile(TrafficProfile) + outer_l4 = self.PROFILE['private']['ipv4']['outer_l4'] + self.assertEqual(None, trex_profile.set_outer_l4_fields(outer_l4)) + + def test_get_streams(self): + trex_profile = \ + TrexProfile(TrafficProfile) + trex_profile.params = self.PROFILE + trex_profile.profile_data = self.PROFILE["private"] + self.assertIsNotNone(trex_profile.get_streams()) + trex_profile.pg_id = 1 + self.assertIsNotNone(trex_profile.get_streams()) + trex_profile.params = self.PROFILE_v6 + trex_profile.profile_data = self.PROFILE_v6["private"] + self.assertIsNotNone(trex_profile.get_streams()) + trex_profile.pg_id = 1 + self.assertIsNotNone(trex_profile.get_streams()) + + def test_generate_packets(self): + trex_profile = \ + TrexProfile(TrafficProfile) + trex_profile.fsize = 10 + trex_profile.base_pkt = [10] + self.assertIsNone(trex_profile.generate_packets()) + + def test_generate_imix_data_error(self): + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual({}, trex_profile.generate_imix_data(False)) + + def test__get_start_end_ipv6(self): + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertRaises(SystemExit, trex_profile._get_start_end_ipv6, + "1.1.1.3", "1.1.1.1") diff --git a/tests/unit/network_services/vnf_generic/__init__.py b/tests/unit/network_services/vnf_generic/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/unit/network_services/vnf_generic/__init__.py diff --git a/tests/unit/network_services/vnf_generic/test_vnfdgen.py b/tests/unit/network_services/vnf_generic/test_vnfdgen.py new file mode 100644 index 000000000..6d5fb0c7a --- /dev/null +++ b/tests/unit/network_services/vnf_generic/test_vnfdgen.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Unittest for yardstick.network_services.vnf_generic.vnfdgen + +from __future__ import absolute_import +import unittest +from six.moves import range + +from yardstick.network_services.vnf_generic import vnfdgen + +TREX_VNFD_TEMPLATE = """ +vnfd:vnfd-catalog: + vnfd: + - id: TrexTrafficGen # ISB class mapping + name: trexgen + short-name: trexgen + description: TRex stateless traffic generator for RFC2544 + mgmt-interface: + vdu-id: trexgen-baremetal + user: {{user}} # Value filled by vnfdgen + password: {{password}} # Value filled by vnfdgen + ip: {{ip}} # Value filled by vnfdgen + connection-point: + - name: xe0 + type: VPORT + - name: xe1 + type: VPORT + vdu: + - id: trexgen-baremetal + name: trexgen-baremetal + description: TRex stateless traffic generator for RFC2544 + external-interface: + - name: xe0 + virtual-interface: + type: PCI-PASSTHROUGH + vpci: '{{ interfaces.xe0.vpci}}' + local_ip: '{{ interfaces.xe0.local_ip }}' + dst_ip: '{{ interfaces.xe0.dst_ip }}' + local_mac: '{{ interfaces.xe0.local_mac }}' + dst_mac: '{{ interfaces.xe0.dst_mac }}' + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe0 + - name: xe1 + virtual-interface: + type: PCI-PASSTHROUGH + vpci: '{{ interfaces.xe1.vpci }}' + local_ip: '{{ interfaces.xe1.local_ip }}' + dst_ip: '{{ interfaces.xe1.dst_ip }}' + local_mac: '{{ interfaces.xe1.local_mac }}' + dst_mac: '{{ interfaces.xe1.dst_mac }}' + bandwidth: 10 Gbps + vnfd-connection-point-ref: xe1 + + benchmark: + kpi: + - rx_throughput_fps + - tx_throughput_fps + - tx_throughput_mbps + - rx_throughput_mbps + - tx_throughput_pc_linerate + - rx_throughput_pc_linerate + - min_latency + - max_latency + - avg_latency +""" + +COMPLETE_TREX_VNFD = \ + {'vnfd:vnfd-catalog': + {'vnfd': + [{'benchmark': + {'kpi': + ['rx_throughput_fps', + 'tx_throughput_fps', + 'tx_throughput_mbps', + 'rx_throughput_mbps', + 'tx_throughput_pc_linerate', + 'rx_throughput_pc_linerate', + 'min_latency', + 'max_latency', + 'avg_latency']}, + 'connection-point': [{'name': 'xe0', + 'type': 'VPORT'}, + {'name': 'xe1', + 'type': 'VPORT'}], + 'description': 'TRex stateless traffic generator for RFC2544', + 'id': 'TrexTrafficGen', + 'mgmt-interface': {'ip': '1.1.1.1', + 'password': 'berta', + 'user': 'berta', + 'vdu-id': 'trexgen-baremetal'}, + 'name': 'trexgen', + 'short-name': 'trexgen', + 'vdu': [{'description': 'TRex stateless traffic generator for RFC2544', + 'external-interface': + [{'name': 'xe0', + 'virtual-interface': {'bandwidth': '10 Gbps', + 'dst_ip': '1.1.1.1', + 'dst_mac': '00:01:02:03:04:05', + 'local_ip': '1.1.1.2', + 'local_mac': '00:01:02:03:05:05', + 'type': 'PCI-PASSTHROUGH', + 'vpci': '0000:00:10.2'}, + 'vnfd-connection-point-ref': 'xe0'}, + {'name': 'xe1', + 'virtual-interface': {'bandwidth': '10 Gbps', + 'dst_ip': '2.1.1.1', + 'dst_mac': '00:01:02:03:04:06', + 'local_ip': '2.1.1.2', + 'local_mac': '00:01:02:03:05:06', + 'type': 'PCI-PASSTHROUGH', + 'vpci': '0000:00:10.1'}, + 'vnfd-connection-point-ref': 'xe1'}], + 'id': 'trexgen-baremetal', + 'name': 'trexgen-baremetal'}]}]}} + +NODE_CFG = {'ip': '1.1.1.1', + 'name': 'demeter', + 'password': 'berta', + 'role': 'TrafficGen', + 'user': 'berta', + 'interfaces': {'xe0': {'dpdk_port_num': 1, + 'dst_ip': '1.1.1.1', + 'dst_mac': '00:01:02:03:04:05', + 'local_ip': '1.1.1.2', + 'local_mac': '00:01:02:03:05:05', + 'vpci': '0000:00:10.2'}, + 'xe1': {'dpdk_port_num': 0, + 'dst_ip': '2.1.1.1', + 'dst_mac': '00:01:02:03:04:06', + 'local_ip': '2.1.1.2', + 'local_mac': '00:01:02:03:05:06', + 'vpci': '0000:00:10.1'}}} + + +TRAFFIC_PROFILE_TPL = """ +private: + - ipv4: + outer_l2: + framesize: + 64B: "{{ get(imix, 'private.imix_small', 10) }}" + 128B: "{{ get(imix, 'private.imix_128B', 10) }}" + 256B: "{{ get(imix, 'private.imix_256B', 10) }}" + 373B: "{{ get(imix, 'private.imix_373B', 10) }}" + 570B: "{{get(imix, 'private.imix_570B', 10) }}" + 1400B: "{{get(imix, 'private.imix_1400B', 10) }}" + 1518B: "{{get(imix, 'private.imix_1500B', 40) }}" +""" + +TRAFFIC_PROFILE = { + "private": [{"ipv4": {"outer_l2": + {"framesize": {"64B": '10', "128B": '10', + "256B": '10', "373B": '10', + "570B": '10', "1400B": '10', + "1518B": '40'}}}}]} + + +class TestVnfdGen(unittest.TestCase): + """ Class to verify VNFS testcases """ + + def test_generate_vnfd(self): + """ Function to verify vnfd generation based on template """ + self.maxDiff = None + generated_vnfd = vnfdgen.generate_vnfd(TREX_VNFD_TEMPLATE, NODE_CFG) + self.assertDictEqual(COMPLETE_TREX_VNFD, generated_vnfd) + + def test_generate_tp_no_vars(self): + """ Function to verify traffic profile generation without imix """ + + self.maxDiff = None + generated_tp = vnfdgen.generate_vnfd(TRAFFIC_PROFILE_TPL, {"imix": {}}) + self.assertDictEqual(TRAFFIC_PROFILE, generated_tp) + + def test_dict_flatten_empty_dict(self): + self.assertEqual(vnfdgen.dict_key_flatten({}), {}) + + def test_dict_flatten_int(self): + d = {'a': 1, 'b': 2} + self.assertEqual(vnfdgen.dict_key_flatten(d), d) + + def test_dict_flatten_str(self): + d = {'a': "1", 'b': '2'} + self.assertEqual(vnfdgen.dict_key_flatten(d), d) + + def test_dict_flatten_list(self): + d = {'a': 1, 'b': list(range(2))} + self.assertEqual(vnfdgen.dict_key_flatten(d), + {'a': 1, 'b0': 0, 'b1': 1}) + + def test_dict_flatten_dict(self): + d = {'a': 1, 'b': {x: x for x in list(range(2))}} + self.assertEqual(vnfdgen.dict_key_flatten(d), + {'a': 1, 'b.0': 0, 'b.1': 1}) + + def test_generate_tp_single_var(self): + """ Function to verify traffic profile generation with imix """ + + generated_tp = \ + vnfdgen.generate_vnfd(TRAFFIC_PROFILE_TPL, + {"imix": {"private": {"imix_small": '20'}}}) + self.maxDiff = None + tp2 = dict(TRAFFIC_PROFILE) + tp2["private"][0]["ipv4"]["outer_l2"]["framesize"]["64B"] = '20' + self.assertDictEqual(tp2, generated_tp) diff --git a/tests/unit/network_services/vnf_generic/vnf/__init__.py b/tests/unit/network_services/vnf_generic/vnf/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/__init__.py diff --git a/tests/unit/network_services/vnf_generic/vnf/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml b/tests/unit/network_services/vnf_generic/vnf/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml new file mode 100644 index 000000000..fb1be35c1 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml @@ -0,0 +1,41 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: "../../traffic_profiles/ipv4_throughput_vpe.yaml" + topology: vpe_vnf_topology.yaml + nodes: + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + tc_options: + rfc2544: + allowed_drop_rate: 0.8 - 1 + vnf_options: + vpe: + cfg: vpe_config + runner: + type: Duration + duration: 400 + interval: 35 + traffic_options: + flow: "../../traffic_profiles/ipv4_1flow_Packets_vpe.yaml" + imix: "../../traffic_profiles/imix_voice.yaml" +context: + type: Node + name: yardstick + nfvi_type: baremetal + file: /etc/yardstick/nodes/pod.yaml diff --git a/tests/unit/network_services/vnf_generic/vnf/test_base.py b/tests/unit/network_services/vnf_generic/vnf/test_base.py new file mode 100644 index 000000000..9f2912d1b --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/test_base.py @@ -0,0 +1,270 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Unittest for yardstick.network_services.vnf_generic.vnf.test_base + +from __future__ import absolute_import +import unittest +import mock +from multiprocessing import Queue + +from yardstick.network_services.vnf_generic.vnf.base import \ + QueueFileWrapper, GenericVNF, GenericTrafficGen + +IP_PIPELINE_CFG_FILE_TPL = """ +arp_route_tbl = ({port0_local_ip_hex},{port0_netmask_hex},1,""" +"""{port1_local_ip_hex}) ({port1_local_ip_hex},{port1_netmask_hex},0,""" +"""{port0_local_ip_hex})""" + +IP_PIPELINE_ND_CFG_FILE_TPL = """ +nd_route_tbl = ({port1_dst_ip_hex6},""" +"""{port1_dst_netmask_hex6},1,{port1_dst_ip_hex6})""" + + +class TestQueueFileWrapper(unittest.TestCase): + def setUp(self): + self.prompt = "pipeline>" + self.q_in = Queue() + self.q_out = Queue() + + def test___init__(self): + queue_file_wrapper = \ + QueueFileWrapper(self.q_in, self.q_out, self.prompt) + self.assertEqual(queue_file_wrapper.prompt, self.prompt) + + def test_clear(self): + queue_file_wrapper = \ + QueueFileWrapper(self.q_in, self.q_out, self.prompt) + queue_file_wrapper.bufsize = 5 + queue_file_wrapper.write("pipeline>") + queue_file_wrapper.close() + self.assertIsNotNone(queue_file_wrapper.q_out.empty()) + + def test_close(self): + queue_file_wrapper = \ + QueueFileWrapper(self.q_in, self.q_out, self.prompt) + self.assertEqual(None, queue_file_wrapper.close()) + + def test_read(self): + queue_file_wrapper = \ + QueueFileWrapper(self.q_in, self.q_out, self.prompt) + queue_file_wrapper.q_in.put("pipeline>") + self.assertEqual("pipeline>", queue_file_wrapper.read(20)) + + def test_write(self): + queue_file_wrapper = \ + QueueFileWrapper(self.q_in, self.q_out, self.prompt) + queue_file_wrapper.write("pipeline>") + self.assertIsNotNone(queue_file_wrapper.q_out.empty()) + + +class TestGenericVNF(unittest.TestCase): + VNFD = {'vnfd:vnfd-catalog': + {'vnfd': + [{'short-name': 'VpeVnf', + 'vdu': + [{'routing_table': + [{'network': '152.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'if': 'xe0'}, + {'network': '152.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'if': 'xe1'}], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': + [{'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'id': 'vpevnf-baremetal', + 'external-interface': + [{'virtual-interface': + {'dst_mac': '00:00:00:00:00:03', + 'vpci': '0000:05:00.0', + 'local_ip': '152.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '0', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.100.20', + 'local_mac': '00:00:00:00:00:01'}, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0'}, + {'virtual-interface': + {'dst_mac': '00:00:00:00:00:04', + 'vpci': '0000:05:00.1', + 'local_ip': '152.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '1', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.40.20', + 'local_mac': '00:00:00:00:00:02'}, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1'}]}], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': + {'vdu-id': 'vpevnf-baremetal', + 'host': '1.1.1.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '1.1.1.1'}, + 'benchmark': + {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, + 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, + {'type': 'VPORT', 'name': 'xe1'}], + 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} + + def test___init__(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + assert generic_vn_f.kpi + + def test_collect_kpi(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + self.assertRaises(NotImplementedError, generic_vn_f.collect_kpi) + + def test_get_ip_version(self): + ip_addr = "152.16.1.1" + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + self.assertEqual(4, generic_vn_f.get_ip_version(ip_addr)) + + @mock.patch('yardstick.network_services.vnf_generic.vnf.base.LOG') + def test_get_ip_version_error(self, mock_LOG): + ip_addr = "152.16.1.1.1" + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + self.assertRaises(ValueError, generic_vn_f.get_ip_version(ip_addr)) + + def test_ip_to_hex(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + hex_ip = generic_vn_f._ip_to_hex("192.168.10.1") + self.assertEqual("C0A80A01", hex_ip) + + def test_append_routes(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + arp_route = generic_vn_f._append_routes(IP_PIPELINE_CFG_FILE_TPL) + expected = '\narp_route_tbl = (98106414,FFFFFF00,0,98106414)' \ + ' (98102814,FFFFFF00,1,98102814)\n,' + self.assertEqual(expected, arp_route) + + def test_append_nd_routes(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + nd_route = generic_vn_f._append_nd_routes(IP_PIPELINE_ND_CFG_FILE_TPL) + expected = '\nnd_route_tbl = (0064:ff9b:0:0:0:0:9810:6414,112,0,' \ + '0064:ff9b:0:0:0:0:9810:6414) '\ + '(0064:ff9b:0:0:0:0:9810:2814,112,'\ + '1,0064:ff9b:0:0:0:0:9810:2814)\n,' + self.assertEqual(expected, nd_route) + + def test_get_port0localip6(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + port0_v6 = generic_vn_f._get_port0localip6() + expected = '0064:ff9b:0:0:0:0:9810:6414' + self.assertEqual(expected, port0_v6) + + def test_get_port1localip6(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + port1_v6 = generic_vn_f._get_port1localip6() + expected = '0064:ff9b:0:0:0:0:9810:2814' + self.assertEqual(expected, port1_v6) + + def test_get_port0prefixip6(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + port0_v6 = generic_vn_f._get_port0prefixlen6() + self.assertEqual('112', port0_v6) + + def test_get_port1prefixip6(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + port1_v6 = generic_vn_f._get_port1prefixlen6() + self.assertEqual('112', port1_v6) + + def test_get_port0gateway6(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + port0_v6 = generic_vn_f._get_port0gateway6() + self.assertEqual('0064:ff9b:0:0:0:0:9810:6414', port0_v6) + + def test_get_port1gateway6(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + port1_v6 = generic_vn_f._get_port1gateway6() + self.assertEqual('0064:ff9b:0:0:0:0:9810:2814', port1_v6) + + def test_get_dpdk_port_num(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + port_num = generic_vn_f._get_dpdk_port_num('xe0') + self.assertEqual('0', port_num) + + def test__get_kpi_definition(self): + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + generic_vn_f = GenericVNF(vnfd) + kpi = \ + generic_vn_f._get_kpi_definition(vnfd) + self.assertEqual(kpi, ['packets_in', 'packets_fwd', 'packets_dropped']) + + def test_instantiate(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + self.assertRaises(NotImplementedError, + generic_vn_f.instantiate, {}, {}) + + def test_scale(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + self.assertRaises(NotImplementedError, generic_vn_f.scale) + + def test_terminate(self): + generic_vn_f = GenericVNF(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + self.assertRaises(NotImplementedError, generic_vn_f.terminate) + + +class TestGenericTrafficGen(unittest.TestCase): + def test___init__(self): + vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + generic_traffic_gen = \ + GenericTrafficGen(vnfd) + assert generic_traffic_gen.name == "tgen__1" + + def test_listen_traffic(self): + vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + generic_traffic_gen = \ + GenericTrafficGen(vnfd) + traffic_profile = {} + self.assertIsNone(generic_traffic_gen.listen_traffic(traffic_profile)) + + def test_run_traffic(self): + vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + generic_traffic_gen = \ + GenericTrafficGen(vnfd) + traffic_profile = {} + self.assertRaises(NotImplementedError, + generic_traffic_gen.run_traffic, traffic_profile) + + def test_terminate(self): + vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + generic_traffic_gen = \ + GenericTrafficGen(vnfd) + self.assertRaises(NotImplementedError, generic_traffic_gen.terminate) + + def test_verify_traffic(self): + vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + generic_traffic_gen = \ + GenericTrafficGen(vnfd) + traffic_profile = {} + self.assertIsNone(generic_traffic_gen.verify_traffic(traffic_profile)) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py new file mode 100644 index 000000000..4f0855543 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py @@ -0,0 +1,247 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +import unittest +import mock +from multiprocessing import Queue + +from yardstick.network_services.vnf_generic.vnf.tg_ping import \ + PingParser, PingTrafficGen +from yardstick.network_services.traffic_profile.base import TrafficProfile + + +class TestPingParser(unittest.TestCase): + def test___init__(self): + q_out = Queue() + ping_parser = PingParser(q_out) + self.assertIsNotNone(ping_parser.queue) + + def test_clear(self): + sample_out = """ +64 bytes from 10.102.22.93: icmp_seq=3 ttl=64 time=0.296 ms + """ + q_out = Queue() + ping_parser = PingParser(q_out) + ping_parser.write(sample_out) + ping_parser.clear() + self.assertEqual(True, q_out.empty()) + + def test_close(self): + q_out = Queue() + ping_parser = PingParser(q_out) + self.assertIsNone(ping_parser.close()) + + def test_write(self): + sample_out = """ +64 bytes from 10.102.22.93: icmp_seq=3 ttl=64 time=0.296 ms + """ + q_out = Queue() + ping_parser = PingParser(q_out) + ping_parser.write(sample_out) + + self.assertEqual({"packets_received": 3.0, "rtt": 0.296}, q_out.get()) + + +class TestPingTrafficGen(unittest.TestCase): + VNFD = {'vnfd:vnfd-catalog': + {'vnfd': + [{'short-name': 'VpeVnf', + 'vdu': + [{'routing_table': + [{'network': '152.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'if': 'xe0'}, + {'network': '152.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'if': 'xe1'}], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': + [{'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'id': 'vpevnf-baremetal', + 'external-interface': + [{'virtual-interface': + {'dst_mac': '00:00:00:00:00:04', + 'vpci': '0000:05:00.0', + 'local_ip': '152.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '0', + 'bandwidth': '10 Gbps', + 'driver': "i40e", + 'dst_ip': '152.16.100.20', + 'local_iface_name': 'xe0', + 'local_mac': '00:00:00:00:00:02'}, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0'}, + {'virtual-interface': + {'dst_mac': '00:00:00:00:00:03', + 'vpci': '0000:05:00.1', + 'local_ip': '152.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'driver': "i40e", + 'netmask': '255.255.255.0', + 'dpdk_port_num': '1', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.40.20', + 'local_iface_name': 'xe1', + 'local_mac': '00:00:00:00:00:01'}, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1'}]}], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': + {'vdu-id': 'vpevnf-baremetal', + 'host': '1.1.1.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '1.1.1.1'}, + 'benchmark': + {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, + 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, + {'type': 'VPORT', 'name': 'xe1'}], + 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} + + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + def test___init__(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ping_traffic_gen = PingTrafficGen(vnfd) + self.assertEqual(ping_traffic_gen._queue, None) + + def test_collect_kpi(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + ping_traffic_gen = PingTrafficGen(vnfd) + ping_traffic_gen._queue = Queue() + ping_traffic_gen._queue.put({}) + ping_traffic_gen.collect_kpi() + self.assertEqual({}, ping_traffic_gen._result) + + def test_instantiate(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ping_traffic_gen = PingTrafficGen(vnfd) + self.assertEqual(None, ping_traffic_gen.instantiate({}, {})) + + def test_listen_traffic(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ping_traffic_gen = PingTrafficGen(vnfd) + self.assertEqual(None, ping_traffic_gen.listen_traffic({})) + + def test_run_traffic(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + self.sut = PingTrafficGen(vnfd) + self.sut.connection = mock.Mock() + self.sut.connection.run = mock.Mock() + self.sut._traffic_runner = mock.Mock(return_value=0) + self.assertEqual( + False, self.sut.run_traffic(mock_traffic_profile)) + + def test_run_traffic_process(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + self.sut = PingTrafficGen(vnfd) + self.sut.connection = mock.Mock() + self.sut.connection.run = mock.Mock() + q = Queue() + self.sut._traffic_runner(mock_traffic_profile, q) + self.sut.connection.run.assert_called_with( + "ping -s 64 152.16.100.20", + stdout=q, keep_stdin_open=True, pty=True) + + def test_scale(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + flavor = "" + ping_traffic_gen = PingTrafficGen(vnfd) + self.assertRaises(NotImplementedError, ping_traffic_gen.scale, flavor) + + def test_terminate(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ping_traffic_gen = PingTrafficGen(vnfd) + self.assertEqual(None, ping_traffic_gen.terminate()) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py new file mode 100644 index 000000000..eda5cea84 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py @@ -0,0 +1,406 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +import unittest +import mock +import os +import multiprocessing +from multiprocessing import Queue + +STL_MOCKS = { + 'stl': mock.MagicMock(), + 'stl.trex_stl_lib': mock.MagicMock(), + 'stl.trex_stl_lib.base64': mock.MagicMock(), + 'stl.trex_stl_lib.binascii': mock.MagicMock(), + 'stl.trex_stl_lib.collections': mock.MagicMock(), + 'stl.trex_stl_lib.copy': mock.MagicMock(), + 'stl.trex_stl_lib.datetime': mock.MagicMock(), + 'stl.trex_stl_lib.functools': mock.MagicMock(), + 'stl.trex_stl_lib.imp': mock.MagicMock(), + 'stl.trex_stl_lib.inspect': mock.MagicMock(), + 'stl.trex_stl_lib.json': mock.MagicMock(), + 'stl.trex_stl_lib.linecache': mock.MagicMock(), + 'stl.trex_stl_lib.math': mock.MagicMock(), + 'stl.trex_stl_lib.os': mock.MagicMock(), + 'stl.trex_stl_lib.platform': mock.MagicMock(), + 'stl.trex_stl_lib.pprint': mock.MagicMock(), + 'stl.trex_stl_lib.random': mock.MagicMock(), + 'stl.trex_stl_lib.re': mock.MagicMock(), + 'stl.trex_stl_lib.scapy': mock.MagicMock(), + 'stl.trex_stl_lib.socket': mock.MagicMock(), + 'stl.trex_stl_lib.string': mock.MagicMock(), + 'stl.trex_stl_lib.struct': mock.MagicMock(), + 'stl.trex_stl_lib.sys': mock.MagicMock(), + 'stl.trex_stl_lib.threading': mock.MagicMock(), + 'stl.trex_stl_lib.time': mock.MagicMock(), + 'stl.trex_stl_lib.traceback': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(), + 'stl.trex_stl_lib.types': mock.MagicMock(), + 'stl.trex_stl_lib.utils': mock.MagicMock(), + 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(), + 'stl.trex_stl_lib.utils.collections': mock.MagicMock(), + 'stl.trex_stl_lib.utils.common': mock.MagicMock(), + 'stl.trex_stl_lib.utils.json': mock.MagicMock(), + 'stl.trex_stl_lib.utils.os': mock.MagicMock(), + 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(), + 'stl.trex_stl_lib.utils.random': mock.MagicMock(), + 'stl.trex_stl_lib.utils.re': mock.MagicMock(), + 'stl.trex_stl_lib.utils.string': mock.MagicMock(), + 'stl.trex_stl_lib.utils.sys': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(), + 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(), + 'stl.trex_stl_lib.warnings': mock.MagicMock(), + 'stl.trex_stl_lib.yaml': mock.MagicMock(), + 'stl.trex_stl_lib.zlib': mock.MagicMock(), + 'stl.trex_stl_lib.zmq': mock.MagicMock(), +} + +STLClient = mock.MagicMock() +stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) +stl_patch.start() + +if stl_patch: + from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_trex import \ + TrexTrafficGenRFC + from yardstick.network_services.vnf_generic.vnf import tg_rfc2544_trex + from yardstick.network_services.traffic_profile.base import TrafficProfile + + +class TestTrexTrafficGenRFC(unittest.TestCase): + VNFD = {'vnfd:vnfd-catalog': + {'vnfd': + [{'short-name': 'VpeVnf', + 'vdu': + [{'routing_table': + [{'network': '152.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'if': 'xe0'}, + {'network': '152.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'if': 'xe1'}], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': + [{'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'id': 'vpevnf-baremetal', + 'external-interface': + [{'virtual-interface': + {'dst_mac': '00:00:00:00:00:04', + 'vpci': '0000:05:00.0', + 'local_ip': '152.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '0', + 'bandwidth': '10 Gbps', + 'driver': "i40e", + 'dst_ip': '152.16.100.20', + 'local_iface_name': 'xe0', + 'local_mac': '00:00:00:00:00:01'}, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0'}, + {'virtual-interface': + {'dst_mac': '00:00:00:00:00:03', + 'vpci': '0000:05:00.1', + 'local_ip': '152.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'driver': "i40e", + 'netmask': '255.255.255.0', + 'dpdk_port_num': '1', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.40.20', + 'local_iface_name': 'xe1', + 'local_mac': '00:00:00:00:00:02'}, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1'}]}], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': + {'vdu-id': 'vpevnf-baremetal', + 'host': '1.1.1.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '1.1.1.1'}, + 'benchmark': + {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, + 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, + {'type': 'VPORT', 'name': 'xe1'}], + 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} + + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + TC_YAML = {'scenarios': [{'tc_options': + {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}}, + 'runner': {'duration': 400, + 'interval': 35, 'type': 'Duration'}, + 'traffic_options': + {'flow': 'ipv4_1flow_Packets_vpe.yaml', + 'imix': 'imix_voice.yaml'}, + 'vnf_options': {'vpe': {'cfg': 'vpe_config'}}, + 'traffic_profile': 'ipv4_throughput_vpe.yaml', + 'type': 'NSPerf', + 'nodes': {'tg__1': 'trafficgen_1.yardstick', + 'vnf__1': 'vnf.yardstick'}, + 'topology': 'vpe_vnf_topology.yaml'}], + 'context': {'nfvi_type': 'baremetal', 'type': 'Node', + 'name': 'yardstick', + 'file': '/etc/yardstick/nodes/pod.yaml'}, + 'schema': 'yardstick:task:0.1'} + + def test___init__(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + self.assertIsNotNone(trex_traffic_gen._terminated) + + def test_collect_kpi(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + restult = trex_traffic_gen.collect_kpi() + self.assertEqual({}, restult) + + def test_listen_traffic(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + self.assertEqual(None, trex_traffic_gen.listen_traffic({})) + + def test_instantiate(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + trex_traffic_gen._start_server = mock.Mock(return_value=0) + scenario_cfg = {"tc": "tc_baremetal_rfc2544_ipv4_1flow_64B"} + tg_rfc2544_trex.WAIT_TIME = 3 + self.assertEqual(0, trex_traffic_gen.instantiate(scenario_cfg, {})) + + def test_instantiate_error(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + scenario_cfg = {"tc": "tc_baremetal_rfc2544_ipv4_1flow_64B"} + self.assertRaises(RuntimeError, + trex_traffic_gen.instantiate, scenario_cfg, {}) + + def test__get_rfc_tolerance(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + self.assertEqual([0.8, 1.0], + trex_traffic_gen._get_rfc_tolerance(self.TC_YAML)) + self.TC_YAML["scenarios"][0]["tc_options"]['rfc2544'][ + 'allowed_drop_rate'] = '0.8' + self.assertEqual([0.8, 0.8], + trex_traffic_gen._get_rfc_tolerance(self.TC_YAML)) + + def test__start_server(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + self.assertEqual(None, trex_traffic_gen._start_server()) + + def _get_file_abspath(self, filename): + curr_path = os.path.dirname(os.path.abspath(__file__)) + file_path = os.path.join(curr_path, filename) + return file_path + + def test__traffic_runner(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.execute.return_value = "64" + mock_traffic_profile.get_drop_percentage.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + self.sut = TrexTrafficGenRFC(vnfd) + self.sut.connection = mock.Mock() + self.sut.connection.run = mock.Mock() + q = Queue() + client_started = multiprocessing.Value('i', 1) + self.sut._vpci_ascending = ["0000:05:00.0", "0000:05:00.1"] + self.sut._connect_client = mock.Mock(autospec=STLClient) + self.sut._connect_client.get_stats = mock.Mock(return_value="0") + self.sut.tc_file_name = \ + self._get_file_abspath( + "tc_baremetal_rfc2544_ipv4_1flow_64B.yaml") + tg_rfc2544_trex.DURATION = 1 + tg_rfc2544_trex.WAIT_TIME = 1 + self.sut._traffic_runner(mock_traffic_profile, q, client_started, + self.sut._terminated) + + def test__split_mac_address_into_list(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + result = ['0x00', '0x00', '0x00', '0x00', '0x00', '0x01'] + self.assertEqual(result, + trex_traffic_gen._split_mac_address_into_list( + "00:00:00:00:00:01")) + + def test__generate_trex_cfg(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + tg_rfc2544_trex.WAIT_TIME = 1 + self.assertEqual(None, trex_traffic_gen._generate_trex_cfg(vnfd)) + + def test_run_traffic(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + self.sut = TrexTrafficGenRFC(vnfd) + self.sut.connection = mock.Mock() + self.sut.connection.run = mock.Mock() + self.sut._traffic_runner = mock.Mock(return_value=0) + client_started = multiprocessing.Value('i', 1) + result = self.sut.run_traffic(mock_traffic_profile, client_started) + self.sut._traffic_process.terminate() + self.assertIsNotNone(result) + + def test_scale(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + flavor = "" + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + self.assertRaises(NotImplementedError, + trex_traffic_gen.scale, flavor) + + def test_terminate(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + self.assertEqual(None, trex_traffic_gen.terminate()) + + def test__connect_client(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + trex_traffic_gen = TrexTrafficGenRFC(vnfd) + client = mock.Mock(autospec=STLClient) + client.connect = mock.Mock(return_value=0) + self.assertIsNotNone(trex_traffic_gen._connect_client(client)) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py new file mode 100644 index 000000000..a76fbbd2a --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py @@ -0,0 +1,368 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +import unittest +import mock +import multiprocessing +from multiprocessing import Queue + + +STL_MOCKS = { + 'stl': mock.MagicMock(), + 'stl.trex_stl_lib': mock.MagicMock(), + 'stl.trex_stl_lib.base64': mock.MagicMock(), + 'stl.trex_stl_lib.binascii': mock.MagicMock(), + 'stl.trex_stl_lib.collections': mock.MagicMock(), + 'stl.trex_stl_lib.copy': mock.MagicMock(), + 'stl.trex_stl_lib.datetime': mock.MagicMock(), + 'stl.trex_stl_lib.functools': mock.MagicMock(), + 'stl.trex_stl_lib.imp': mock.MagicMock(), + 'stl.trex_stl_lib.inspect': mock.MagicMock(), + 'stl.trex_stl_lib.json': mock.MagicMock(), + 'stl.trex_stl_lib.linecache': mock.MagicMock(), + 'stl.trex_stl_lib.math': mock.MagicMock(), + 'stl.trex_stl_lib.os': mock.MagicMock(), + 'stl.trex_stl_lib.platform': mock.MagicMock(), + 'stl.trex_stl_lib.pprint': mock.MagicMock(), + 'stl.trex_stl_lib.random': mock.MagicMock(), + 'stl.trex_stl_lib.re': mock.MagicMock(), + 'stl.trex_stl_lib.scapy': mock.MagicMock(), + 'stl.trex_stl_lib.socket': mock.MagicMock(), + 'stl.trex_stl_lib.string': mock.MagicMock(), + 'stl.trex_stl_lib.struct': mock.MagicMock(), + 'stl.trex_stl_lib.sys': mock.MagicMock(), + 'stl.trex_stl_lib.threading': mock.MagicMock(), + 'stl.trex_stl_lib.time': mock.MagicMock(), + 'stl.trex_stl_lib.traceback': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(), + 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(), + 'stl.trex_stl_lib.types': mock.MagicMock(), + 'stl.trex_stl_lib.utils': mock.MagicMock(), + 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(), + 'stl.trex_stl_lib.utils.collections': mock.MagicMock(), + 'stl.trex_stl_lib.utils.common': mock.MagicMock(), + 'stl.trex_stl_lib.utils.json': mock.MagicMock(), + 'stl.trex_stl_lib.utils.os': mock.MagicMock(), + 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(), + 'stl.trex_stl_lib.utils.random': mock.MagicMock(), + 'stl.trex_stl_lib.utils.re': mock.MagicMock(), + 'stl.trex_stl_lib.utils.string': mock.MagicMock(), + 'stl.trex_stl_lib.utils.sys': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(), + 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(), + 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(), + 'stl.trex_stl_lib.warnings': mock.MagicMock(), + 'stl.trex_stl_lib.yaml': mock.MagicMock(), + 'stl.trex_stl_lib.zlib': mock.MagicMock(), + 'stl.trex_stl_lib.zmq': mock.MagicMock(), +} + +STLClient = mock.MagicMock() +stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) +stl_patch.start() + +if stl_patch: + from yardstick.network_services.vnf_generic.vnf.tg_trex import \ + TrexTrafficGen + from yardstick.network_services.traffic_profile.base import TrafficProfile + + +class TestTrexTrafficGen(unittest.TestCase): + VNFD = {'vnfd:vnfd-catalog': + {'vnfd': + [{'short-name': 'VpeVnf', + 'vdu': + [{'routing_table': + [{'network': '152.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'if': 'xe0'}, + {'network': '152.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'if': 'xe1'}], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': + [{'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'id': 'vpevnf-baremetal', + 'external-interface': + [{'virtual-interface': + {'dst_mac': '00:00:00:00:00:04', + 'vpci': '0000:05:00.0', + 'local_ip': '152.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '0', + 'bandwidth': '10 Gbps', + 'driver': "i40e", + 'dst_ip': '152.16.100.20', + 'local_iface_name': 'xe0', + 'local_mac': '00:00:00:00:00:02'}, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0'}, + {'virtual-interface': + {'dst_mac': '00:00:00:00:00:03', + 'vpci': '0000:05:00.1', + 'local_ip': '152.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'driver': "i40e", + 'netmask': '255.255.255.0', + 'dpdk_port_num': '1', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.40.20', + 'local_iface_name': 'xe1', + 'local_mac': '00:00:00:00:00:01'}, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1'}]}], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': + {'vdu-id': 'vpevnf-baremetal', + 'host': '1.1.1.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '1.1.1.1'}, + 'benchmark': + {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, + 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, + {'type': 'VPORT', 'name': 'xe1'}], + 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} + + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + def test___init__(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertIsNotNone(trex_traffic_gen._terminated) + + def test_collect_kpi(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + trex_traffic_gen._queue.put({}) + restult = trex_traffic_gen.collect_kpi() + self.assertEqual({}, restult) + + def test_listen_traffic(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertEqual(None, trex_traffic_gen.listen_traffic({})) + + def test_instantiate(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertEqual(0, trex_traffic_gen.instantiate({}, {})) + + def test_instantiate_error(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertRaises(RuntimeError, + trex_traffic_gen.instantiate, {}, {}) + + def test__start_server(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertEqual(None, trex_traffic_gen._start_server()) + + def test__traffic_runner(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.execute.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + self.sut = TrexTrafficGen(vnfd) + self.sut.connection = mock.Mock() + self.sut.connection.run = mock.Mock() + q = Queue() + client_started = multiprocessing.Value('i', 1) + self.sut._vpci_ascending = ["0000:05:00.0", "0000:05:00.1"] + self.sut._connect_client = mock.Mock(autospec=STLClient) + self.sut._connect_client.get_stats = mock.Mock(return_value="0") + self.sut._traffic_runner(mock_traffic_profile, q, client_started, + self.sut._terminated) + + def test__generate_trex_cfg(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertEqual(None, trex_traffic_gen._generate_trex_cfg(vnfd)) + + def test__split_mac_address_into_list(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + result = ['0x00', '0x00', '0x00', '0x00', '0x00', '0x01'] + self.assertEqual( + result, trex_traffic_gen._split_mac_address_into_list( + "00:00:00:00:00:01")) + + def test_run_traffic(self): + mock_traffic_profile = mock.Mock(autospec=TrafficProfile) + mock_traffic_profile.get_traffic_definition.return_value = "64" + mock_traffic_profile.params = self.TRAFFIC_PROFILE + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + self.sut = TrexTrafficGen(vnfd) + self.sut.connection = mock.Mock() + self.sut.connection.run = mock.Mock() + self.sut._traffic_runner = mock.Mock(return_value=0) + self.sut.client_started.value = 1 + result = self.sut.run_traffic(mock_traffic_profile) + self.sut._traffic_process.terminate() + self.assertIsNotNone(result) + + def test_scale(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + flavor = "" + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertRaises(NotImplementedError, + trex_traffic_gen.scale, flavor) + + def test_setup_vnf_environment(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, "", "")) + ssh.return_value = ssh_mock + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertEqual( + None, trex_traffic_gen.setup_vnf_environment(ssh_mock)) + + def test_terminate(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + trex_traffic_gen = TrexTrafficGen(vnfd) + self.assertEqual(None, trex_traffic_gen.terminate()) + + def test__connect_client(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + trex_traffic_gen = TrexTrafficGen(vnfd) + client = mock.Mock(autospec=STLClient) + client.connect = mock.Mock(return_value=0) + self.assertIsNotNone(trex_traffic_gen._connect_client(client)) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py new file mode 100644 index 000000000..36b8c2a22 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py @@ -0,0 +1,347 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import absolute_import +import unittest +import mock +import os + +from yardstick.network_services.vnf_generic.vnf.vpe_vnf import VpeApproxVnf +from yardstick.network_services.vnf_generic.vnf import vpe_vnf +from yardstick.network_services.nfvi.resource import ResourceProfile +from yardstick.network_services.vnf_generic.vnf.base import \ + QueueFileWrapper + + +class TestVpeApproxVnf(unittest.TestCase): + VNFD = {'vnfd:vnfd-catalog': + {'vnfd': + [{'short-name': 'VpeVnf', + 'vdu': + [{'routing_table': + [{'network': '152.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'if': 'xe0'}, + {'network': '152.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'if': 'xe1'}], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': + [{'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'id': 'vpevnf-baremetal', + 'external-interface': + [{'virtual-interface': + {'dst_mac': '00:00:00:00:00:04', + 'vpci': '0000:05:00.0', + 'local_ip': '152.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': '0', + 'bandwidth': '10 Gbps', + 'driver': "i40e", + 'dst_ip': '152.16.100.20', + 'local_iface_name': 'xe0', + 'local_mac': '00:00:00:00:00:02'}, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0'}, + {'virtual-interface': + {'dst_mac': '00:00:00:00:00:03', + 'vpci': '0000:05:00.1', + 'local_ip': '152.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'driver': "i40e", + 'netmask': '255.255.255.0', + 'dpdk_port_num': '1', + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.40.20', + 'local_iface_name': 'xe1', + 'local_mac': '00:00:00:00:00:01'}, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1'}]}], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': + {'vdu-id': 'vpevnf-baremetal', + 'host': '1.2.1.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '1.2.1.1'}, + 'benchmark': + {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, + 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, + {'type': 'VPORT', 'name': 'xe1'}], + 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} + + scenario_cfg = {'tc_options': {'rfc2544': + {'allowed_drop_rate': '0.8 - 1'}}, + 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', + 'tc': 'tc_ipv4_1Mflow_64B_packetsize', + 'runner': {'object': 'NetworkServiceTestCase', + 'interval': 35, + 'output_filename': '/tmp/yardstick.out', + 'runner_id': 74476, 'duration': 400, + 'type': 'Duration'}, + 'traffic_profile': 'ipv4_throughput_vpe.yaml', + 'traffic_options': {'flow': 'ipv4_Packets_vpe.yaml', + 'imix': 'imix_voice.yaml'}, + 'type': 'ISB', + 'nodes': {'tg__2': 'trafficgen_2.yardstick', + 'tg__1': 'trafficgen_1.yardstick', + 'vnf__1': 'vnf.yardstick'}, + 'topology': 'vpe-tg-topology-baremetal.yaml'} + + context_cfg = {'nodes': {'tg__2': + {'member-vnf-index': '3', + 'role': 'TrafficGen', + 'name': 'trafficgen_2.yardstick', + 'vnfd-id-ref': 'tg__2', + 'ip': '1.2.1.1', + 'interfaces': + {'xe0': {'local_iface_name': 'ens513f0', + 'vld_id': 'public', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.40.20', + 'dst_mac': '00:00:00:00:00:01', + 'local_mac': '00:00:00:00:00:03', + 'dst_ip': '152.16.40.19', + 'driver': 'ixgbe', + 'vpci': '0000:02:00.0', + 'dpdk_port_num': 0}, + 'xe1': {'local_iface_name': 'ens513f1', + 'netmask': '255.255.255.0', + 'network': '202.16.100.0', + 'local_ip': '202.16.100.20', + 'local_mac': '00:1e:67:d0:60:5d', + 'driver': 'ixgbe', + 'vpci': '0000:02:00.1', + 'dpdk_port_num': 1}}, + 'password': 'r00t', + 'VNF model': 'l3fwd_vnf.yaml', + 'user': 'root'}, + 'tg__1': + {'member-vnf-index': '1', + 'role': 'TrafficGen', + 'name': 'trafficgen_1.yardstick', + 'vnfd-id-ref': 'tg__1', + 'ip': '1.2.1.1', + 'interfaces': + {'xe0': {'local_iface_name': 'ens785f0', + 'vld_id': 'private', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.100.20', + 'dst_mac': '00:00:00:00:00:02', + 'local_mac': '00:00:00:00:00:04', + 'dst_ip': '152.16.100.19', + 'driver': 'i40e', + 'vpci': '0000:05:00.0', + 'dpdk_port_num': 0}, + 'xe1': {'local_iface_name': 'ens785f1', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.100.21', + 'local_mac': '00:00:00:00:00:01', + 'driver': 'i40e', + 'vpci': '0000:05:00.1', + 'dpdk_port_num': 1}}, + 'password': 'r00t', + 'VNF model': 'tg_rfc2544_tpl.yaml', + 'user': 'root'}, + 'vnf__1': + {'name': 'vnf.yardstick', + 'vnfd-id-ref': 'vnf__1', + 'ip': '1.2.1.1', + 'interfaces': + {'xe0': {'local_iface_name': 'ens786f0', + 'vld_id': 'private', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.100.19', + 'dst_mac': '00:00:00:00:00:04', + 'local_mac': '00:00:00:00:00:02', + 'dst_ip': '152.16.100.20', + 'driver': 'i40e', + 'vpci': '0000:05:00.0', + 'dpdk_port_num': 0}, + 'xe1': {'local_iface_name': 'ens786f1', + 'vld_id': 'public', + 'netmask': '255.255.255.0', + 'local_ip': '152.16.40.19', + 'dst_mac': '00:00:00:00:00:03', + 'local_mac': '00:00:00:00:00:01', + 'dst_ip': '152.16.40.20', + 'driver': 'i40e', + 'vpci': '0000:05:00.1', + 'dpdk_port_num': 1}}, + 'routing_table': + [{'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'network': '152.16.100.20', + 'if': 'xe0'}, + {'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'network': '152.16.40.20', + 'if': 'xe1'}], + 'member-vnf-index': '2', + 'host': '1.2.1.1', + 'role': 'vnf', + 'user': 'root', + 'nd_route_tbl': + [{'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'network': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0'}, + {'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'network': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1'}], + 'password': 'r00t', + 'VNF model': 'vpe_vnf.yaml'}}} + + def test___init__(self): + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + self.assertIsNone(vpe_approx_vnf._vnf_process) + + def test_collect_kpi(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + vpe_approx_vnf.resource = mock.Mock(autospec=ResourceProfile) + vpe_approx_vnf.resource.check_if_sa_running = \ + mock.Mock(return_value=[0, 1]) + vpe_approx_vnf.resource.amqp_collect_nfvi_kpi= \ + mock.Mock(return_value={}) + result = {'pkt_in_down_stream': 0, + 'pkt_in_up_stream': 0, + 'collect_stats': {'core': {}}, + 'pkt_drop_down_stream': 0, 'pkt_drop_up_stream': 0} + self.assertEqual(result, vpe_approx_vnf.collect_kpi()) + + def test_execute_command(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + cmd = "quit" + self.assertEqual("", vpe_approx_vnf.execute_command(cmd)) + + def test_get_stats_vpe(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + vpe_approx_vnf.execute_command = \ + mock.Mock(return_value="Pkts in: 101\r\n\tPkts dropped by AH: 100\r\n\tPkts dropped by other: 100") + result = {'pkt_in_down_stream': 202, 'pkt_in_up_stream': 303, + 'pkt_drop_down_stream': 400, 'pkt_drop_up_stream': 600} + self.assertEqual(result, vpe_approx_vnf.get_stats_vpe()) + + def test_run_vpe(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh_mock.run = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + curr_path = os.path.dirname(os.path.abspath(__file__)) + vpe_vnf = os.path.join(curr_path, "vpe_config") + queue_wrapper = \ + QueueFileWrapper(vpe_approx_vnf.q_in, + vpe_approx_vnf.q_out, "pipeline>") + self.assertEqual(None, + vpe_approx_vnf._run_vpe(queue_wrapper, vpe_vnf)) + + def test_instantiate(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + self.scenario_cfg['vnf_options'] = {'vpe': {'cfg': ""}} + vpe_approx_vnf._run_vpe = mock.Mock(return_value=0) + vpe_approx_vnf._resource_collect_start = mock.Mock(return_value=0) + vpe_approx_vnf.q_out.put("pipeline>") + vpe_vnf.WAIT_TIME = 3 + self.assertEqual(0, vpe_approx_vnf.instantiate(self.scenario_cfg, + self.context_cfg)) + + def test_instantiate_panic(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + self.scenario_cfg['vnf_options'] = {'vpe': {'cfg': ""}} + vpe_approx_vnf._run_vpe = mock.Mock(return_value=0) + vpe_vnf.WAIT_TIME = 1 + self.assertRaises(RuntimeError, vpe_approx_vnf.instantiate, + self.scenario_cfg, self.context_cfg) + + def test_scale(self): + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + flavor = "" + self.assertRaises(NotImplementedError, vpe_approx_vnf.scale, flavor) + + def test_setup_vnf_environment(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "", "")) + ssh.return_value = ssh_mock + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + self.assertEqual(None, + vpe_approx_vnf.setup_vnf_environment(ssh_mock)) + + def test_terminate(self): + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vpe_approx_vnf = VpeApproxVnf(vnfd) + self.assertEqual(None, vpe_approx_vnf.terminate()) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/unit/network_services/vnf_generic/vnf/vpe_config/action_bulk_512.txt b/tests/unit/network_services/vnf_generic/vnf/vpe_config/action_bulk_512.txt new file mode 100644 index 000000000..21731cd45 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/vpe_config/action_bulk_512.txt @@ -0,0 +1,512 @@ +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 +flow 3 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 4 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 5 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 6 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 7 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 8 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 9 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 10 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 11 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 12 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 13 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 14 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 15 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 16 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 17 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 18 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 19 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 20 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 21 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 22 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 23 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 24 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 25 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 26 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 27 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 28 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 29 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 30 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 31 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 32 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 33 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 34 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 35 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 36 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 37 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 38 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 39 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 40 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 41 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 42 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 43 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 44 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 45 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 46 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 47 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 48 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 49 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 50 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 51 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 52 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 53 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 54 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 55 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 56 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 57 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 58 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 59 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 60 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 61 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 62 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 63 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 64 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 65 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 66 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 67 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 68 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 69 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 70 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 71 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 72 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 73 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 74 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 75 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 76 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 77 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 78 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 79 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 80 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 81 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 82 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 83 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 84 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 85 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 86 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 87 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 88 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 89 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 90 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 91 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 92 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 93 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 94 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 95 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 96 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 97 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 98 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 99 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 100 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 101 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 102 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 103 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 104 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 105 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 106 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 107 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 108 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 109 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 110 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 111 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 112 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 113 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 114 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 115 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 116 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 117 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 118 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 119 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 120 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 121 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 122 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 123 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 124 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 125 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 126 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 127 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 128 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 129 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 130 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 131 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 132 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 133 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 134 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 135 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 136 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 137 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 138 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 139 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 140 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 141 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 142 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 143 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 144 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 145 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 146 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 147 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 148 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 149 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 150 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 151 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 152 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 153 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 154 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 155 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 156 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 157 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 158 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 159 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 160 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 161 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 162 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 163 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 164 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 165 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 166 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 167 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 168 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 169 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 170 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 171 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 172 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 173 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 174 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 175 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 176 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 177 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 178 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 179 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 180 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 181 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 182 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 183 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 184 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 185 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 186 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 187 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 188 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 189 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 190 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 191 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 192 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 193 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 194 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 195 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 196 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 197 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 198 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 199 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 200 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 201 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 202 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 203 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 204 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 205 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 206 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 207 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 208 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 209 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 210 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 211 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 212 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 213 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 214 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 215 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 216 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 217 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 218 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 219 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 220 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 221 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 222 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 223 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 224 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 225 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 226 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 227 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 228 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 229 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 230 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 231 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 232 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 233 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 234 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 235 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 236 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 237 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 238 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 239 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 240 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 241 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 242 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 243 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 244 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 245 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 246 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 247 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 248 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 249 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 250 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 251 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 252 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 253 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 254 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 255 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 256 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 257 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 258 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 259 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 260 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 261 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 262 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 263 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 264 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 265 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 266 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 267 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 268 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 269 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 270 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 271 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 272 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 273 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 274 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 275 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 276 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 277 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 278 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 279 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 280 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 281 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 282 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 283 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 284 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 285 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 286 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 287 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 288 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 289 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 290 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 291 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 292 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 293 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 294 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 295 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 296 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 297 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 298 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 299 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 300 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 301 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 302 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 303 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 304 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 305 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 306 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 307 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 308 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 309 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 310 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 311 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 312 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 313 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 314 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 315 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 316 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 317 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 318 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 319 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 320 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 321 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 322 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 323 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 324 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 325 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 326 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 327 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 328 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 329 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 330 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 331 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 332 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 333 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 334 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 335 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 336 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 337 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 338 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 339 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 340 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 341 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 342 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 343 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 344 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 345 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 346 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 347 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 348 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 349 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 350 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 351 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 352 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 353 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 354 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 355 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 356 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 357 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 358 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 359 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 360 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 361 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 362 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 363 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 364 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 365 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 366 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 367 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 368 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 369 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 370 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 371 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 372 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 373 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 374 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 375 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 376 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 377 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 378 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 379 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 380 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 381 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 382 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 383 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 384 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 385 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 386 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 387 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 388 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 389 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 390 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 391 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 392 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 393 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 394 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 395 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 396 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 397 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 398 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 399 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 400 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 401 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 402 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 403 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 404 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 405 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 406 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 407 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 408 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 409 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 410 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 411 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 412 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 413 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 414 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 415 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 416 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 417 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 418 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 419 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 420 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 421 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 422 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 423 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 424 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 425 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 426 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 427 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 428 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 429 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 430 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 431 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 432 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 433 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 434 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 435 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 436 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 437 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 438 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 439 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 440 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 441 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 442 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 443 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 444 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 445 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 446 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 447 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 448 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 449 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 450 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 451 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 452 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 453 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 454 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 455 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 456 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 457 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 458 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 459 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 460 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 461 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 462 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 463 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 464 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 465 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 466 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 467 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 468 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 469 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 470 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 471 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 472 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 473 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 474 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 475 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 476 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 477 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 478 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 479 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 480 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 481 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 482 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 483 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 484 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 485 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 486 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 487 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 488 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 489 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 490 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 491 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 492 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 493 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 494 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 495 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 496 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 497 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 498 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 499 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 500 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 501 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 502 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 503 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 504 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 505 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 506 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 507 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 508 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 509 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 510 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 511 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/tests/unit/network_services/vnf_generic/vnf/vpe_config/full_tm_profile_10G.cfg b/tests/unit/network_services/vnf_generic/vnf/vpe_config/full_tm_profile_10G.cfg new file mode 100755 index 000000000..502655fd0 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/vpe_config/full_tm_profile_10G.cfg @@ -0,0 +1,105 @@ +; BSD LICENSE +; +; Copyright(c) 2010-2014 Intel Corporation. All rights reserved. +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in +; the documentation and/or other materials provided with the +; distribution. +; * Neither the name of Intel Corporation nor the names of its +; contributors may be used to endorse or promote products derived +; from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +; This file enables the following hierarchical scheduler configuration for each +; 10GbE output port: +; * Single subport (subport 0): +; - Subport rate set to 100% of port rate +; - Each of the 4 traffic classes has rate set to 100% of port rate +; * 4K pipes per subport 0 (pipes 0 .. 4095) with identical configuration: +; - Pipe rate set to 1/4K of port rate +; - Each of the 4 traffic classes has rate set to 100% of pipe rate +; - Within each traffic class, the byte-level WRR weights for the 4 queues +; are set to 1:1:1:1 +; +; For more details, please refer to chapter "Quality of Service (QoS) Framework" +; of Intel Data Plane Development Kit (Intel DPDK) Programmer's Guide. + +; Port configuration +[port] +frame overhead = 24 ; frame overhead = Preamble (7) + SFD (1) + FCS (4) + IFG (12) +mtu = 1522; mtu = Q-in-Q MTU (FCS not included) +number of subports per port = 1 +number of pipes per subport = 4096 +queue sizes = 64 64 64 64 + +; Subport configuration +[subport 0] +tb rate = 1250000000 ; Bytes per second +tb size = 1000000 ; Bytes + +tc 0 rate = 1250000000 ; Bytes per second +tc 1 rate = 1250000000 ; Bytes per second +tc 2 rate = 1250000000 ; Bytes per second +tc 3 rate = 1250000000 ; Bytes per second +tc period = 10 ; Milliseconds + +pipe 0-4095 = 0 ; These pipes are configured with pipe profile 0 + +; Pipe configuration +[pipe profile 0] +tb rate = 1250000000 ; Bytes per second +tb size = 1000000 ; Bytes + +tc 0 rate = 1250000000 ; Bytes per second +tc 1 rate = 1250000000 ; Bytes per second +tc 2 rate = 1250000000 ; Bytes per second +tc 3 rate = 1250000000 ; Bytes per second +tc period = 40 ; Milliseconds + +tc 3 oversubscription weight = 1 + +tc 0 wrr weights = 1 1 1 1 +tc 1 wrr weights = 1 1 1 1 +tc 2 wrr weights = 1 1 1 1 +tc 3 wrr weights = 1 1 1 1 + +; RED params per traffic class and color (Green / Yellow / Red) +[red] +tc 0 wred min = 48 40 32 +tc 0 wred max = 64 64 64 +tc 0 wred inv prob = 10 10 10 +tc 0 wred weight = 9 9 9 + +tc 1 wred min = 48 40 32 +tc 1 wred max = 64 64 64 +tc 1 wred inv prob = 10 10 10 +tc 1 wred weight = 9 9 9 + +tc 2 wred min = 48 40 32 +tc 2 wred max = 64 64 64 +tc 2 wred inv prob = 10 10 10 +tc 2 wred weight = 9 9 9 + +tc 3 wred min = 48 40 32 +tc 3 wred max = 64 64 64 +tc 3 wred inv prob = 10 10 10 +tc 3 wred weight = 9 9 9 diff --git a/tests/unit/network_services/vnf_generic/vnf/vpe_config/fw_bulk_inst0_256.txt b/tests/unit/network_services/vnf_generic/vnf/vpe_config/fw_bulk_inst0_256.txt new file mode 100644 index 000000000..307150789 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/vpe_config/fw_bulk_inst0_256.txt @@ -0,0 +1,256 @@ +priority 1 ipv4 152.16.0.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.1.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.2.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.3.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.4.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.5.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.6.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.7.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.8.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.9.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.10.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.11.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.12.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.13.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.14.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.15.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.16.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.17.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.18.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.19.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.20.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.21.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.22.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.23.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.24.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.25.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.26.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.27.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.28.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.29.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.30.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.31.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.32.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.33.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.34.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.35.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.36.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.37.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.38.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.39.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.40.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.41.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.42.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.43.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.44.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.45.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.46.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.47.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.48.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.49.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.50.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.51.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.52.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.53.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.54.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.55.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.56.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.57.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.58.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.59.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.60.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.61.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.62.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.63.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.64.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.65.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.66.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.67.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.68.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.69.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.70.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.71.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.72.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.73.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.74.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.75.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.76.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.77.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.78.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.79.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.80.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.81.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.82.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.83.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.84.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.85.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.86.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.87.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.88.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.89.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.90.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.91.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.92.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.93.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.94.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.95.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.96.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.97.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.98.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.99.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.100.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.101.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.102.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.103.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.104.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.105.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.106.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.107.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.108.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.109.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.110.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.111.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.112.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.113.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.114.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.115.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.116.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.117.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.118.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.119.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.120.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.121.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.122.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.123.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.124.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.125.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.126.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.127.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.128.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.129.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.130.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.131.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.132.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.133.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.134.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.135.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.136.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.137.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.138.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.139.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.140.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.141.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.142.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.143.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.144.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.145.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.146.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.147.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.148.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.149.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.150.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.151.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.152.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.153.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.154.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.155.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.156.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.157.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.158.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.159.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.160.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.161.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.162.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.163.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.164.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.165.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.166.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.167.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.168.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.169.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.170.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.171.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.172.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.173.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.174.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.175.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.176.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.177.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.178.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.179.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.180.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.181.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.182.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.183.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.184.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.185.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.186.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.187.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.188.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.189.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.190.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.191.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.192.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.193.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.194.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.195.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.196.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.197.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.198.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.199.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.200.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.201.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.202.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.203.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.204.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.205.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.206.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.207.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.208.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.209.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.210.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.211.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.212.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.213.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.214.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.215.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.216.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.217.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.218.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.219.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.220.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.221.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.222.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.223.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.224.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.225.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.226.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.227.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.228.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.229.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.230.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.231.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.232.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.233.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.234.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.235.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.236.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.237.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.238.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.239.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.240.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.241.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.242.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.243.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.244.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.245.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.246.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.247.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.248.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.249.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.250.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.251.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.252.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.253.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.254.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 +priority 1 ipv4 152.16.255.0 24 0.0.0.0 0 0 65535 0 65535 6 0xFF port 0 diff --git a/tests/unit/network_services/vnf_generic/vnf/vpe_config/vpe_config b/tests/unit/network_services/vnf_generic/vnf/vpe_config/vpe_config new file mode 100644 index 000000000..17ebc6a76 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/vpe_config/vpe_config @@ -0,0 +1,101 @@ +[EAL] +log_level = 0 + +[PIPELINE0] +type = MASTER +core = s{socket}c0 + +[MEMPOOL0] +pool_size = 256K + +[MEMPOOL1] +pool_size = 2M + +[RXQ1.0] +mempool = MEMPOOL1 + +;;;;;;;;;;Begin of upstream 0;;;;;;;;;;;;;;;;;; +[PIPELINE1] +type = FIREWALL +core = s{socket}c1 +pktq_in = RXQ0.0 +pktq_out = SWQ0 SINK0 +n_rules = 4096 +pkt_type = qinq_ipv4 + +[PIPELINE2] +type = FLOW_CLASSIFICATION +core = s{socket}c1 +pktq_in = SWQ0 +pktq_out = SWQ1 SINK1 +n_flows = 65536 +key_size = 8; dma_size +key_offset = 268; dma_dst_offset +key_mask = 00000FFF00000FFF; qinq +flowid_offset = 172; mbuf (128) + 64 + +[PIPELINE3] +type = FLOW_ACTIONS +core = s{socket}c1h +pktq_in = SWQ1 +pktq_out = SWQ2 +n_flows = 65536 +n_meters_per_flow = 1;dscp is not considered for per user metering +flow_id_offset = 172; mbuf (128) + 64 +ip_hdr_offset = 278 ; should not needed, but who knows? +color_offset = 176 + +[PIPELINE4] +type = FLOW_ACTIONS +core = s{socket}c1h +pktq_in = SWQ2 +pktq_out = SWQ3 +n_flows = 65536 +n_meters_per_flow = 4; Use dscp to classify into 1 out of 4 TC +flow_id_offset = 172; mbuf (128) + 64 +ip_hdr_offset = 278 ; should not needed, but who knows? +color_offset = 176 + +[PIPELINE5] +type = ROUTING +core = s{socket}c1 +pktq_in = SWQ3 +pktq_out = TXQ1.0 SINK2 +encap = ethernet_mpls +mpls_color_mark = yes +ip_hdr_offset = 278 ; should not needed, but who knows? +color_offset = 176 + +;;;;;;;;;;Begin of downstream 0;;;;;;;;;;;;;;;;;; +[PIPELINE6] +type = ROUTING +core = s{socket}c2 +pktq_in = RXQ1.0 +pktq_out = SWQ4 SINK3 +encap = ethernet_qinq +qinq_sched = yes +ip_hdr_offset = 270; mbuf (128) + headroom (128) + ethernet header (14) = 270 + + +[PIPELINE7] +type = PASS-THROUGH +core = s{socket}c2h +pktq_in = SWQ4 +pktq_out = SWQ5 + +[PIPELINE8] +type = PASS-THROUGH +core = s{socket}c2h +pktq_in = SWQ5 TM0 +pktq_out = TM0 SWQ6 + +[PIPELINE9] +type = PASS-THROUGH +core = s{socket}c2 +pktq_in = SWQ6 +pktq_out = TXQ0.0 + +[TM0] +burst_read = 24;dequeue should be slightly slower then enqueue to create buffer +burst_write = 32 +cfg = /tmp/full_tm_profile_10G.cfg diff --git a/tests/unit/network_services/vnf_generic/vnf/vpe_config/vpe_script b/tests/unit/network_services/vnf_generic/vnf/vpe_config/vpe_script new file mode 100644 index 000000000..740eb6586 --- /dev/null +++ b/tests/unit/network_services/vnf_generic/vnf/vpe_config/vpe_script @@ -0,0 +1,384 @@ +#================================================================= +#Pipeline 1 : 256 Firewall Rules for 1 port with 0.0.X.0/24 for destination IP +#================================================================= +p 1 firewall add bulk /tmp/fw_bulk_inst0_256.txt +p 1 firewall add default 1 + +#================================================================= +#Pipeline 2 : 512 flow classfication Rules for 1 port using QinQ as input. Flow id = SVLAN * 512 + CVLAN +#================================================================= +p 2 flow add qinq 128 512 port 0 id 1 +p 2 flow add default 1 + +#================================================================= +#Pipeline 3 : 512 metering Rules for 1 port +#================================================================= +p 3 action flow bulk /tmp/action_bulk_512.txt +p 3 flows 512 ports 1 + +#================================================================= +#Pipeline 4 : 512 metering Rules and 4 traffic classes for 1 port +#================================================================= +p 4 action flow bulk /tmp/action_bulk_512.txt +p 4 flows 512 ports 1 +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 +#================================================================= +#Pipeline 5 : 32 Upstream Routing Rules for 1 ports with dst_ip : 0.0.0.0 to 0.0.255.255 +#================================================================= +p 5 route add 152.40.0.0 21 port 0 ether {port1_dst_mac} mpls 0:0 +p 5 route add 152.40.8.0 21 port 0 ether {port1_dst_mac} mpls 0:1 +p 5 route add 152.40.16.0 21 port 0 ether {port1_dst_mac} mpls 0:2 +p 5 route add 152.40.24.0 21 port 0 ether {port1_dst_mac} mpls 0:3 +p 5 route add 152.40.32.0 21 port 0 ether {port1_dst_mac} mpls 0:4 +p 5 route add 152.40.40.0 21 port 0 ether {port1_dst_mac} mpls 0:5 +p 5 route add 152.40.48.0 21 port 0 ether {port1_dst_mac} mpls 0:6 +p 5 route add 152.40.56.0 21 port 0 ether {port1_dst_mac} mpls 0:7 +p 5 route add 152.40.64.0 21 port 0 ether {port1_dst_mac} mpls 0:8 +p 5 route add 152.40.72.0 21 port 0 ether {port1_dst_mac} mpls 0:9 +p 5 route add 152.40.80.0 21 port 0 ether {port1_dst_mac} mpls 0:10 +p 5 route add 152.40.88.0 21 port 0 ether {port1_dst_mac} mpls 0:11 +p 5 route add 152.40.96.0 21 port 0 ether {port1_dst_mac} mpls 0:12 +p 5 route add 152.40.104.0 21 port 0 ether {port1_dst_mac} mpls 0:13 +p 5 route add 152.40.112.0 21 port 0 ether {port1_dst_mac} mpls 0:14 +p 5 route add 152.40.120.0 21 port 0 ether {port1_dst_mac} mpls 0:15 +p 5 route add 152.40.128.0 21 port 0 ether {port1_dst_mac} mpls 0:16 +p 5 route add 152.40.136.0 21 port 0 ether {port1_dst_mac} mpls 0:17 +p 5 route add 152.40.144.0 21 port 0 ether {port1_dst_mac} mpls 0:18 +p 5 route add 152.40.152.0 21 port 0 ether {port1_dst_mac} mpls 0:19 +p 5 route add 152.40.160.0 21 port 0 ether {port1_dst_mac} mpls 0:20 +p 5 route add 152.40.168.0 21 port 0 ether {port1_dst_mac} mpls 0:21 +p 5 route add 152.40.176.0 21 port 0 ether {port1_dst_mac} mpls 0:22 +p 5 route add 152.40.184.0 21 port 0 ether {port1_dst_mac} mpls 0:23 +p 5 route add 152.40.192.0 21 port 0 ether {port1_dst_mac} mpls 0:24 +p 5 route add 152.40.200.0 21 port 0 ether {port1_dst_mac} mpls 0:25 +p 5 route add 152.40.208.0 21 port 0 ether {port1_dst_mac} mpls 0:26 +p 5 route add 152.40.216.0 21 port 0 ether {port1_dst_mac} mpls 0:27 +p 5 route add 152.40.224.0 21 port 0 ether {port1_dst_mac} mpls 0:28 +p 5 route add 152.40.232.0 21 port 0 ether {port1_dst_mac} mpls 0:29 +p 5 route add 152.40.240.0 21 port 0 ether {port1_dst_mac} mpls 0:30 +p 5 route add 152.40.248.0 21 port 0 ether {port1_dst_mac} mpls 0:31 +p 5 route add default 1 + +#================================================================= +#Pipeline 6 : 256 Downstream Routing Rules for 1 ports with dst_ip : 0.0.0.0 to 0.0.255.255 +#================================================================= +p 6 route add 152.16.0.0 24 port 0 ether {port0_dst_mac} qinq 0 0 +p 6 route add 152.16.1.0 24 port 0 ether {port0_dst_mac} qinq 0 1 +p 6 route add 152.16.2.0 24 port 0 ether {port0_dst_mac} qinq 0 2 +p 6 route add 152.16.3.0 24 port 0 ether {port0_dst_mac} qinq 0 3 +p 6 route add 152.16.4.0 24 port 0 ether {port0_dst_mac} qinq 0 4 +p 6 route add 152.16.5.0 24 port 0 ether {port0_dst_mac} qinq 0 5 +p 6 route add 152.16.6.0 24 port 0 ether {port0_dst_mac} qinq 0 6 +p 6 route add 152.16.7.0 24 port 0 ether {port0_dst_mac} qinq 0 7 +p 6 route add 152.16.8.0 24 port 0 ether {port0_dst_mac} qinq 0 8 +p 6 route add 152.16.9.0 24 port 0 ether {port0_dst_mac} qinq 0 9 +p 6 route add 152.16.10.0 24 port 0 ether {port0_dst_mac} qinq 0 10 +p 6 route add 152.16.11.0 24 port 0 ether {port0_dst_mac} qinq 0 11 +p 6 route add 152.16.12.0 24 port 0 ether {port0_dst_mac} qinq 0 12 +p 6 route add 152.16.13.0 24 port 0 ether {port0_dst_mac} qinq 0 13 +p 6 route add 152.16.14.0 24 port 0 ether {port0_dst_mac} qinq 0 14 +p 6 route add 152.16.15.0 24 port 0 ether {port0_dst_mac} qinq 0 15 +p 6 route add 152.16.16.0 24 port 0 ether {port0_dst_mac} qinq 0 16 +p 6 route add 152.16.17.0 24 port 0 ether {port0_dst_mac} qinq 0 17 +p 6 route add 152.16.18.0 24 port 0 ether {port0_dst_mac} qinq 0 18 +p 6 route add 152.16.19.0 24 port 0 ether {port0_dst_mac} qinq 0 19 +p 6 route add 152.16.20.0 24 port 0 ether {port0_dst_mac} qinq 0 20 +p 6 route add 152.16.21.0 24 port 0 ether {port0_dst_mac} qinq 0 21 +p 6 route add 152.16.22.0 24 port 0 ether {port0_dst_mac} qinq 0 22 +p 6 route add 152.16.23.0 24 port 0 ether {port0_dst_mac} qinq 0 23 +p 6 route add 152.16.24.0 24 port 0 ether {port0_dst_mac} qinq 0 24 +p 6 route add 152.16.25.0 24 port 0 ether {port0_dst_mac} qinq 0 25 +p 6 route add 152.16.26.0 24 port 0 ether {port0_dst_mac} qinq 0 26 +p 6 route add 152.16.27.0 24 port 0 ether {port0_dst_mac} qinq 0 27 +p 6 route add 152.16.28.0 24 port 0 ether {port0_dst_mac} qinq 0 28 +p 6 route add 152.16.29.0 24 port 0 ether {port0_dst_mac} qinq 0 29 +p 6 route add 152.16.30.0 24 port 0 ether {port0_dst_mac} qinq 0 30 +p 6 route add 152.16.31.0 24 port 0 ether {port0_dst_mac} qinq 0 31 +p 6 route add 152.16.32.0 24 port 0 ether {port0_dst_mac} qinq 0 32 +p 6 route add 152.16.33.0 24 port 0 ether {port0_dst_mac} qinq 0 33 +p 6 route add 152.16.34.0 24 port 0 ether {port0_dst_mac} qinq 0 34 +p 6 route add 152.16.35.0 24 port 0 ether {port0_dst_mac} qinq 0 35 +p 6 route add 152.16.36.0 24 port 0 ether {port0_dst_mac} qinq 0 36 +p 6 route add 152.16.37.0 24 port 0 ether {port0_dst_mac} qinq 0 37 +p 6 route add 152.16.38.0 24 port 0 ether {port0_dst_mac} qinq 0 38 +p 6 route add 152.16.39.0 24 port 0 ether {port0_dst_mac} qinq 0 39 +p 6 route add 152.16.40.0 24 port 0 ether {port0_dst_mac} qinq 0 40 +p 6 route add 152.16.41.0 24 port 0 ether {port0_dst_mac} qinq 0 41 +p 6 route add 152.16.42.0 24 port 0 ether {port0_dst_mac} qinq 0 42 +p 6 route add 152.16.43.0 24 port 0 ether {port0_dst_mac} qinq 0 43 +p 6 route add 152.16.44.0 24 port 0 ether {port0_dst_mac} qinq 0 44 +p 6 route add 152.16.45.0 24 port 0 ether {port0_dst_mac} qinq 0 45 +p 6 route add 152.16.46.0 24 port 0 ether {port0_dst_mac} qinq 0 46 +p 6 route add 152.16.47.0 24 port 0 ether {port0_dst_mac} qinq 0 47 +p 6 route add 152.16.48.0 24 port 0 ether {port0_dst_mac} qinq 0 48 +p 6 route add 152.16.49.0 24 port 0 ether {port0_dst_mac} qinq 0 49 +p 6 route add 152.16.50.0 24 port 0 ether {port0_dst_mac} qinq 0 50 +p 6 route add 152.16.51.0 24 port 0 ether {port0_dst_mac} qinq 0 51 +p 6 route add 152.16.52.0 24 port 0 ether {port0_dst_mac} qinq 0 52 +p 6 route add 152.16.53.0 24 port 0 ether {port0_dst_mac} qinq 0 53 +p 6 route add 152.16.54.0 24 port 0 ether {port0_dst_mac} qinq 0 54 +p 6 route add 152.16.55.0 24 port 0 ether {port0_dst_mac} qinq 0 55 +p 6 route add 152.16.56.0 24 port 0 ether {port0_dst_mac} qinq 0 56 +p 6 route add 152.16.57.0 24 port 0 ether {port0_dst_mac} qinq 0 57 +p 6 route add 152.16.58.0 24 port 0 ether {port0_dst_mac} qinq 0 58 +p 6 route add 152.16.59.0 24 port 0 ether {port0_dst_mac} qinq 0 59 +p 6 route add 152.16.60.0 24 port 0 ether {port0_dst_mac} qinq 0 60 +p 6 route add 152.16.61.0 24 port 0 ether {port0_dst_mac} qinq 0 61 +p 6 route add 152.16.62.0 24 port 0 ether {port0_dst_mac} qinq 0 62 +p 6 route add 152.16.63.0 24 port 0 ether {port0_dst_mac} qinq 0 63 +p 6 route add 152.16.64.0 24 port 0 ether {port0_dst_mac} qinq 0 64 +p 6 route add 152.16.65.0 24 port 0 ether {port0_dst_mac} qinq 0 65 +p 6 route add 152.16.66.0 24 port 0 ether {port0_dst_mac} qinq 0 66 +p 6 route add 152.16.67.0 24 port 0 ether {port0_dst_mac} qinq 0 67 +p 6 route add 152.16.68.0 24 port 0 ether {port0_dst_mac} qinq 0 68 +p 6 route add 152.16.69.0 24 port 0 ether {port0_dst_mac} qinq 0 69 +p 6 route add 152.16.70.0 24 port 0 ether {port0_dst_mac} qinq 0 70 +p 6 route add 152.16.71.0 24 port 0 ether {port0_dst_mac} qinq 0 71 +p 6 route add 152.16.72.0 24 port 0 ether {port0_dst_mac} qinq 0 72 +p 6 route add 152.16.73.0 24 port 0 ether {port0_dst_mac} qinq 0 73 +p 6 route add 152.16.74.0 24 port 0 ether {port0_dst_mac} qinq 0 74 +p 6 route add 152.16.75.0 24 port 0 ether {port0_dst_mac} qinq 0 75 +p 6 route add 152.16.76.0 24 port 0 ether {port0_dst_mac} qinq 0 76 +p 6 route add 152.16.77.0 24 port 0 ether {port0_dst_mac} qinq 0 77 +p 6 route add 152.16.78.0 24 port 0 ether {port0_dst_mac} qinq 0 78 +p 6 route add 152.16.79.0 24 port 0 ether {port0_dst_mac} qinq 0 79 +p 6 route add 152.16.80.0 24 port 0 ether {port0_dst_mac} qinq 0 80 +p 6 route add 152.16.81.0 24 port 0 ether {port0_dst_mac} qinq 0 81 +p 6 route add 152.16.82.0 24 port 0 ether {port0_dst_mac} qinq 0 82 +p 6 route add 152.16.83.0 24 port 0 ether {port0_dst_mac} qinq 0 83 +p 6 route add 152.16.84.0 24 port 0 ether {port0_dst_mac} qinq 0 84 +p 6 route add 152.16.85.0 24 port 0 ether {port0_dst_mac} qinq 0 85 +p 6 route add 152.16.86.0 24 port 0 ether {port0_dst_mac} qinq 0 86 +p 6 route add 152.16.87.0 24 port 0 ether {port0_dst_mac} qinq 0 87 +p 6 route add 152.16.88.0 24 port 0 ether {port0_dst_mac} qinq 0 88 +p 6 route add 152.16.89.0 24 port 0 ether {port0_dst_mac} qinq 0 89 +p 6 route add 152.16.90.0 24 port 0 ether {port0_dst_mac} qinq 0 90 +p 6 route add 152.16.91.0 24 port 0 ether {port0_dst_mac} qinq 0 91 +p 6 route add 152.16.92.0 24 port 0 ether {port0_dst_mac} qinq 0 92 +p 6 route add 152.16.93.0 24 port 0 ether {port0_dst_mac} qinq 0 93 +p 6 route add 152.16.94.0 24 port 0 ether {port0_dst_mac} qinq 0 94 +p 6 route add 152.16.95.0 24 port 0 ether {port0_dst_mac} qinq 0 95 +p 6 route add 152.16.96.0 24 port 0 ether {port0_dst_mac} qinq 0 96 +p 6 route add 152.16.97.0 24 port 0 ether {port0_dst_mac} qinq 0 97 +p 6 route add 152.16.98.0 24 port 0 ether {port0_dst_mac} qinq 0 98 +p 6 route add 152.16.99.0 24 port 0 ether {port0_dst_mac} qinq 0 99 +p 6 route add 152.16.100.0 24 port 0 ether {port0_dst_mac} qinq 0 100 +p 6 route add 152.16.101.0 24 port 0 ether {port0_dst_mac} qinq 0 101 +p 6 route add 152.16.102.0 24 port 0 ether {port0_dst_mac} qinq 0 102 +p 6 route add 152.16.103.0 24 port 0 ether {port0_dst_mac} qinq 0 103 +p 6 route add 152.16.104.0 24 port 0 ether {port0_dst_mac} qinq 0 104 +p 6 route add 152.16.105.0 24 port 0 ether {port0_dst_mac} qinq 0 105 +p 6 route add 152.16.106.0 24 port 0 ether {port0_dst_mac} qinq 0 106 +p 6 route add 152.16.107.0 24 port 0 ether {port0_dst_mac} qinq 0 107 +p 6 route add 152.16.108.0 24 port 0 ether {port0_dst_mac} qinq 0 108 +p 6 route add 152.16.109.0 24 port 0 ether {port0_dst_mac} qinq 0 109 +p 6 route add 152.16.110.0 24 port 0 ether {port0_dst_mac} qinq 0 110 +p 6 route add 152.16.111.0 24 port 0 ether {port0_dst_mac} qinq 0 111 +p 6 route add 152.16.112.0 24 port 0 ether {port0_dst_mac} qinq 0 112 +p 6 route add 152.16.113.0 24 port 0 ether {port0_dst_mac} qinq 0 113 +p 6 route add 152.16.114.0 24 port 0 ether {port0_dst_mac} qinq 0 114 +p 6 route add 152.16.115.0 24 port 0 ether {port0_dst_mac} qinq 0 115 +p 6 route add 152.16.116.0 24 port 0 ether {port0_dst_mac} qinq 0 116 +p 6 route add 152.16.117.0 24 port 0 ether {port0_dst_mac} qinq 0 117 +p 6 route add 152.16.118.0 24 port 0 ether {port0_dst_mac} qinq 0 118 +p 6 route add 152.16.119.0 24 port 0 ether {port0_dst_mac} qinq 0 119 +p 6 route add 152.16.120.0 24 port 0 ether {port0_dst_mac} qinq 0 120 +p 6 route add 152.16.121.0 24 port 0 ether {port0_dst_mac} qinq 0 121 +p 6 route add 152.16.122.0 24 port 0 ether {port0_dst_mac} qinq 0 122 +p 6 route add 152.16.123.0 24 port 0 ether {port0_dst_mac} qinq 0 123 +p 6 route add 152.16.124.0 24 port 0 ether {port0_dst_mac} qinq 0 124 +p 6 route add 152.16.125.0 24 port 0 ether {port0_dst_mac} qinq 0 125 +p 6 route add 152.16.126.0 24 port 0 ether {port0_dst_mac} qinq 0 126 +p 6 route add 152.16.127.0 24 port 0 ether {port0_dst_mac} qinq 0 127 +p 6 route add 152.16.128.0 24 port 0 ether {port0_dst_mac} qinq 0 128 +p 6 route add 152.16.129.0 24 port 0 ether {port0_dst_mac} qinq 0 129 +p 6 route add 152.16.130.0 24 port 0 ether {port0_dst_mac} qinq 0 130 +p 6 route add 152.16.131.0 24 port 0 ether {port0_dst_mac} qinq 0 131 +p 6 route add 152.16.132.0 24 port 0 ether {port0_dst_mac} qinq 0 132 +p 6 route add 152.16.133.0 24 port 0 ether {port0_dst_mac} qinq 0 133 +p 6 route add 152.16.134.0 24 port 0 ether {port0_dst_mac} qinq 0 134 +p 6 route add 152.16.135.0 24 port 0 ether {port0_dst_mac} qinq 0 135 +p 6 route add 152.16.136.0 24 port 0 ether {port0_dst_mac} qinq 0 136 +p 6 route add 152.16.137.0 24 port 0 ether {port0_dst_mac} qinq 0 137 +p 6 route add 152.16.138.0 24 port 0 ether {port0_dst_mac} qinq 0 138 +p 6 route add 152.16.139.0 24 port 0 ether {port0_dst_mac} qinq 0 139 +p 6 route add 152.16.140.0 24 port 0 ether {port0_dst_mac} qinq 0 140 +p 6 route add 152.16.141.0 24 port 0 ether {port0_dst_mac} qinq 0 141 +p 6 route add 152.16.142.0 24 port 0 ether {port0_dst_mac} qinq 0 142 +p 6 route add 152.16.143.0 24 port 0 ether {port0_dst_mac} qinq 0 143 +p 6 route add 152.16.144.0 24 port 0 ether {port0_dst_mac} qinq 0 144 +p 6 route add 152.16.145.0 24 port 0 ether {port0_dst_mac} qinq 0 145 +p 6 route add 152.16.146.0 24 port 0 ether {port0_dst_mac} qinq 0 146 +p 6 route add 152.16.147.0 24 port 0 ether {port0_dst_mac} qinq 0 147 +p 6 route add 152.16.148.0 24 port 0 ether {port0_dst_mac} qinq 0 148 +p 6 route add 152.16.149.0 24 port 0 ether {port0_dst_mac} qinq 0 149 +p 6 route add 152.16.150.0 24 port 0 ether {port0_dst_mac} qinq 0 150 +p 6 route add 152.16.151.0 24 port 0 ether {port0_dst_mac} qinq 0 151 +p 6 route add 152.16.152.0 24 port 0 ether {port0_dst_mac} qinq 0 152 +p 6 route add 152.16.153.0 24 port 0 ether {port0_dst_mac} qinq 0 153 +p 6 route add 152.16.154.0 24 port 0 ether {port0_dst_mac} qinq 0 154 +p 6 route add 152.16.155.0 24 port 0 ether {port0_dst_mac} qinq 0 155 +p 6 route add 152.16.156.0 24 port 0 ether {port0_dst_mac} qinq 0 156 +p 6 route add 152.16.157.0 24 port 0 ether {port0_dst_mac} qinq 0 157 +p 6 route add 152.16.158.0 24 port 0 ether {port0_dst_mac} qinq 0 158 +p 6 route add 152.16.159.0 24 port 0 ether {port0_dst_mac} qinq 0 159 +p 6 route add 152.16.160.0 24 port 0 ether {port0_dst_mac} qinq 0 160 +p 6 route add 152.16.161.0 24 port 0 ether {port0_dst_mac} qinq 0 161 +p 6 route add 152.16.162.0 24 port 0 ether {port0_dst_mac} qinq 0 162 +p 6 route add 152.16.163.0 24 port 0 ether {port0_dst_mac} qinq 0 163 +p 6 route add 152.16.164.0 24 port 0 ether {port0_dst_mac} qinq 0 164 +p 6 route add 152.16.165.0 24 port 0 ether {port0_dst_mac} qinq 0 165 +p 6 route add 152.16.166.0 24 port 0 ether {port0_dst_mac} qinq 0 166 +p 6 route add 152.16.167.0 24 port 0 ether {port0_dst_mac} qinq 0 167 +p 6 route add 152.16.168.0 24 port 0 ether {port0_dst_mac} qinq 0 168 +p 6 route add 152.16.169.0 24 port 0 ether {port0_dst_mac} qinq 0 169 +p 6 route add 152.16.170.0 24 port 0 ether {port0_dst_mac} qinq 0 170 +p 6 route add 152.16.171.0 24 port 0 ether {port0_dst_mac} qinq 0 171 +p 6 route add 152.16.172.0 24 port 0 ether {port0_dst_mac} qinq 0 172 +p 6 route add 152.16.173.0 24 port 0 ether {port0_dst_mac} qinq 0 173 +p 6 route add 152.16.174.0 24 port 0 ether {port0_dst_mac} qinq 0 174 +p 6 route add 152.16.175.0 24 port 0 ether {port0_dst_mac} qinq 0 175 +p 6 route add 152.16.176.0 24 port 0 ether {port0_dst_mac} qinq 0 176 +p 6 route add 152.16.177.0 24 port 0 ether {port0_dst_mac} qinq 0 177 +p 6 route add 152.16.178.0 24 port 0 ether {port0_dst_mac} qinq 0 178 +p 6 route add 152.16.179.0 24 port 0 ether {port0_dst_mac} qinq 0 179 +p 6 route add 152.16.180.0 24 port 0 ether {port0_dst_mac} qinq 0 180 +p 6 route add 152.16.181.0 24 port 0 ether {port0_dst_mac} qinq 0 181 +p 6 route add 152.16.182.0 24 port 0 ether {port0_dst_mac} qinq 0 182 +p 6 route add 152.16.183.0 24 port 0 ether {port0_dst_mac} qinq 0 183 +p 6 route add 152.16.184.0 24 port 0 ether {port0_dst_mac} qinq 0 184 +p 6 route add 152.16.185.0 24 port 0 ether {port0_dst_mac} qinq 0 185 +p 6 route add 152.16.186.0 24 port 0 ether {port0_dst_mac} qinq 0 186 +p 6 route add 152.16.187.0 24 port 0 ether {port0_dst_mac} qinq 0 187 +p 6 route add 152.16.188.0 24 port 0 ether {port0_dst_mac} qinq 0 188 +p 6 route add 152.16.189.0 24 port 0 ether {port0_dst_mac} qinq 0 189 +p 6 route add 152.16.190.0 24 port 0 ether {port0_dst_mac} qinq 0 190 +p 6 route add 152.16.191.0 24 port 0 ether {port0_dst_mac} qinq 0 191 +p 6 route add 152.16.192.0 24 port 0 ether {port0_dst_mac} qinq 0 192 +p 6 route add 152.16.193.0 24 port 0 ether {port0_dst_mac} qinq 0 193 +p 6 route add 152.16.194.0 24 port 0 ether {port0_dst_mac} qinq 0 194 +p 6 route add 152.16.195.0 24 port 0 ether {port0_dst_mac} qinq 0 195 +p 6 route add 152.16.196.0 24 port 0 ether {port0_dst_mac} qinq 0 196 +p 6 route add 152.16.197.0 24 port 0 ether {port0_dst_mac} qinq 0 197 +p 6 route add 152.16.198.0 24 port 0 ether {port0_dst_mac} qinq 0 198 +p 6 route add 152.16.199.0 24 port 0 ether {port0_dst_mac} qinq 0 199 +p 6 route add 152.16.200.0 24 port 0 ether {port0_dst_mac} qinq 0 200 +p 6 route add 152.16.201.0 24 port 0 ether {port0_dst_mac} qinq 0 201 +p 6 route add 152.16.202.0 24 port 0 ether {port0_dst_mac} qinq 0 202 +p 6 route add 152.16.203.0 24 port 0 ether {port0_dst_mac} qinq 0 203 +p 6 route add 152.16.204.0 24 port 0 ether {port0_dst_mac} qinq 0 204 +p 6 route add 152.16.205.0 24 port 0 ether {port0_dst_mac} qinq 0 205 +p 6 route add 152.16.206.0 24 port 0 ether {port0_dst_mac} qinq 0 206 +p 6 route add 152.16.207.0 24 port 0 ether {port0_dst_mac} qinq 0 207 +p 6 route add 152.16.208.0 24 port 0 ether {port0_dst_mac} qinq 0 208 +p 6 route add 152.16.209.0 24 port 0 ether {port0_dst_mac} qinq 0 209 +p 6 route add 152.16.210.0 24 port 0 ether {port0_dst_mac} qinq 0 210 +p 6 route add 152.16.211.0 24 port 0 ether {port0_dst_mac} qinq 0 211 +p 6 route add 152.16.212.0 24 port 0 ether {port0_dst_mac} qinq 0 212 +p 6 route add 152.16.213.0 24 port 0 ether {port0_dst_mac} qinq 0 213 +p 6 route add 152.16.214.0 24 port 0 ether {port0_dst_mac} qinq 0 214 +p 6 route add 152.16.215.0 24 port 0 ether {port0_dst_mac} qinq 0 215 +p 6 route add 152.16.216.0 24 port 0 ether {port0_dst_mac} qinq 0 216 +p 6 route add 152.16.217.0 24 port 0 ether {port0_dst_mac} qinq 0 217 +p 6 route add 152.16.218.0 24 port 0 ether {port0_dst_mac} qinq 0 218 +p 6 route add 152.16.219.0 24 port 0 ether {port0_dst_mac} qinq 0 219 +p 6 route add 152.16.220.0 24 port 0 ether {port0_dst_mac} qinq 0 220 +p 6 route add 152.16.221.0 24 port 0 ether {port0_dst_mac} qinq 0 221 +p 6 route add 152.16.222.0 24 port 0 ether {port0_dst_mac} qinq 0 222 +p 6 route add 152.16.223.0 24 port 0 ether {port0_dst_mac} qinq 0 223 +p 6 route add 152.16.224.0 24 port 0 ether {port0_dst_mac} qinq 0 224 +p 6 route add 152.16.225.0 24 port 0 ether {port0_dst_mac} qinq 0 225 +p 6 route add 152.16.226.0 24 port 0 ether {port0_dst_mac} qinq 0 226 +p 6 route add 152.16.227.0 24 port 0 ether {port0_dst_mac} qinq 0 227 +p 6 route add 152.16.228.0 24 port 0 ether {port0_dst_mac} qinq 0 228 +p 6 route add 152.16.229.0 24 port 0 ether {port0_dst_mac} qinq 0 229 +p 6 route add 152.16.230.0 24 port 0 ether {port0_dst_mac} qinq 0 230 +p 6 route add 152.16.231.0 24 port 0 ether {port0_dst_mac} qinq 0 231 +p 6 route add 152.16.232.0 24 port 0 ether {port0_dst_mac} qinq 0 232 +p 6 route add 152.16.233.0 24 port 0 ether {port0_dst_mac} qinq 0 233 +p 6 route add 152.16.234.0 24 port 0 ether {port0_dst_mac} qinq 0 234 +p 6 route add 152.16.235.0 24 port 0 ether {port0_dst_mac} qinq 0 235 +p 6 route add 152.16.236.0 24 port 0 ether {port0_dst_mac} qinq 0 236 +p 6 route add 152.16.237.0 24 port 0 ether {port0_dst_mac} qinq 0 237 +p 6 route add 152.16.238.0 24 port 0 ether {port0_dst_mac} qinq 0 238 +p 6 route add 152.16.239.0 24 port 0 ether {port0_dst_mac} qinq 0 239 +p 6 route add 152.16.240.0 24 port 0 ether {port0_dst_mac} qinq 0 240 +p 6 route add 152.16.241.0 24 port 0 ether {port0_dst_mac} qinq 0 241 +p 6 route add 152.16.242.0 24 port 0 ether {port0_dst_mac} qinq 0 242 +p 6 route add 152.16.243.0 24 port 0 ether {port0_dst_mac} qinq 0 243 +p 6 route add 152.16.244.0 24 port 0 ether {port0_dst_mac} qinq 0 244 +p 6 route add 152.16.245.0 24 port 0 ether {port0_dst_mac} qinq 0 245 +p 6 route add 152.16.246.0 24 port 0 ether {port0_dst_mac} qinq 0 246 +p 6 route add 152.16.247.0 24 port 0 ether {port0_dst_mac} qinq 0 247 +p 6 route add 152.16.248.0 24 port 0 ether {port0_dst_mac} qinq 0 248 +p 6 route add 152.16.249.0 24 port 0 ether {port0_dst_mac} qinq 0 249 +p 6 route add 152.16.250.0 24 port 0 ether {port0_dst_mac} qinq 0 250 +p 6 route add 152.16.251.0 24 port 0 ether {port0_dst_mac} qinq 0 251 +p 6 route add 152.16.252.0 24 port 0 ether {port0_dst_mac} qinq 0 252 +p 6 route add 152.16.253.0 24 port 0 ether {port0_dst_mac} qinq 0 253 +p 6 route add 152.16.254.0 24 port 0 ether {port0_dst_mac} qinq 0 254 +p 6 route add 152.16.255.0 24 port 0 ether {port0_dst_mac} qinq 0 255 +p 6 route add default 1 diff --git a/tox.ini b/tox.ini new file mode 100644 index 000000000..bfba8ec0c --- /dev/null +++ b/tox.ini @@ -0,0 +1,23 @@ +[tox] +minversion = 2.0 +skipsdist = True +envlist = py27,py3 + +[testenv] +usedevelop=True +passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY +deps = -rrequirements.txt +commands = /bin/bash ./run_tests.sh +whitelist_externals = /bin/bash + +[flake8] +# E125 is deliberately excluded. See https://github.com/jcrocholl/pep8/issues/126 +# The rest of the ignores are TODOs +# New from hacking 0.9: E129, E131, H407, H405 +# E251 Skipped due to https://github.com/jcrocholl/pep8/issues/301 + +# nova flake8 ignores +#ignore = E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E251,H405 +# dovetail flake8 ignores +ignore = E123,E125,H803 +exclude = .venv,.git,.tox,dist,docs,*egg,build diff --git a/yardstick/__init__.py b/yardstick/__init__.py index 3ae915c18..fbbc101a9 100644 --- a/yardstick/__init__.py +++ b/yardstick/__init__.py @@ -13,12 +13,15 @@ import os import sys import yardstick.vTC.apexlake as apexlake +from yardstick.common import constants +from yardstick.common import utils as yardstick_utils # Hack to be able to run apexlake unit tests # without having to install apexlake. sys.path.append(os.path.dirname(apexlake.__file__)) -LOG_FILE = '/tmp/yardstick.log' +yardstick_utils.makedirs(constants.YARDSTICK_LOG_DIR) +LOG_FILE = os.path.join(constants.YARDSTICK_LOG_DIR, 'yardstick.log') LOG_FORMATTER = ('%(asctime)s ' '%(name)s %(filename)s:%(lineno)d ' '%(levelname)s %(message)s') diff --git a/yardstick/benchmark/contexts/base.py b/yardstick/benchmark/contexts/base.py index 054ce4236..9f2b21537 100644 --- a/yardstick/benchmark/contexts/base.py +++ b/yardstick/benchmark/contexts/base.py @@ -15,7 +15,7 @@ import yardstick.common.utils as utils @six.add_metaclass(abc.ABCMeta) class Context(object): - '''Class that represents a context in the logical model''' + """Class that represents a context in the logical model""" list = [] def __init__(self): @@ -27,7 +27,7 @@ class Context(object): @staticmethod def get_cls(context_type): - '''Return class of specified type.''' + """Return class of specified type.""" for context in utils.itersubclasses(Context): if context_type == context.__context_type__: return context @@ -41,23 +41,23 @@ class Context(object): @abc.abstractmethod def deploy(self): - '''Deploy context.''' + """Deploy context.""" @abc.abstractmethod def undeploy(self): - '''Undeploy context.''' + """Undeploy context.""" @abc.abstractmethod def _get_server(self, attr_name): - '''get server info by name from context - ''' + """get server info by name from context + """ @staticmethod def get_server(attr_name): - '''lookup server info by name from context + """lookup server info by name from context attr_name: either a name for a server created by yardstick or a dict with attribute name mapping when using external heat templates - ''' + """ server = None for context in Context.list: server = context._get_server(attr_name) diff --git a/yardstick/benchmark/contexts/dummy.py b/yardstick/benchmark/contexts/dummy.py index 0e76b5a82..f7530035c 100644 --- a/yardstick/benchmark/contexts/dummy.py +++ b/yardstick/benchmark/contexts/dummy.py @@ -17,7 +17,7 @@ LOG = logging.getLogger(__name__) class DummyContext(Context): - '''Class that handle dummy info''' + """Class that handle dummy info""" __context_type__ = "Dummy" @@ -28,11 +28,11 @@ class DummyContext(Context): pass def deploy(self): - '''don't need to deploy''' + """don't need to deploy""" pass def undeploy(self): - '''don't need to undeploy''' + """don't need to undeploy""" pass def _get_server(self, attr_name): diff --git a/yardstick/benchmark/contexts/heat.py b/yardstick/benchmark/contexts/heat.py index 79b7472ff..4e31bdca6 100644 --- a/yardstick/benchmark/contexts/heat.py +++ b/yardstick/benchmark/contexts/heat.py @@ -31,7 +31,7 @@ LOG = logging.getLogger(__name__) class HeatContext(Context): - '''Class that represents a context in the logical model''' + """Class that represents a context in the logical model""" __context_type__ = "Heat" @@ -58,7 +58,7 @@ class HeatContext(Context): super(self.__class__, self).__init__() def init(self, attrs): - '''initializes itself from the supplied arguments''' + """initializes itself from the supplied arguments""" self.name = attrs["name"] if "user" in attrs: @@ -102,21 +102,21 @@ class HeatContext(Context): @property def image(self): - '''returns application's default image name''' + """returns application's default image name""" return self._image @property def flavor(self): - '''returns application's default flavor name''' + """returns application's default flavor name""" return self._flavor @property def user(self): - '''return login user name corresponding to image''' + """return login user name corresponding to image""" return self._user def _add_resources_to_template(self, template): - '''add to the template the resources represented by this context''' + """add to the template the resources represented by this context""" template.add_keypair(self.keypair_name, self.key_uuid) template.add_security_group(self.secgroup_name) @@ -201,7 +201,7 @@ class HeatContext(Context): server.add_to_template(template, self.networks, {}) def deploy(self): - '''deploys template into a stack using cloud''' + """deploys template into a stack using cloud""" print("Deploying context '%s'" % self.name) heat_template = HeatTemplate(self.name, self.template_file, @@ -233,7 +233,7 @@ class HeatContext(Context): print("Context '%s' deployed" % self.name) def undeploy(self): - '''undeploys stack from cloud''' + """undeploys stack from cloud""" if self.stack: print("Undeploying context '%s'" % self.name) self.stack.delete() @@ -248,10 +248,10 @@ class HeatContext(Context): LOG.exception("Key filename %s", self.key_filename) def _get_server(self, attr_name): - '''lookup server info by name from context + """lookup server info by name from context attr_name: either a name for a server created by yardstick or a dict with attribute name mapping when using external heat templates - ''' + """ key_filename = pkg_resources.resource_filename( 'yardstick.resources', 'files/yardstick_key-' + get_short_key_uuid(self.key_uuid)) diff --git a/yardstick/benchmark/contexts/model.py b/yardstick/benchmark/contexts/model.py index 1d0a5a133..636abfa35 100644 --- a/yardstick/benchmark/contexts/model.py +++ b/yardstick/benchmark/contexts/model.py @@ -15,9 +15,9 @@ from six.moves import range class Object(object): - '''Base class for classes in the logical model + """Base class for classes in the logical model Contains common attributes and methods - ''' + """ def __init__(self, name, context): # model identities and reference @@ -30,15 +30,15 @@ class Object(object): @property def dn(self): - '''returns distinguished name for object''' + """returns distinguished name for object""" return self.name + "." + self._context.name class PlacementGroup(Object): - '''Class that represents a placement group in the logical model + """Class that represents a placement group in the logical model Concept comes from the OVF specification. Policy should be one of "availability" or "affinity (there are more but they are not supported)" - ''' + """ map = {} def __init__(self, name, context, policy): @@ -63,7 +63,7 @@ class PlacementGroup(Object): class Router(Object): - '''Class that represents a router in the logical model''' + """Class that represents a router in the logical model""" def __init__(self, name, network_name, context, external_gateway_info): super(self.__class__, self).__init__(name, context) @@ -74,7 +74,7 @@ class Router(Object): class Network(Object): - '''Class that represents a network in the logical model''' + """Class that represents a network in the logical model""" list = [] def __init__(self, name, context, attrs): @@ -91,22 +91,22 @@ class Network(Object): Network.list.append(self) def has_route_to(self, network_name): - '''determines if this network has a route to the named network''' + """determines if this network has a route to the named network""" if self.router and self.router.external_gateway_info == network_name: return True return False @staticmethod def find_by_route_to(external_network): - '''finds a network that has a route to the specified network''' + """finds a network that has a route to the specified network""" for network in Network.list: if network.has_route_to(external_network): return network @staticmethod def find_external_network(): - '''return the name of an external network some network in this - context has a route to''' + """return the name of an external network some network in this + context has a route to""" for network in Network.list: if network.router: return network.router.external_gateway_info @@ -114,7 +114,7 @@ class Network(Object): class Server(Object): - '''Class that represents a server in the logical model''' + """Class that represents a server in the logical model""" list = [] def __init__(self, name, context, attrs): @@ -171,7 +171,7 @@ class Server(Object): @property def image(self): - '''returns a server's image name''' + """returns a server's image name""" if self._image: return self._image else: @@ -179,14 +179,14 @@ class Server(Object): @property def flavor(self): - '''returns a server's flavor name''' + """returns a server's flavor name""" if self._flavor: return self._flavor else: return self._context.flavor def _add_instance(self, template, server_name, networks, scheduler_hints): - '''adds to the template one server and corresponding resources''' + """adds to the template one server and corresponding resources""" port_name_list = [] for network in networks: port_name = server_name + "-" + network.name + "-port" @@ -219,7 +219,7 @@ class Server(Object): scheduler_hints=scheduler_hints) def add_to_template(self, template, networks, scheduler_hints=None): - '''adds to the template one or more servers (instances)''' + """adds to the template one or more servers (instances)""" if self.instances == 1: server_name = self.stack_name self._add_instance(template, server_name, networks, @@ -233,9 +233,9 @@ class Server(Object): def update_scheduler_hints(scheduler_hints, added_servers, placement_group): - ''' update scheduler hints from server's placement configuration + """ update scheduler hints from server's placement configuration TODO: this code is openstack specific and should move somewhere else - ''' + """ if placement_group.policy == "affinity": if "same_host" in scheduler_hints: host_list = scheduler_hints["same_host"] diff --git a/yardstick/benchmark/contexts/node.py b/yardstick/benchmark/contexts/node.py index 6db51cccb..9242e2727 100644 --- a/yardstick/benchmark/contexts/node.py +++ b/yardstick/benchmark/contexts/node.py @@ -8,10 +8,11 @@ ############################################################################## from __future__ import absolute_import -import sys +import logging +import errno import os +import collections import yaml -import logging from yardstick.benchmark.contexts.base import Context from yardstick.definitions import YARDSTICK_ROOT_PATH @@ -20,7 +21,7 @@ LOG = logging.getLogger(__name__) class NodeContext(Context): - '''Class that handle nodes info''' + """Class that handle nodes info""" __context_type__ = "Node" @@ -33,20 +34,28 @@ class NodeContext(Context): self.baremetals = [] super(self.__class__, self).__init__() + def read_config_file(self): + """Read from config file""" + + with open(self.file_path) as stream: + LOG.info("Parsing pod file: %s", self.file_path) + cfg = yaml.load(stream) + return cfg + def init(self, attrs): - '''initializes itself from the supplied arguments''' + """initializes itself from the supplied arguments""" self.name = attrs["name"] self.file_path = attrs.get("file", "pod.yaml") - if not os.path.exists(self.file_path): - self.file_path = os.path.join(YARDSTICK_ROOT_PATH, self.file_path) - - LOG.info("Parsing pod file: %s", self.file_path) try: - with open(self.file_path) as stream: - cfg = yaml.load(stream) + cfg = self.read_config_file() except IOError as ioerror: - sys.exit(ioerror) + if ioerror.errno == errno.ENOENT: + self.file_path = \ + os.path.join(YARDSTICK_ROOT_PATH, self.file_path) + cfg = self.read_config_file() + else: + raise self.nodes.extend(cfg["nodes"]) self.controllers.extend([node for node in cfg["nodes"] @@ -61,34 +70,39 @@ class NodeContext(Context): LOG.debug("BareMetals: %r", self.baremetals) def deploy(self): - '''don't need to deploy''' + """don't need to deploy""" pass def undeploy(self): - '''don't need to undeploy''' + """don't need to undeploy""" pass def _get_server(self, attr_name): - '''lookup server info by name from context + """lookup server info by name from context attr_name: a name for a server listed in nodes config file - ''' - if type(attr_name) is dict: + """ + if isinstance(attr_name, collections.Mapping): return None if self.name != attr_name.split(".")[1]: return None node_name = attr_name.split(".")[0] - nodes = [n for n in self.nodes - if n["name"] == node_name] - if len(nodes) == 0: + matching_nodes = (n for n in self.nodes if n["name"] == node_name) + + try: + # A clone is created in order to avoid affecting the + # original one. + node = dict(next(matching_nodes)) + except StopIteration: return None - elif len(nodes) > 1: - LOG.error("Duplicate nodes!!!") - LOG.error("Nodes: %r", nodes) - sys.exit(-1) - - # A clone is created in order to avoid affecting the - # original one. - node = dict(nodes[0]) + + try: + duplicate = next(matching_nodes) + except StopIteration: + pass + else: + raise ValueError("Duplicate nodes!!! Nodes: %s %s", + (matching_nodes, duplicate)) + node["name"] = attr_name return node diff --git a/yardstick/benchmark/contexts/standalone.py b/yardstick/benchmark/contexts/standalone.py new file mode 100644 index 000000000..c1d963f50 --- /dev/null +++ b/yardstick/benchmark/contexts/standalone.py @@ -0,0 +1,116 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""This module handle non managed standalone virtualization node.""" + +from __future__ import absolute_import +import logging +import errno +import collections +import yaml + +from yardstick.benchmark.contexts.base import Context +from yardstick.definitions import YARDSTICK_ROOT_PATH + +LOG = logging.getLogger(__name__) + + +class StandaloneContext(Context): + """ This class handles standalone nodes - VM running on Non-Managed NFVi + Configuration: vswitch, ovs, ovs-dpdk, sr-iov, linuxbridge + """ + + __context_type__ = "Standalone" + + def __init__(self): + self.name = None + self.file_path = None + self.nodes = [] + self.nfvi_node = [] + super(self.__class__, self).__init__() + + def read_config_file(self): + """Read from config file""" + + with open(self.file_path) as stream: + LOG.info("Parsing pod file: %s", self.file_path) + cfg = yaml.load(stream) + return cfg + + def init(self, attrs): + """initializes itself from the supplied arguments""" + + self.name = attrs["name"] + self.file_path = attrs.get("file", "pod.yaml") + LOG.info("Parsing pod file: %s", self.file_path) + + try: + cfg = self.read_config_file() + except IOError as ioerror: + if ioerror.errno == errno.ENOENT: + self.file_path = YARDSTICK_ROOT_PATH + self.file_path + cfg = self.read_config_file() + else: + raise + + self.nodes.extend(cfg["nodes"]) + self.nfvi_node.extend([node for node in cfg["nodes"] + if node["role"] == "nfvi_node"]) + LOG.debug("Nodes: %r", self.nodes) + LOG.debug("NFVi Node: %r", self.nfvi_node) + + def deploy(self): + """don't need to deploy""" + + # Todo: NFVi deploy (sriov, vswitch, ovs etc) based on the config. + pass + + def undeploy(self): + """don't need to undeploy""" + + # Todo: NFVi undeploy (sriov, vswitch, ovs etc) based on the config. + pass + + def _get_server(self, attr_name): + """lookup server info by name from context + + Keyword arguments: + attr_name -- A name for a server listed in nodes config file + """ + + if isinstance(attr_name, collections.Mapping): + return None + + if self.name.split("-")[0] != attr_name.split(".")[1]: + return None + + node_name = attr_name.split(".")[0] + matching_nodes = (n for n in self.nodes if n["name"] == node_name) + + try: + # A clone is created in order to avoid affecting the + # original one. + node = dict(next(matching_nodes)) + except StopIteration: + return None + + try: + duplicate = next(matching_nodes) + except StopIteration: + pass + else: + raise ValueError("Duplicate nodes!!! Nodes: %s %s", + (matching_nodes, duplicate)) + + node["name"] = attr_name + return node diff --git a/yardstick/benchmark/core/__init__.py b/yardstick/benchmark/core/__init__.py index 12c83f87e..161e448cc 100644 --- a/yardstick/benchmark/core/__init__.py +++ b/yardstick/benchmark/core/__init__.py @@ -32,7 +32,7 @@ class Param(object): def print_hbar(barlen): - '''print to stdout a horizontal bar''' + """print to stdout a horizontal bar""" print("+"), print("-" * barlen), print("+") diff --git a/yardstick/benchmark/core/runner.py b/yardstick/benchmark/core/runner.py index 5f8132da8..b9c22cbc9 100644 --- a/yardstick/benchmark/core/runner.py +++ b/yardstick/benchmark/core/runner.py @@ -16,13 +16,13 @@ from yardstick.benchmark.core import print_hbar class Runners(object): - '''Runner commands. + """Runner commands. Set of commands to discover and display runner types. - ''' + """ def list_all(self, args): - '''List existing runner types''' + """List existing runner types""" types = Runner.get_types() print_hbar(78) print("| %-16s | %-60s" % ("Type", "Description")) @@ -33,6 +33,6 @@ class Runners(object): print_hbar(78) def show(self, args): - '''Show details of a specific runner type''' + """Show details of a specific runner type""" rtype = Runner.get_cls(args.type[0]) print(rtype.__doc__) diff --git a/yardstick/benchmark/core/scenario.py b/yardstick/benchmark/core/scenario.py index 15335afd4..a9d933faf 100644 --- a/yardstick/benchmark/core/scenario.py +++ b/yardstick/benchmark/core/scenario.py @@ -16,13 +16,13 @@ from yardstick.benchmark.core import print_hbar class Scenarios(object): - '''Scenario commands. + """Scenario commands. Set of commands to discover and display scenario types. - ''' + """ def list_all(self, args): - '''List existing scenario types''' + """List existing scenario types""" types = Scenario.get_types() print_hbar(78) print("| %-16s | %-60s" % ("Type", "Description")) @@ -33,6 +33,6 @@ class Scenarios(object): print_hbar(78) def show(self, args): - '''Show details of a specific scenario type''' + """Show details of a specific scenario type""" stype = Scenario.get_cls(args.type[0]) print(stype.__doc__) diff --git a/yardstick/benchmark/core/task.py b/yardstick/benchmark/core/task.py index d9a85764a..87d70f42f 100644 --- a/yardstick/benchmark/core/task.py +++ b/yardstick/benchmark/core/task.py @@ -34,13 +34,13 @@ LOG = logging.getLogger(__name__) class Task(object): # pragma: no cover - '''Task commands. + """Task commands. Set of commands to manage benchmark tasks. - ''' + """ def start(self, args, **kwargs): - '''Start a benchmark scenario.''' + """Start a benchmark scenario.""" atexit.register(atexit_handler) @@ -66,8 +66,6 @@ class Task(object): # pragma: no cover if args.parse_only: sys.exit(0) - if os.path.isfile(args.output_file): - os.remove(args.output_file) # parse task_files for i in range(0, len(task_files)): one_task_start_time = time.time() @@ -101,7 +99,7 @@ class Task(object): # pragma: no cover print("Done, exiting") def _run(self, scenarios, run_in_parallel, output_file): - '''Deploys context and calls runners''' + """Deploys context and calls runners""" for context in Context.list: context.deploy() @@ -151,7 +149,7 @@ class Task(object): # pragma: no cover class TaskParser(object): # pragma: no cover - '''Parser for task config files in yaml format''' + """Parser for task config files in yaml format""" def __init__(self, path): self.path = path @@ -181,8 +179,8 @@ class TaskParser(object): # pragma: no cover return task_args, task_args_fnames def parse_suite(self): - '''parse the suite file and return a list of task config file paths - and lists of optional parameters if present''' + """parse the suite file and return a list of task config file paths + and lists of optional parameters if present""" LOG.info("\nParsing suite file:%s", self.path) try: @@ -195,6 +193,8 @@ class TaskParser(object): # pragma: no cover LOG.info("\nStarting scenario:%s", cfg["name"]) test_cases_dir = cfg.get("test_cases_dir", test_cases_dir_default) + test_cases_dir = os.path.join(constants.YARDSTICK_ROOT_PATH, + test_cases_dir) if test_cases_dir[-1] != os.sep: test_cases_dir += os.sep @@ -226,7 +226,7 @@ class TaskParser(object): # pragma: no cover return valid_task_files, valid_task_args, valid_task_args_fnames def parse_task(self, task_id, task_args=None, task_args_file=None): - '''parses the task file and return an context and scenario instances''' + """parses the task file and return an context and scenario instances""" print("Parsing task config:", self.path) try: @@ -294,7 +294,8 @@ class TaskParser(object): # pragma: no cover change_server_name(scenario, name_suffix) try: - change_server_name(scenario['nodes'], name_suffix) + for node in scenario['nodes']: + scenario['nodes'][node] += name_suffix except KeyError: pass @@ -302,14 +303,14 @@ class TaskParser(object): # pragma: no cover return cfg["scenarios"], run_in_parallel, meet_precondition def _check_schema(self, cfg_schema, schema_type): - '''Check if config file is using the correct schema type''' + """Check if config file is using the correct schema type""" if cfg_schema != "yardstick:" + schema_type + ":0.1": sys.exit("error: file %s has unknown schema %s" % (self.path, cfg_schema)) def _check_precondition(self, cfg): - '''Check if the envrionment meet the preconditon''' + """Check if the envrionment meet the preconditon""" if "precondition" in cfg: precondition = cfg["precondition"] @@ -342,7 +343,7 @@ class TaskParser(object): # pragma: no cover def atexit_handler(): - '''handler for process termination''' + """handler for process termination""" base_runner.Runner.terminate_all() if len(Context.list) > 0: @@ -352,7 +353,7 @@ def atexit_handler(): def is_ip_addr(addr): - '''check if string addr is an IP address''' + """check if string addr is an IP address""" try: ipaddress.ip_address(addr.encode('utf-8')) return True @@ -361,12 +362,12 @@ def is_ip_addr(addr): def _is_same_heat_context(host_attr, target_attr): - '''check if two servers are in the same heat context + """check if two servers are in the same heat context host_attr: either a name for a server created by yardstick or a dict with attribute name mapping when using external heat templates target_attr: either a name for a server created by yardstick or a dict with attribute name mapping when using external heat templates - ''' + """ host = None target = None for context in Context.list: @@ -396,7 +397,7 @@ def _is_background_scenario(scenario): def run_one_scenario(scenario_cfg, output_file): - '''run one scenario using context''' + """run one scenario using context""" runner_cfg = scenario_cfg["runner"] runner_cfg['output_filename'] = output_file @@ -444,7 +445,7 @@ def run_one_scenario(scenario_cfg, output_file): def parse_nodes_with_context(scenario_cfg): - '''paras the 'nodes' fields in scenario ''' + """paras the 'nodes' fields in scenario """ nodes = scenario_cfg["nodes"] nodes_cfg = {} @@ -455,7 +456,7 @@ def parse_nodes_with_context(scenario_cfg): def runner_join(runner): - '''join (wait for) a runner, exit process at runner failure''' + """join (wait for) a runner, exit process at runner failure""" status = runner.join() base_runner.Runner.release(runner) if status != 0: diff --git a/yardstick/benchmark/core/testcase.py b/yardstick/benchmark/core/testcase.py index 74304857f..7b23b73aa 100644 --- a/yardstick/benchmark/core/testcase.py +++ b/yardstick/benchmark/core/testcase.py @@ -10,106 +10,97 @@ """ Handler for yardstick command 'testcase' """ from __future__ import absolute_import from __future__ import print_function + import os import yaml -import sys +import logging -from yardstick.benchmark.core import print_hbar from yardstick.common.task_template import TaskTemplate -from yardstick.definitions import YARDSTICK_ROOT_PATH +from yardstick.common import constants as consts + +LOG = logging.getLogger(__name__) class Testcase(object): - '''Testcase commands. + """Testcase commands. Set of commands to discover and display test cases. - ''' - - def __init__(self): - self.test_case_path = YARDSTICK_ROOT_PATH + 'tests/opnfv/test_cases/' - self.testcase_list = [] + """ def list_all(self, args): - '''List existing test cases''' + """List existing test cases""" - try: - testcase_files = os.listdir(self.test_case_path) - except Exception as e: - print("Failed to list dir:\n%(path)s\n%(err)s\n" - % {"path": self.test_case_path, "err": e}) - raise e - testcase_files.sort() - - for testcase_file in testcase_files: - record = self._get_record(testcase_file) - self.testcase_list.append(record) - - self._format_print(self.testcase_list) - return True + testcase_files = self._get_testcase_file_list() + testcase_list = [self._get_record(f) for f in testcase_files] - def show(self, args): - '''Show details of a specific test case''' - testcase_name = args.casename[0] - testcase_path = self.test_case_path + testcase_name + ".yaml" + return testcase_list + + def _get_testcase_file_list(self): try: - with open(testcase_path) as f: - try: - testcase_info = f.read() - print(testcase_info) - - except Exception as e: - print("Failed to load test cases:" - "\n%(testcase_file)s\n%(err)s\n" - % {"testcase_file": testcase_path, "err": e}) - raise e - except IOError as ioerror: - sys.exit(ioerror) - return True + testcase_files = sorted(os.listdir(consts.TESTCASE_DIR)) + except OSError: + LOG.exception('Failed to list dir:\n%s\n', consts.TESTCASE_DIR) + raise + + return testcase_files def _get_record(self, testcase_file): - try: - with open(self.test_case_path + testcase_file) as f: - try: - testcase_info = f.read() - except Exception as e: - print("Failed to load test cases:" - "\n%(testcase_file)s\n%(err)s\n" - % {"testcase_file": testcase_file, "err": e}) - raise e - description, installer, deploy_scenarios = \ - self._parse_testcase(testcase_info) - - record = {'Name': testcase_file.split(".")[0], - 'Description': description, - 'installer': installer, - 'deploy_scenarios': deploy_scenarios} - return record - except IOError as ioerror: - sys.exit(ioerror) + file_path = os.path.join(consts.TESTCASE_DIR, testcase_file) + with open(file_path) as f: + try: + testcase_info = f.read() + except IOError: + LOG.exception('Failed to load test case:\n%s\n', testcase_file) + raise + + description, installer, deploy_scenarios = self._parse_testcase( + testcase_info) + + record = { + 'Name': testcase_file.split(".")[0], + 'Description': description, + 'installer': installer, + 'deploy_scenarios': deploy_scenarios + } + + return record def _parse_testcase(self, testcase_info): - kw = {} - rendered_testcase = TaskTemplate.render(testcase_info, **kw) + rendered_testcase = TaskTemplate.render(testcase_info) testcase_cfg = yaml.load(rendered_testcase) - test_precondition = testcase_cfg.get('precondition', None) - installer_type = 'all' - deploy_scenarios = 'all' - if test_precondition is not None: - installer_type = test_precondition.get('installer_type', 'all') - deploy_scenarios = test_precondition.get('deploy_scenarios', 'all') - - description = testcase_info.split("\n")[2][1:].strip() + + test_precondition = testcase_cfg.get('precondition', {}) + installer_type = test_precondition.get('installer_type', 'all') + deploy_scenarios = test_precondition.get('deploy_scenarios', 'all') + + description = self._get_description(testcase_cfg) + return description, installer_type, deploy_scenarios - def _format_print(self, testcase_list): - '''format output''' + def _get_description(self, testcase_cfg): + try: + description_list = testcase_cfg['description'].split(';') + except KeyError: + return '' + else: + try: + return description_list[1].replace(os.linesep, '').strip() + except IndexError: + return description_list[0].replace(os.linesep, '').strip() - print_hbar(88) - print("| %-21s | %-60s" % ("Testcase Name", "Description")) - print_hbar(88) - for testcase_record in testcase_list: - print("| %-16s | %-60s" % (testcase_record['Name'], - testcase_record['Description'])) - print_hbar(88) + def show(self, args): + """Show details of a specific test case""" + testcase_name = args.casename[0] + testcase_path = os.path.join(consts.TESTCASE_DIR, + testcase_name + ".yaml") + with open(testcase_path) as f: + try: + testcase_info = f.read() + except IOError: + LOG.exception('Failed to load test case:\n%s\n', testcase_path) + raise + + print(testcase_info) + return True diff --git a/yardstick/benchmark/runners/arithmetic.py b/yardstick/benchmark/runners/arithmetic.py index 956c3ffd1..d5605f755 100755 --- a/yardstick/benchmark/runners/arithmetic.py +++ b/yardstick/benchmark/runners/arithmetic.py @@ -16,13 +16,13 @@ # yardstick comment: this is a modified copy of # rally/rally/benchmark/runners/constant.py -'''A runner that every run arithmetically steps specified input value(s) to +"""A runner that every run arithmetically steps specified input value(s) to the scenario. This just means step value(s) is added to the previous value(s). It is possible to combine several named input values and run with those either as nested for loops or combine each i:th index of each "input value list" until the end of the shortest list is reached (optimally all lists should be defined with the same number of values when using such iter_type). -''' +""" from __future__ import absolute_import @@ -147,7 +147,7 @@ def _worker_process(queue, cls, method_name, scenario_cfg, class ArithmeticRunner(base.Runner): - '''Run a scenario arithmetically stepping input value(s) + """Run a scenario arithmetically stepping input value(s) Parameters interval - time to wait between each scenario invocation @@ -180,7 +180,7 @@ class ArithmeticRunner(base.Runner): default: none - name - and so on...... - ''' + """ __execution_type__ = 'Arithmetic' diff --git a/yardstick/benchmark/runners/base.py b/yardstick/benchmark/runners/base.py index 0e0292713..bf1a71cab 100755 --- a/yardstick/benchmark/runners/base.py +++ b/yardstick/benchmark/runners/base.py @@ -36,10 +36,10 @@ CONF = cfg.CONF def _output_serializer_main(filename, queue): - '''entrypoint for the singleton subprocess writing to outfile + """entrypoint for the singleton subprocess writing to outfile Use of this process enables multiple instances of a scenario without messing up the output file. - ''' + """ config = {} config["type"] = CONF.dispatcher.capitalize() config["file_path"] = filename @@ -56,7 +56,7 @@ def _output_serializer_main(filename, queue): def _execute_shell_command(command): - '''execute shell script with error handling''' + """execute shell script with error handling""" exitcode = 0 output = [] try: @@ -71,7 +71,7 @@ def _execute_shell_command(command): def _single_action(seconds, command, queue): - '''entrypoint for the single action process''' + """entrypoint for the single action process""" log.debug("single action, fires after %d seconds (from now)", seconds) time.sleep(seconds) log.debug("single action: executing command: '%s'", command) @@ -85,7 +85,7 @@ def _single_action(seconds, command, queue): def _periodic_action(interval, command, queue): - '''entrypoint for the periodic action process''' + """entrypoint for the periodic action process""" log.debug("periodic action, fires every: %d seconds", interval) time_spent = 0 while True: @@ -108,7 +108,7 @@ class Runner(object): @staticmethod def get_cls(runner_type): - '''return class of specified type''' + """return class of specified type""" for runner in utils.itersubclasses(Runner): if runner_type == runner.__execution_type__: return runner @@ -116,7 +116,7 @@ class Runner(object): @staticmethod def get_types(): - '''return a list of known runner type (class) names''' + """return a list of known runner type (class) names""" types = [] for runner in utils.itersubclasses(Runner): types.append(runner) @@ -141,7 +141,7 @@ class Runner(object): @staticmethod def release_dump_process(): - '''Release the dumper process''' + """Release the dumper process""" log.debug("Stopping dump process") if Runner.dump_process: Runner.queue.put('_TERMINATE_') @@ -150,7 +150,7 @@ class Runner(object): @staticmethod def release(runner): - '''Release the runner''' + """Release the runner""" if runner in Runner.runners: Runner.runners.remove(runner) @@ -160,13 +160,13 @@ class Runner(object): @staticmethod def terminate(runner): - '''Terminate the runner''' + """Terminate the runner""" if runner.process and runner.process.is_alive(): runner.process.terminate() @staticmethod def terminate_all(): - '''Terminate all runners (subprocesses)''' + """Terminate all runners (subprocesses)""" log.debug("Terminating all runners") # release dumper process as some errors before any runner is created @@ -194,7 +194,7 @@ class Runner(object): Runner.runners.append(self) def run_post_stop_action(self): - '''run a potentially configured post-stop action''' + """run a potentially configured post-stop action""" if "post-stop-action" in self.config: command = self.config["post-stop-action"]["command"] log.debug("post stop action: command: '%s'", command) @@ -250,7 +250,7 @@ class Runner(object): self._run_benchmark(cls, "run", scenario_cfg, context_cfg) def abort(self): - '''Abort the execution of a scenario''' + """Abort the execution of a scenario""" self.aborted.set() def join(self, timeout=None): diff --git a/yardstick/benchmark/runners/duration.py b/yardstick/benchmark/runners/duration.py index 89cac7db8..772983cfd 100644 --- a/yardstick/benchmark/runners/duration.py +++ b/yardstick/benchmark/runners/duration.py @@ -16,8 +16,8 @@ # yardstick comment: this is a modified copy of # rally/rally/benchmark/runners/constant.py -'''A runner that runs a specific time before it returns -''' +"""A runner that runs a specific time before it returns +""" from __future__ import absolute_import import os @@ -106,7 +106,7 @@ def _worker_process(queue, cls, method_name, scenario_cfg, class DurationRunner(base.Runner): - '''Run a scenario for a certain amount of time + """Run a scenario for a certain amount of time If the scenario ends before the time has elapsed, it will be started again. @@ -119,7 +119,7 @@ If the scenario ends before the time has elapsed, it will be started again. type: int unit: seconds default: 1 sec - ''' + """ __execution_type__ = 'Duration' def _run_benchmark(self, cls, method, scenario_cfg, context_cfg): diff --git a/yardstick/benchmark/runners/iteration.py b/yardstick/benchmark/runners/iteration.py index 930f883e9..c2376af48 100644 --- a/yardstick/benchmark/runners/iteration.py +++ b/yardstick/benchmark/runners/iteration.py @@ -16,8 +16,8 @@ # yardstick comment: this is a modified copy of # rally/rally/benchmark/runners/constant.py -'''A runner that runs a configurable number of times before it returns -''' +"""A runner that runs a configurable number of times before it returns +""" from __future__ import absolute_import import os @@ -110,7 +110,7 @@ def _worker_process(queue, cls, method_name, scenario_cfg, class IterationRunner(base.Runner): - '''Run a scenario for a configurable number of times + """Run a scenario for a configurable number of times If the scenario ends before the time has elapsed, it will be started again. @@ -123,7 +123,7 @@ If the scenario ends before the time has elapsed, it will be started again. type: int unit: seconds default: 1 sec - ''' + """ __execution_type__ = 'Iteration' def _run_benchmark(self, cls, method, scenario_cfg, context_cfg): diff --git a/yardstick/benchmark/runners/sequence.py b/yardstick/benchmark/runners/sequence.py index e6abeab3c..af87c006e 100644 --- a/yardstick/benchmark/runners/sequence.py +++ b/yardstick/benchmark/runners/sequence.py @@ -16,9 +16,9 @@ # yardstick comment: this is a modified copy of # rally/rally/benchmark/runners/constant.py -'''A runner that every run changes a specified input value to the scenario. +"""A runner that every run changes a specified input value to the scenario. The input value in the sequence is specified in a list in the input file. -''' +""" from __future__ import absolute_import import os @@ -114,7 +114,7 @@ def _worker_process(queue, cls, method_name, scenario_cfg, class SequenceRunner(base.Runner): - '''Run a scenario by changing an input value defined in a list + """Run a scenario by changing an input value defined in a list Parameters interval - time to wait between each scenario invocation @@ -129,7 +129,7 @@ class SequenceRunner(base.Runner): type: [int] unit: na default: none - ''' + """ __execution_type__ = 'Sequence' diff --git a/yardstick/benchmark/scenarios/availability/attacker/attacker_baremetal.py b/yardstick/benchmark/scenarios/availability/attacker/attacker_baremetal.py index 7eb93a80f..1d632799d 100644 --- a/yardstick/benchmark/scenarios/availability/attacker/attacker_baremetal.py +++ b/yardstick/benchmark/scenarios/availability/attacker/attacker_baremetal.py @@ -19,7 +19,7 @@ LOG = logging.getLogger(__name__) def _execute_shell_command(command, stdin=None): - '''execute shell script with error handling''' + """execute shell script with error handling""" exitcode = 0 output = [] try: diff --git a/yardstick/benchmark/scenarios/availability/attacker/baseattacker.py b/yardstick/benchmark/scenarios/availability/attacker/baseattacker.py index f5f74f291..ca2324055 100644 --- a/yardstick/benchmark/scenarios/availability/attacker/baseattacker.py +++ b/yardstick/benchmark/scenarios/availability/attacker/baseattacker.py @@ -61,7 +61,7 @@ class BaseAttacker(object): @staticmethod def get_attacker_cls(attacker_cfg): - '''return attacker instance of specified type''' + """return attacker instance of specified type""" attacker_type = attacker_cfg['fault_type'] for attacker_cls in utils.itersubclasses(BaseAttacker): if attacker_type == attacker_cls.__attacker_type__: diff --git a/yardstick/benchmark/scenarios/availability/monitor/basemonitor.py b/yardstick/benchmark/scenarios/availability/monitor/basemonitor.py index a11966a12..3062037ee 100644 --- a/yardstick/benchmark/scenarios/availability/monitor/basemonitor.py +++ b/yardstick/benchmark/scenarios/availability/monitor/basemonitor.py @@ -77,7 +77,7 @@ class BaseMonitor(multiprocessing.Process): @staticmethod def get_monitor_cls(monitor_type): - '''return monitor class of specified type''' + """return monitor class of specified type""" for monitor in utils.itersubclasses(BaseMonitor): if monitor_type == monitor.__monitor_type__: diff --git a/yardstick/benchmark/scenarios/availability/monitor/monitor_command.py b/yardstick/benchmark/scenarios/availability/monitor/monitor_command.py index 6ddb73ea2..aae2daa86 100644 --- a/yardstick/benchmark/scenarios/availability/monitor/monitor_command.py +++ b/yardstick/benchmark/scenarios/availability/monitor/monitor_command.py @@ -18,7 +18,7 @@ LOG = logging.getLogger(__name__) def _execute_shell_command(command): - '''execute shell script with error handling''' + """execute shell script with error handling""" exitcode = 0 output = [] try: diff --git a/yardstick/benchmark/scenarios/availability/operation/baseoperation.py b/yardstick/benchmark/scenarios/availability/operation/baseoperation.py index 709884b6f..be286b8fd 100644 --- a/yardstick/benchmark/scenarios/availability/operation/baseoperation.py +++ b/yardstick/benchmark/scenarios/availability/operation/baseoperation.py @@ -61,7 +61,7 @@ class BaseOperation(object): @staticmethod def get_operation_cls(type): - '''return operation instance of specified type''' + """return operation instance of specified type""" operation_type = type for operation_cls in utils.itersubclasses(BaseOperation): if operation_type == operation_cls.__operation__type__: diff --git a/yardstick/benchmark/scenarios/availability/result_checker/baseresultchecker.py b/yardstick/benchmark/scenarios/availability/result_checker/baseresultchecker.py index 70e004012..1ccd05844 100644 --- a/yardstick/benchmark/scenarios/availability/result_checker/baseresultchecker.py +++ b/yardstick/benchmark/scenarios/availability/result_checker/baseresultchecker.py @@ -69,7 +69,7 @@ class BaseResultChecker(object): @staticmethod def get_resultchecker_cls(type): - '''return resultchecker instance of specified type''' + """return resultchecker instance of specified type""" resultchecker_type = type for checker_cls in utils.itersubclasses(BaseResultChecker): if resultchecker_type == checker_cls.__result_checker__type__: diff --git a/yardstick/benchmark/scenarios/availability/serviceha.py b/yardstick/benchmark/scenarios/availability/serviceha.py index b981c8cd8..e82e69b7d 100755 --- a/yardstick/benchmark/scenarios/availability/serviceha.py +++ b/yardstick/benchmark/scenarios/availability/serviceha.py @@ -30,7 +30,7 @@ class ServiceHA(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" nodes = self.context_cfg.get("nodes", None) if nodes is None: LOG.error("the nodes info is none") @@ -77,13 +77,13 @@ class ServiceHA(base.Scenario): return def teardown(self): - '''scenario teardown''' + """scenario teardown""" for attacker in self.attackers: attacker.recover() def _test(): # pragma: no cover - '''internal test function''' + """internal test function""" host = { "ip": "10.20.0.5", "user": "root", diff --git a/yardstick/benchmark/scenarios/base.py b/yardstick/benchmark/scenarios/base.py index 5f5c07d3b..5d3c36c38 100644 --- a/yardstick/benchmark/scenarios/base.py +++ b/yardstick/benchmark/scenarios/base.py @@ -26,20 +26,20 @@ import yardstick.common.utils as utils class Scenario(object): def setup(self): - ''' default impl for scenario setup ''' + """ default impl for scenario setup """ pass def run(self, args): - ''' catcher for not implemented run methods in subclasses ''' + """ catcher for not implemented run methods in subclasses """ raise RuntimeError("run method not implemented") def teardown(self): - ''' default impl for scenario teardown ''' + """ default impl for scenario teardown """ pass @staticmethod def get_types(): - '''return a list of known runner type (class) names''' + """return a list of known runner type (class) names""" scenarios = [] for scenario in utils.itersubclasses(Scenario): scenarios.append(scenario) @@ -47,7 +47,7 @@ class Scenario(object): @staticmethod def get_cls(scenario_type): - '''return class of specified type''' + """return class of specified type""" for scenario in utils.itersubclasses(Scenario): if scenario_type == scenario.__scenario_type__: return scenario diff --git a/yardstick/benchmark/scenarios/compute/cachestat.py b/yardstick/benchmark/scenarios/compute/cachestat.py index 0f60d466e..b4c3463e5 100644 --- a/yardstick/benchmark/scenarios/compute/cachestat.py +++ b/yardstick/benchmark/scenarios/compute/cachestat.py @@ -22,7 +22,7 @@ LOG = logging.getLogger(__name__) class CACHEstat(base.Scenario): - '''Collect cache statistics. + """Collect cache statistics. This scenario reads system cache hit/miss ratio and other statistics on a Linux host. @@ -58,7 +58,7 @@ class CACHEstat(base.Scenario): some error margin depending on unusual workload types. REQUIREMENTS: CONFIG_FUNCTION_PROFILER, awk. - ''' + """ __scenario_type__ = "CACHEstat" TARGET_SCRIPT = "cache_stat.bash" diff --git a/yardstick/benchmark/scenarios/compute/cyclictest.py b/yardstick/benchmark/scenarios/compute/cyclictest.py index 76bafff2b..ae1d37324 100644 --- a/yardstick/benchmark/scenarios/compute/cyclictest.py +++ b/yardstick/benchmark/scenarios/compute/cyclictest.py @@ -141,7 +141,7 @@ class Cyclictest(base.Scenario): self._connect_guest() def setup(self): - '''scenario setup''' + """scenario setup""" setup_options = self.scenario_cfg["setup_options"] host_setup_seqs = setup_options["host_setup_seqs"] guest_setup_seqs = setup_options["guest_setup_seqs"] @@ -205,7 +205,7 @@ class Cyclictest(base.Scenario): def _test(): # pragma: no cover - '''internal test function''' + """internal test function""" key_filename = pkg_resources.resource_filename("yardstick.resources", "files/yardstick_key") ctx = { diff --git a/yardstick/benchmark/scenarios/dummy/dummy.py b/yardstick/benchmark/scenarios/dummy/dummy.py index 95146e0c5..59d177586 100644 --- a/yardstick/benchmark/scenarios/dummy/dummy.py +++ b/yardstick/benchmark/scenarios/dummy/dummy.py @@ -25,7 +25,7 @@ class Dummy(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.setup_done = True def run(self, result): diff --git a/yardstick/benchmark/scenarios/networking/iperf3.py b/yardstick/benchmark/scenarios/networking/iperf3.py index b8ec9acdf..4d4c7e7ee 100644 --- a/yardstick/benchmark/scenarios/networking/iperf3.py +++ b/yardstick/benchmark/scenarios/networking/iperf3.py @@ -167,7 +167,7 @@ For more info see http://software.es.net/iperf def _test(): - '''internal test function''' + """internal test function""" key_filename = pkg_resources.resource_filename('yardstick.resources', 'files/yardstick_key') ctx = { diff --git a/yardstick/benchmark/scenarios/networking/netperf.py b/yardstick/benchmark/scenarios/networking/netperf.py index 80dbed334..d0528826f 100755 --- a/yardstick/benchmark/scenarios/networking/netperf.py +++ b/yardstick/benchmark/scenarios/networking/netperf.py @@ -60,7 +60,7 @@ class Netperf(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.target_script = pkg_resources.resource_filename( 'yardstick.benchmark.scenarios.networking', Netperf.TARGET_SCRIPT) @@ -150,7 +150,7 @@ class Netperf(base.Scenario): def _test(): - '''internal test function''' + """internal test function""" key_filename = pkg_resources.resource_filename("yardstick.resources", "files/yardstick_key") ctx = { diff --git a/yardstick/benchmark/scenarios/networking/netperf_node.py b/yardstick/benchmark/scenarios/networking/netperf_node.py index 0cf52b8dd..fd9fa0a50 100755 --- a/yardstick/benchmark/scenarios/networking/netperf_node.py +++ b/yardstick/benchmark/scenarios/networking/netperf_node.py @@ -61,7 +61,7 @@ class NetperfNode(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.target_script = pkg_resources.resource_filename( 'yardstick.benchmark.scenarios.networking', NetperfNode.TARGET_SCRIPT) @@ -172,13 +172,13 @@ class NetperfNode(base.Scenario): (mean_latency, sla_max_mean_latency) def teardown(self): - '''remove netperf from nodes after test''' + """remove netperf from nodes after test""" self.server.execute("sudo bash netperf_remove.sh") self.client.execute("sudo bash netperf_remove.sh") def _test(): # pragma: no cover - '''internal test function''' + """internal test function""" ctx = { "host": { "ip": "192.168.10.10", diff --git a/yardstick/benchmark/scenarios/networking/ping.py b/yardstick/benchmark/scenarios/networking/ping.py index eb173f1df..d20814697 100644 --- a/yardstick/benchmark/scenarios/networking/ping.py +++ b/yardstick/benchmark/scenarios/networking/ping.py @@ -102,7 +102,7 @@ class Ping(base.Scenario): def _test(): # pragma: no cover - '''internal test function''' + """internal test function""" key_filename = pkg_resources.resource_filename("yardstick.resources", "files/yardstick_key") ctx = { diff --git a/yardstick/benchmark/scenarios/networking/ping6.py b/yardstick/benchmark/scenarios/networking/ping6.py index dd4272236..142a35664 100644 --- a/yardstick/benchmark/scenarios/networking/ping6.py +++ b/yardstick/benchmark/scenarios/networking/ping6.py @@ -84,7 +84,7 @@ class Ping6(base.Scenario): # pragma: no cover return None def setup(self): - '''scenario setup''' + """scenario setup""" self.setup_script = pkg_resources.resource_filename( 'yardstick.benchmark.scenarios.networking', Ping6.SETUP_SCRIPT) diff --git a/yardstick/benchmark/scenarios/networking/pktgen.py b/yardstick/benchmark/scenarios/networking/pktgen.py index 69663ec5f..b61337a70 100644 --- a/yardstick/benchmark/scenarios/networking/pktgen.py +++ b/yardstick/benchmark/scenarios/networking/pktgen.py @@ -47,7 +47,7 @@ class Pktgen(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.target_script = pkg_resources.resource_filename( 'yardstick.benchmark.scenarios.networking', Pktgen.TARGET_SCRIPT) @@ -148,7 +148,7 @@ class Pktgen(base.Scenario): def _test(): - '''internal test function''' + """internal test function""" key_filename = pkg_resources.resource_filename('yardstick.resources', 'files/yardstick_key') ctx = { diff --git a/yardstick/benchmark/scenarios/networking/pktgen_dpdk.py b/yardstick/benchmark/scenarios/networking/pktgen_dpdk.py index 2bdb91abb..0b70629f8 100644 --- a/yardstick/benchmark/scenarios/networking/pktgen_dpdk.py +++ b/yardstick/benchmark/scenarios/networking/pktgen_dpdk.py @@ -37,7 +37,7 @@ class PktgenDPDKLatency(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.pktgen_dpdk_script = pkg_resources.resource_filename( 'yardstick.benchmark.scenarios.networking', PktgenDPDKLatency.PKTGEN_DPDK_SCRIPT) diff --git a/yardstick/benchmark/scenarios/networking/sfc.py b/yardstick/benchmark/scenarios/networking/sfc.py index 87fea4f95..c558e3512 100644 --- a/yardstick/benchmark/scenarios/networking/sfc.py +++ b/yardstick/benchmark/scenarios/networking/sfc.py @@ -14,7 +14,7 @@ LOG = logging.getLogger(__name__) class Sfc(base.Scenario): # pragma: no cover - ''' SFC scenario class ''' + """ SFC scenario class """ __scenario_type__ = "sfc" @@ -31,7 +31,7 @@ class Sfc(base.Scenario): # pragma: no cover self.teardown_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.tacker_script = pkg_resources.resource_filename( 'yardstick.benchmark.scenarios.networking', Sfc.TACKER_SCRIPT) @@ -40,7 +40,7 @@ class Sfc(base.Scenario): # pragma: no cover 'yardstick.benchmark.scenarios.networking', Sfc.SERVER_SCRIPT) - ''' calling Tacker to instantiate VNFs and Service Chains ''' + """ calling Tacker to instantiate VNFs and Service Chains """ cmd_tacker = "%s" % (self.tacker_script) subprocess.call(cmd_tacker, shell=True) @@ -50,7 +50,7 @@ class Sfc(base.Scenario): # pragma: no cover target_pwd = target.get('password', 'opnfv') target_ip = target.get('ip', None) - ''' webserver start automatically during the vm boot ''' + """ webserver start automatically during the vm boot """ LOG.info("user:%s, target:%s", target_user, target_ip) self.server = ssh.SSH(target_user, target_ip, password=target_pwd, port=target_ssh_port) @@ -102,7 +102,7 @@ class Sfc(base.Scenario): # pragma: no cover self.setup_done = True def run(self, result): - ''' Creating client and server VMs to perform the test''' + """ Creating client and server VMs to perform the test""" host = self.context_cfg['host'] host_user = host.get('user', 'root') ssh_port = host.get("ssh_port", ssh.DEFAULT_PORT) @@ -149,7 +149,7 @@ class Sfc(base.Scenario): # pragma: no cover 'yardstick.benchmark.scenarios.networking', Sfc.TACKER_CHANGECLASSI) - ''' calling Tacker to change the classifier ''' + """ calling Tacker to change the classifier """ cmd_tacker = "%s" % (self.tacker_classi) subprocess.call(cmd_tacker, shell=True) @@ -185,7 +185,7 @@ class Sfc(base.Scenario): # pragma: no cover " :) \n" + '\033[0m') def teardown(self): - ''' for scenario teardown remove tacker VNFs, chains and classifiers''' + """ for scenario teardown remove tacker VNFs, chains and classifiers""" self.teardown_script = pkg_resources.resource_filename( "yardstick.benchmark.scenarios.networking", Sfc.TEARDOWN_SCRIPT) @@ -193,7 +193,7 @@ class Sfc(base.Scenario): # pragma: no cover self.teardown_done = True -'''def _test(): # pragma: no cover +"""def _test(): # pragma: no cover internal test function logger = logging.getLogger("Sfc Yardstick") @@ -208,4 +208,4 @@ class Sfc(base.Scenario): # pragma: no cover sfc.teardown() if __name__ == '__main__': # pragma: no cover - _test()''' + _test()""" diff --git a/yardstick/benchmark/scenarios/networking/vnf_generic.py b/yardstick/benchmark/scenarios/networking/vnf_generic.py new file mode 100644 index 000000000..447c550ed --- /dev/null +++ b/yardstick/benchmark/scenarios/networking/vnf_generic.py @@ -0,0 +1,328 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" NSPerf specific scenario definition """ + +from __future__ import absolute_import +import logging +import yaml + +from yardstick.benchmark.scenarios import base +from yardstick.common.utils import import_modules_from_package, itersubclasses +from yardstick.network_services.collector.subscriber import Collector +from yardstick.network_services.vnf_generic import vnfdgen +from yardstick.network_services.vnf_generic.vnf.base import GenericVNF +from yardstick.network_services.traffic_profile.base import TrafficProfile +from yardstick import ssh + +LOG = logging.getLogger(__name__) + + +class SSHError(Exception): + """Class handles ssh connection error exception""" + pass + + +class SSHTimeout(SSHError): + """Class handles ssh connection timeout exception""" + pass + + +class IncorrectConfig(Exception): + """Class handles incorrect configuration during setup""" + pass + + +class IncorrectSetup(Exception): + """Class handles incorrect setup during setup""" + pass + + +class SshManager(object): + def __init__(self, node): + super(SshManager, self).__init__() + self.node = node + self.conn = None + + def __enter__(self): + """ + args -> network device mappings + returns -> ssh connection ready to be used + """ + try: + ssh_port = self.node.get("ssh_port", ssh.DEFAULT_PORT) + self.conn = ssh.SSH(user=self.node["user"], + host=self.node["ip"], + password=self.node["password"], + port=ssh_port) + self.conn.wait() + except (SSHError) as error: + LOG.info("connect failed to %s, due to %s", self.node["ip"], error) + # self.conn defaults to None + return self.conn + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.conn: + self.conn.close() + + +class NetworkServiceTestCase(base.Scenario): + """Class handles Generic framework to do pre-deployment VNF & + Network service testing """ + + __scenario_type__ = "NSPerf" + + def __init__(self, scenario_cfg, context_cfg): # Yardstick API + super(NetworkServiceTestCase, self).__init__() + self.scenario_cfg = scenario_cfg + self.context_cfg = context_cfg + + # fixme: create schema to validate all fields have been provided + with open(scenario_cfg["topology"]) as stream: + self.topology = yaml.load(stream)["nsd:nsd-catalog"]["nsd"][0] + self.vnfs = [] + self.collector = None + self.traffic_profile = None + + @classmethod + def _get_traffic_flow(cls, scenario_cfg): + try: + with open(scenario_cfg["traffic_options"]["flow"]) as fflow: + flow = yaml.load(fflow) + except (KeyError, IOError, OSError): + flow = {} + return flow + + @classmethod + def _get_traffic_imix(cls, scenario_cfg): + try: + with open(scenario_cfg["traffic_options"]["imix"]) as fimix: + imix = yaml.load(fimix) + except (KeyError, IOError, OSError): + imix = {} + return imix + + @classmethod + def _get_traffic_profile(cls, scenario_cfg, context_cfg): + traffic_profile_tpl = "" + private = {} + public = {} + try: + with open(scenario_cfg["traffic_profile"]) as infile: + traffic_profile_tpl = infile.read() + + except (KeyError, IOError, OSError): + raise + + return [traffic_profile_tpl, private, public] + + def _fill_traffic_profile(self, scenario_cfg, context_cfg): + traffic_profile = {} + + flow = self._get_traffic_flow(scenario_cfg) + + imix = self._get_traffic_imix(scenario_cfg) + + traffic_mapping, private, public = \ + self._get_traffic_profile(scenario_cfg, context_cfg) + + traffic_profile = vnfdgen.generate_vnfd(traffic_mapping, + {"imix": imix, "flow": flow, + "private": private, + "public": public}) + + return TrafficProfile.get(traffic_profile) + + @classmethod + def _find_vnf_name_from_id(cls, topology, vnf_id): + return next((vnfd["vnfd-id-ref"] + for vnfd in topology["constituent-vnfd"] + if vnf_id == vnfd["member-vnf-index"]), None) + + def _resolve_topology(self, context_cfg, topology): + for vld in topology["vld"]: + if len(vld["vnfd-connection-point-ref"]) > 2: + raise IncorrectConfig("Topology file corrupted, " + "too many endpoint for connection") + + node_0, node_1 = vld["vnfd-connection-point-ref"] + + node0 = self._find_vnf_name_from_id(topology, + node_0["member-vnf-index-ref"]) + node1 = self._find_vnf_name_from_id(topology, + node_1["member-vnf-index-ref"]) + + if0 = node_0["vnfd-connection-point-ref"] + if1 = node_1["vnfd-connection-point-ref"] + + try: + nodes = context_cfg["nodes"] + nodes[node0]["interfaces"][if0]["vld_id"] = vld["id"] + nodes[node1]["interfaces"][if1]["vld_id"] = vld["id"] + + nodes[node0]["interfaces"][if0]["dst_mac"] = \ + nodes[node1]["interfaces"][if1]["local_mac"] + nodes[node0]["interfaces"][if0]["dst_ip"] = \ + nodes[node1]["interfaces"][if1]["local_ip"] + + nodes[node1]["interfaces"][if1]["dst_mac"] = \ + nodes[node0]["interfaces"][if0]["local_mac"] + nodes[node1]["interfaces"][if1]["dst_ip"] = \ + nodes[node0]["interfaces"][if0]["local_ip"] + except KeyError: + raise IncorrectConfig("Required interface not found," + "topology file corrupted") + + @classmethod + def _find_list_index_from_vnf_idx(cls, topology, vnf_idx): + return next((topology["constituent-vnfd"].index(vnfd) + for vnfd in topology["constituent-vnfd"] + if vnf_idx == vnfd["member-vnf-index"]), None) + + def _update_context_with_topology(self, context_cfg, topology): + for idx in topology["constituent-vnfd"]: + vnf_idx = idx["member-vnf-index"] + nodes = context_cfg["nodes"] + node = self._find_vnf_name_from_id(topology, vnf_idx) + list_idx = self._find_list_index_from_vnf_idx(topology, vnf_idx) + nodes[node].update(topology["constituent-vnfd"][list_idx]) + + def map_topology_to_infrastructure(self, context_cfg, topology): + """ This method should verify if the available resources defined in pod.yaml + match the topology.yaml file. + + :param topology: + :return: None. Side effect: context_cfg is updated + """ + + for node, node_dict in context_cfg["nodes"].items(): + + cmd = "PATH=$PATH:/sbin:/usr/sbin ip addr show" + with SshManager(node_dict) as conn: + exit_status = conn.execute(cmd)[0] + if exit_status != 0: + raise IncorrectSetup("Node's %s lacks ip tool." % node) + + for interface in node_dict["interfaces"]: + network = node_dict["interfaces"][interface] + keys = ["vpci", "local_ip", "netmask", + "local_mac", "driver", "dpdk_port_num"] + missing = set(keys).difference(network) + if missing: + raise IncorrectConfig("Require interface fields '%s' " + "not found, topology file " + "corrupted" % ', '.join(missing)) + + # 3. Use topology file to find connections & resolve dest address + self._resolve_topology(context_cfg, topology) + self._update_context_with_topology(context_cfg, topology) + + @classmethod + def get_vnf_impl(cls, vnf_model): + """ Find the implementing class from vnf_model["vnf"]["name"] field + + :param vnf_model: dictionary containing a parsed vnfd + :return: subclass of GenericVNF + """ + import_modules_from_package( + "yardstick.network_services.vnf_generic.vnf") + expected_name = vnf_model['id'] + impl = (c for c in itersubclasses(GenericVNF) + if c.__name__ == expected_name) + try: + return next(impl) + except StopIteration: + raise IncorrectConfig("No implementation for %s", expected_name) + + def load_vnf_models(self, context_cfg): + """ Create VNF objects based on YAML descriptors + + :param context_cfg: + :return: + """ + vnfs = [] + for node in context_cfg["nodes"]: + LOG.debug(context_cfg["nodes"][node]) + with open(context_cfg["nodes"][node]["VNF model"]) as stream: + vnf_model = stream.read() + vnfd = vnfdgen.generate_vnfd(vnf_model, context_cfg["nodes"][node]) + vnf_impl = self.get_vnf_impl(vnfd["vnfd:vnfd-catalog"]["vnfd"][0]) + vnf_instance = vnf_impl(vnfd["vnfd:vnfd-catalog"]["vnfd"][0]) + vnf_instance.name = node + vnfs.append(vnf_instance) + + return vnfs + + def setup(self): + """ Setup infrastructure, provission VNFs & start traffic + + :return: + """ + + # 1. Verify if infrastructure mapping can meet topology + self.map_topology_to_infrastructure(self.context_cfg, self.topology) + # 1a. Load VNF models + self.vnfs = self.load_vnf_models(self.context_cfg) + # 1b. Fill traffic profile with information from topology + self.traffic_profile = self._fill_traffic_profile(self.scenario_cfg, + self.context_cfg) + + # 2. Provision VNFs + try: + for vnf in self.vnfs: + LOG.info("Instantiating %s", vnf.name) + vnf.instantiate(self.scenario_cfg, self.context_cfg) + except RuntimeError: + for vnf in self.vnfs: + vnf.terminate() + raise + + # 3. Run experiment + # Start listeners first to avoid losing packets + traffic_runners = [vnf for vnf in self.vnfs if vnf.runs_traffic] + for traffic_gen in traffic_runners: + traffic_gen.listen_traffic(self.traffic_profile) + + # register collector with yardstick for KPI collection. + self.collector = Collector(self.vnfs, self.traffic_profile) + self.collector.start() + + # Start the actual traffic + for traffic_gen in traffic_runners: + LOG.info("Starting traffic on %s", traffic_gen.name) + traffic_gen.run_traffic(self.traffic_profile) + + def run(self, result): # yardstick API + """ Yardstick calls run() at intervals defined in the yaml and + produces timestamped samples + + :param result: dictionary with results to update + :return: None + """ + + for vnf in self.vnfs: + # Result example: + # {"VNF1: { "tput" : [1000, 999] }, "VNF2": { "latency": 100 }} + LOG.debug("vnf") + result.update(self.collector.get_kpi(vnf)) + + def teardown(self): + """ Stop the collector and terminate VNF & TG instance + + :return + """ + + self.collector.stop() + for vnf in self.vnfs: + LOG.info("Stopping %s", vnf.name) + vnf.terminate() diff --git a/yardstick/benchmark/scenarios/networking/vsperf.py b/yardstick/benchmark/scenarios/networking/vsperf.py index 9d6db7c1d..f2c2ea9b8 100644 --- a/yardstick/benchmark/scenarios/networking/vsperf.py +++ b/yardstick/benchmark/scenarios/networking/vsperf.py @@ -112,7 +112,7 @@ class Vsperf(base.Scenario): None) def setup(self): - '''scenario setup''' + """scenario setup""" vsperf = self.context_cfg['host'] vsperf_user = vsperf.get('user', 'ubuntu') vsperf_ssh_port = vsperf.get('ssh_port', ssh.DEFAULT_PORT) diff --git a/yardstick/benchmark/scenarios/networking/vtc_instantiation_validation.py b/yardstick/benchmark/scenarios/networking/vtc_instantiation_validation.py index bf42d9a9a..ac57c929c 100644 --- a/yardstick/benchmark/scenarios/networking/vtc_instantiation_validation.py +++ b/yardstick/benchmark/scenarios/networking/vtc_instantiation_validation.py @@ -29,7 +29,7 @@ class VtcInstantiationValidation(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.options = self.scenario_cfg['options'] self.setup_done = True diff --git a/yardstick/benchmark/scenarios/networking/vtc_instantiation_validation_noisy.py b/yardstick/benchmark/scenarios/networking/vtc_instantiation_validation_noisy.py index fb6e762d1..d3a9a9a02 100644 --- a/yardstick/benchmark/scenarios/networking/vtc_instantiation_validation_noisy.py +++ b/yardstick/benchmark/scenarios/networking/vtc_instantiation_validation_noisy.py @@ -29,7 +29,7 @@ class VtcInstantiationValidationNoisy(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.options = self.scenario_cfg['options'] self.setup_done = True diff --git a/yardstick/benchmark/scenarios/networking/vtc_throughput.py b/yardstick/benchmark/scenarios/networking/vtc_throughput.py index 0754d3782..b9cb0b1e7 100644 --- a/yardstick/benchmark/scenarios/networking/vtc_throughput.py +++ b/yardstick/benchmark/scenarios/networking/vtc_throughput.py @@ -29,7 +29,7 @@ class VtcThroughput(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.options = self.scenario_cfg['options'] self.setup_done = True diff --git a/yardstick/benchmark/scenarios/networking/vtc_throughput_noisy.py b/yardstick/benchmark/scenarios/networking/vtc_throughput_noisy.py index 552ef8090..38ebc4c42 100644 --- a/yardstick/benchmark/scenarios/networking/vtc_throughput_noisy.py +++ b/yardstick/benchmark/scenarios/networking/vtc_throughput_noisy.py @@ -29,7 +29,7 @@ class VtcThroughputNoisy(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.options = self.scenario_cfg['options'] self.setup_done = True diff --git a/yardstick/benchmark/scenarios/parser/parser.py b/yardstick/benchmark/scenarios/parser/parser.py index 6d39733c6..eb16833e5 100644 --- a/yardstick/benchmark/scenarios/parser/parser.py +++ b/yardstick/benchmark/scenarios/parser/parser.py @@ -68,7 +68,7 @@ class Parser(base.Scenario): result['yangtotosca'] = "success" if p.returncode == 0 else "fail" def teardown(self): - ''' for scenario teardown remove parser and pyang ''' + """ for scenario teardown remove parser and pyang """ self.teardown_script = pkg_resources.resource_filename( "yardstick.benchmark.scenarios.parser", Parser.TEARDOWN_SCRIPT) @@ -77,7 +77,7 @@ class Parser(base.Scenario): def _test(): - '''internal test function''' + """internal test function""" pass diff --git a/yardstick/benchmark/scenarios/storage/fio.py b/yardstick/benchmark/scenarios/storage/fio.py index 2a8738e88..e28bd7bcc 100644 --- a/yardstick/benchmark/scenarios/storage/fio.py +++ b/yardstick/benchmark/scenarios/storage/fio.py @@ -58,7 +58,7 @@ class Fio(base.Scenario): self.setup_done = False def setup(self): - '''scenario setup''' + """scenario setup""" self.target_script = pkg_resources.resource_filename( "yardstick.benchmark.scenarios.storage", Fio.TARGET_SCRIPT) @@ -152,7 +152,7 @@ class Fio(base.Scenario): def _test(): - '''internal test function''' + """internal test function""" key_filename = pkg_resources.resource_filename("yardstick.resources", "files/yardstick_key") ctx = { diff --git a/yardstick/cmd/NSBperf.py b/yardstick/cmd/NSBperf.py new file mode 100755 index 000000000..dd96b7fc8 --- /dev/null +++ b/yardstick/cmd/NSBperf.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +"""NSBPERF main script. +""" + +from __future__ import absolute_import +from __future__ import print_function +import os +import argparse +import json +import subprocess +import signal + + +from six.moves import input + +CLI_PATH = os.path.dirname(os.path.realpath(__file__)) +REPO_PATH = os.path.abspath(os.path.join(CLI_PATH, os.pardir)) +PYTHONPATH = os.environ.get("PYTHONPATH", False) +VIRTUAL_ENV = os.environ.get("VIRTUAL_ENV", False) + + +if not PYTHONPATH or not VIRTUAL_ENV: + print("Please setup env PYTHONPATH & VIRTUAL_ENV environment varaible.") + raise SystemExit(1) + + +def handler(): + """ Capture ctrl+c and exit cli """ + subprocess.call(["pkill", "-9", "yardstick"]) + raise SystemExit(1) + +signal.signal(signal.SIGINT, handler) + + +class YardstickNSCli(object): + """ This class handles yardstick network serivce testing """ + + def __init__(self): + super(YardstickNSCli, self).__init__() + + @classmethod + def validate_input(cls, choice, choice_len): + """ Validate user inputs """ + if not str(choice): + return 1 + + choice = int(choice) + if not 1 <= choice <= choice_len: + print("\nInvalid wrong choice...") + input("Press Enter to continue...") + return 1 + subprocess.call(['clear']) + return 0 + + @classmethod + def parse_arguments(cls): + """ + Parse command line arguments. + """ + parser = \ + argparse.ArgumentParser( + prog=__file__, + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('--version', action='version', + version='%(prog)s 0.1') + parser.add_argument('--list', '--list-tests', action='store_true', + help='list all tests and exit') + parser.add_argument('--list-vnfs', action='store_true', + help='list all system vnfs and exit') + + group = parser.add_argument_group('test selection options') + group.add_argument('--vnf', help='vnf to use') + group.add_argument('--test', help='test in use') + + args = vars(parser.parse_args()) + + return args + + @classmethod + def generate_kpi_results(cls, tkey, tgen): + """ Generate report for vnf & traffic generator kpis """ + if tgen: + print("\n%s stats" % tkey) + print("----------------------------") + for key, value in tgen.items(): + if key != "collect_stats": + print(json.dumps({key: value}, indent=2)) + + @classmethod + def generate_nfvi_results(cls, nfvi): + """ Generate report for vnf & traffic generator kpis """ + if nfvi: + nfvi_kpi = {k: v for k, v in nfvi.items() if k == 'collect_stats'} + if nfvi_kpi: + print("\nNFVi stats") + print("----------------------------") + for key, value in nfvi_kpi.items(): + print(json.dumps({key: value}, indent=2)) + + def generate_final_report(self, test_case): + """ Function will check if partial test results are available + and generates final report in rst format. +""" + + report_caption = '{}\n{} ({})\n{}\n\n'.format( + '================================================================', + 'Performance report for', + os.path.splitext(test_case)[0].upper(), + '================================================================') + print(report_caption) + if os.path.isfile("/tmp/yardstick.out"): + lines = [] + with open("/tmp/yardstick.out") as infile: + lines = infile.readlines() + + if lines: + tc_res = json.loads(lines.pop(len(lines) - 1)) + for key, value in tc_res["benchmark"]["data"].items(): + self.generate_kpi_results(key, value) + self.generate_nfvi_results(value) + + @classmethod + def handle_list_options(cls, args, test_path): + """ Process --list cli arguments if needed + + :param args: A dictionary with all CLI arguments + """ + if args['list_vnfs']: + vnfs = os.listdir(test_path) + print("VNF :") + print("================") + for index, vnf in enumerate(vnfs, 1): + print((' %-2s %s' % ('%s:' % str(index), vnf))) + raise SystemExit(0) + + if args['list']: + vnfs = os.listdir(test_path) + + print("Available Tests:") + print("*****************") + for vnf in vnfs: + testcases = os.listdir(test_path + vnf) + print(("VNF :(%s)" % vnf)) + print("================") + for testcase in [tc for tc in testcases if "tc" in tc]: + print('%s' % testcase) + print(os.linesep) + raise SystemExit(0) + + @classmethod + def terminate_if_less_options(cls, args): + """ terminate cli if cmdline options is invalid """ + if not (args["vnf"] and args["test"]): + print("CLI needs option, make sure to pass vnf, test") + print("eg: NSBperf.py --vnf <vnf untertest> --test <test yaml>") + raise SystemExit(1) + + def run_test(self, args, test_path): + """ run requested test """ + try: + vnf = args.get("vnf", "") + test = args.get("test", "") + + vnf_dir = test_path + os.sep + vnf + if not os.path.exists(vnf_dir): + raise ValueError("'%s', vnf not supported." % vnf) + + testcases = [tc for tc in os.listdir(vnf_dir) if "tc" in tc] + subtest = set([test]).issubset(testcases) + if not subtest: + raise ValueError("'%s', testcase not supported." % test) + + os.chdir(vnf_dir) + # fixme: Use REST APIs to initiate testcases + subprocess.check_output(["yardstick", "--debug", + "task", "start", test]) + self.generate_final_report(test) + except (IOError, ValueError): + print("Value/I/O error...") + except BaseException: + print("Test failed. Please verify test inputs & re-run the test..") + print("eg: NSBperf.py --vnf <vnf untertest> --test <test yaml>") + + def main(self): + """Main function. + """ + test_path = os.path.join(REPO_PATH, "../samples/vnf_samples/nsut/") + os.chdir(os.path.join(REPO_PATH, "../")) + args = self.parse_arguments() + + # if required, handle list-* operations + self.handle_list_options(args, test_path) + + # check for input params + self.terminate_if_less_options(args) + + # run test + self.run_test(args, test_path) + +if __name__ == "__main__": + NS_CLI = YardstickNSCli() + NS_CLI.main() diff --git a/yardstick/cmd/__init__.py b/yardstick/cmd/__init__.py index 6b7d65792..3756d9ebb 100644 --- a/yardstick/cmd/__init__.py +++ b/yardstick/cmd/__init__.py @@ -10,7 +10,7 @@ from __future__ import print_function def print_hbar(barlen): - '''print to stdout a horizontal bar''' + """print to stdout a horizontal bar""" print(("+"), end=' ') print(("-" * barlen), end=' ') print("+") diff --git a/yardstick/cmd/cli.py b/yardstick/cmd/cli.py index 05bf8f06f..6281bb813 100644 --- a/yardstick/cmd/cli.py +++ b/yardstick/cmd/cli.py @@ -7,9 +7,9 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -''' +""" Command-line interface to yardstick -''' +""" from __future__ import absolute_import import logging @@ -57,7 +57,7 @@ def find_config_files(path_list): class YardstickCLI(): - '''Command-line interface to yardstick''' + """Command-line interface to yardstick""" # Command categories categories = { @@ -75,7 +75,7 @@ class YardstickCLI(): get_distribution('yardstick').version def _find_actions(self, subparsers, actions_module): - '''find action methods''' + """find action methods""" # Find action methods inside actions_module and # add them to the command parser. # The 'actions_module' argument may be a class @@ -94,7 +94,7 @@ class YardstickCLI(): subparser.set_defaults(func=callback) def _add_command_parsers(self, categories, subparsers): - '''add commands to command-line parser''' + """add commands to command-line parser""" for category in categories: command_object = categories[category]() desc = command_object.__doc__ or '' @@ -156,7 +156,7 @@ class YardstickCLI(): CONF.unregister_opts(self.opts) def main(self, argv): # pragma: no cover - '''run the command line interface''' + """run the command line interface""" try: self._register_cli_opt() @@ -169,7 +169,7 @@ class YardstickCLI(): self._clear_config_opts() def api(self, argv, task_id): # pragma: no cover - '''run the api interface''' + """run the api interface""" try: self._register_cli_opt() diff --git a/yardstick/cmd/commands/__init__.py b/yardstick/cmd/commands/__init__.py index 5c5356736..9bc0e9fac 100644 --- a/yardstick/cmd/commands/__init__.py +++ b/yardstick/cmd/commands/__init__.py @@ -1,10 +1,20 @@ from __future__ import absolute_import from yardstick.benchmark.core import Param +from api import client def change_osloobj_to_paras(args): param = Param({}) - for k in param.__dict__: + for k in vars(param): if hasattr(args, k): setattr(param, k, getattr(args, k)) return param + + +class Commands(object): + def __init__(self): + self.client = client + + def _change_to_dict(self, args): + p = Param({}) + return {k: getattr(args, k) for k in vars(p) if hasattr(args, k)} diff --git a/yardstick/cmd/commands/env.py b/yardstick/cmd/commands/env.py index dfcb63727..d5aef7faf 100644 --- a/yardstick/cmd/commands/env.py +++ b/yardstick/cmd/commands/env.py @@ -20,10 +20,10 @@ from yardstick.common.httpClient import HttpClient class EnvCommand(object): - ''' + """ Set of commands to prepare environment - ''' + """ def do_influxdb(self, args): data = {'action': 'createInfluxDBContainer'} diff --git a/yardstick/cmd/commands/plugin.py b/yardstick/cmd/commands/plugin.py index c3e951e8c..f97c490b7 100644 --- a/yardstick/cmd/commands/plugin.py +++ b/yardstick/cmd/commands/plugin.py @@ -18,21 +18,21 @@ from yardstick.cmd.commands import change_osloobj_to_paras class PluginCommands(object): - '''Plugin commands. + """Plugin commands. Set of commands to manage plugins. - ''' + """ @cliargs("input_file", type=str, help="path to plugin configuration file", nargs=1) def do_install(self, args): - '''Install a plugin.''' + """Install a plugin.""" param = change_osloobj_to_paras(args) Plugin().install(param) @cliargs("input_file", type=str, help="path to plugin configuration file", nargs=1) def do_remove(self, args): - '''Remove a plugin.''' + """Remove a plugin.""" param = change_osloobj_to_paras(args) Plugin().remove(param) diff --git a/yardstick/cmd/commands/runner.py b/yardstick/cmd/commands/runner.py index 02176aba3..b99ae789b 100644 --- a/yardstick/cmd/commands/runner.py +++ b/yardstick/cmd/commands/runner.py @@ -18,18 +18,18 @@ from yardstick.cmd.commands import change_osloobj_to_paras class RunnerCommands(object): - '''Runner commands. + """Runner commands. Set of commands to discover and display runner types. - ''' + """ def do_list(self, args): - '''List existing runner types''' + """List existing runner types""" param = change_osloobj_to_paras(args) Runners().list_all(param) @cliargs("type", type=str, help="runner type", nargs=1) def do_show(self, args): - '''Show details of a specific runner type''' + """Show details of a specific runner type""" param = change_osloobj_to_paras(args) Runners().show(param) diff --git a/yardstick/cmd/commands/scenario.py b/yardstick/cmd/commands/scenario.py index 5a6d04f55..618ed2915 100644 --- a/yardstick/cmd/commands/scenario.py +++ b/yardstick/cmd/commands/scenario.py @@ -17,18 +17,18 @@ from yardstick.cmd.commands import change_osloobj_to_paras class ScenarioCommands(object): - '''Scenario commands. + """Scenario commands. Set of commands to discover and display scenario types. - ''' + """ def do_list(self, args): - '''List existing scenario types''' + """List existing scenario types""" param = change_osloobj_to_paras(args) Scenarios().list_all(param) @cliargs("type", type=str, help="runner type", nargs=1) def do_show(self, args): - '''Show details of a specific scenario type''' + """Show details of a specific scenario type""" param = change_osloobj_to_paras(args) Scenarios().show(param) diff --git a/yardstick/cmd/commands/task.py b/yardstick/cmd/commands/task.py index fa82f078f..20ab086e5 100644 --- a/yardstick/cmd/commands/task.py +++ b/yardstick/cmd/commands/task.py @@ -1,4 +1,4 @@ -############################################################################## +############################################################################# # Copyright (c) 2015 Ericsson AB and others. # # All rights reserved. This program and the accompanying materials @@ -9,20 +9,22 @@ """ Handler for yardstick command 'task' """ from __future__ import print_function - from __future__ import absolute_import + from yardstick.benchmark.core.task import Task from yardstick.common.utils import cliargs +from yardstick.common.utils import write_json_to_file +from yardstick.common import constants as consts from yardstick.cmd.commands import change_osloobj_to_paras output_file_default = "/tmp/yardstick.out" class TaskCommands(object): - '''Task commands. + """Task commands. Set of commands to manage benchmark tasks. - ''' + """ @cliargs("inputfile", type=str, help="path to task or suite file", nargs=1) @cliargs("--task-args", dest="task_args", @@ -42,4 +44,18 @@ class TaskCommands(object): action="store_true") def do_start(self, args, **kwargs): param = change_osloobj_to_paras(args) - Task().start(param) + + self._init_result_file() + + try: + Task().start(param) + except Exception as e: + self._write_error_data(e) + + def _init_result_file(self): + data = {'status': 0, 'result': []} + write_json_to_file(consts.DEFAULT_OUTPUT_FILE, data) + + def _write_error_data(self, error): + data = {'status': 2, 'result': str(error)} + write_json_to_file(consts.DEFAULT_OUTPUT_FILE, data) diff --git a/yardstick/cmd/commands/testcase.py b/yardstick/cmd/commands/testcase.py index 92831ad2f..a151871b3 100644 --- a/yardstick/cmd/commands/testcase.py +++ b/yardstick/cmd/commands/testcase.py @@ -9,26 +9,39 @@ """ Handler for yardstick command 'testcase' """ from __future__ import print_function - from __future__ import absolute_import + from yardstick.benchmark.core.testcase import Testcase +from yardstick.benchmark.core import print_hbar from yardstick.common.utils import cliargs from yardstick.cmd.commands import change_osloobj_to_paras +from yardstick.cmd.commands import Commands -class TestcaseCommands(object): - '''Testcase commands. +class TestcaseCommands(Commands): + """Testcase commands. Set of commands to discover and display test cases. - ''' + """ def do_list(self, args): - '''List existing test cases''' - param = change_osloobj_to_paras(args) - Testcase().list_all(param) + """List existing test cases""" + testcase_list = self.client.get('/yardstick/testcases')['result'] + self._format_print(testcase_list) @cliargs("casename", type=str, help="test case name", nargs=1) def do_show(self, args): - '''Show details of a specific test case''' + """Show details of a specific test case""" param = change_osloobj_to_paras(args) Testcase().show(param) + + def _format_print(self, testcase_list): + """format output""" + + print_hbar(88) + print("| %-21s | %-60s" % ("Testcase Name", "Description")) + print_hbar(88) + for testcase_record in testcase_list: + print("| %-16s | %-60s" % (testcase_record['Name'], + testcase_record['Description'])) + print_hbar(88) diff --git a/yardstick/common/constants.py b/yardstick/common/constants.py index d99e216f4..e068c0b98 100644 --- a/yardstick/common/constants.py +++ b/yardstick/common/constants.py @@ -31,8 +31,12 @@ INSTALLERS = ['apex', 'compass', 'fuel', 'joid'] YARDSTICK_ROOT_PATH = dirname(dirname(dirname(abspath(__file__)))) + sep +TESTCASE_DIR = join(YARDSTICK_ROOT_PATH, 'tests/opnfv/test_cases/') + YARDSTICK_REPOS_DIR = '/home/opnfv/repos/yardstick' +YARDSTICK_LOG_DIR = '/tmp/yardstick/' + YARDSTICK_CONFIG_DIR = '/etc/yardstick/' YARDSTICK_CONFIG_FILE = join(YARDSTICK_CONFIG_DIR, 'yardstick.conf') @@ -55,3 +59,7 @@ OPENSTACK_RC_FILE = join(YARDSTICK_CONFIG_DIR, 'openstack.creds') BASE_URL = 'http://localhost:5000' ENV_ACTION_API = BASE_URL + '/yardstick/env/action' ASYNC_TASK_API = BASE_URL + '/yardstick/asynctask' + +SQLITE = 'sqlite:////tmp/yardstick.db' + +DEFAULT_OUTPUT_FILE = '/tmp/yardstick.out' diff --git a/yardstick/common/template_format.py b/yardstick/common/template_format.py index 2432c5dc6..e1662ced1 100644 --- a/yardstick/common/template_format.py +++ b/yardstick/common/template_format.py @@ -42,11 +42,11 @@ yaml_loader.add_constructor(u'tag:yaml.org,2002:timestamp', def parse(tmpl_str): - '''Takes a string and returns a dict containing the parsed structure. + """Takes a string and returns a dict containing the parsed structure. This includes determination of whether the string is using the JSON or YAML format. - ''' + """ if tmpl_str.startswith('{'): tpl = jsonutils.loads(tmpl_str) else: diff --git a/yardstick/common/utils.py b/yardstick/common/utils.py index 57ace14e6..174ac0a5a 100644 --- a/yardstick/common/utils.py +++ b/yardstick/common/utils.py @@ -30,6 +30,7 @@ from keystoneauth1 import identity from keystoneauth1 import session from neutronclient.v2_0 import client from oslo_utils import importutils +from oslo_serialization import jsonutils import yardstick @@ -145,3 +146,13 @@ def get_neutron_client(): sess = get_openstack_session() neutron_client = client.Client(session=sess) return neutron_client + + +def write_json_to_file(path, data, mode='w'): + with open(path, mode) as f: + jsonutils.dump(data, f) + + +def write_file(path, data, mode='w'): + with open(path, mode) as f: + f.write(data) diff --git a/yardstick/dispatcher/base.py b/yardstick/dispatcher/base.py index 6e863cadc..09ce8d1e8 100644 --- a/yardstick/dispatcher/base.py +++ b/yardstick/dispatcher/base.py @@ -31,7 +31,7 @@ class Base(object): @staticmethod def get_cls(dispatcher_type): - '''Return class of specified type.''' + """Return class of specified type.""" for dispatcher in utils.itersubclasses(Base): if dispatcher_type == dispatcher.__dispatcher_type__: return dispatcher diff --git a/yardstick/dispatcher/file.py b/yardstick/dispatcher/file.py index 9c728e983..8d3c3693d 100644 --- a/yardstick/dispatcher/file.py +++ b/yardstick/dispatcher/file.py @@ -18,28 +18,9 @@ from __future__ import absolute_import -import logging -import logging.handlers - -from oslo_serialization import jsonutils -from oslo_config import cfg - from yardstick.dispatcher.base import Base as DispatchBase - -CONF = cfg.CONF -OPTS = [ - cfg.StrOpt('file_path', - default='/tmp/yardstick.out', - help='Name and the location of the file to record ' - 'data.'), - cfg.IntOpt('max_bytes', - default=0, - help='The max size of the file.'), - cfg.IntOpt('backup_count', - default=0, - help='The max number of the files to keep.'), -] -CONF.register_opts(OPTS, group="dispatcher_file") +from yardstick.common import constants as consts +from yardstick.common import utils class FileDispatcher(DispatchBase): @@ -50,29 +31,13 @@ class FileDispatcher(DispatchBase): def __init__(self, conf): super(FileDispatcher, self).__init__(conf) - self.log = None - - # if the directory and path are configured, then log to the file - if CONF.dispatcher_file.file_path: - dispatcher_logger = logging.Logger('dispatcher.file') - dispatcher_logger.setLevel(logging.INFO) - # create rotating file handler which logs result - rfh = logging.handlers.RotatingFileHandler( - self.conf.get('file_path', CONF.dispatcher_file.file_path), - maxBytes=CONF.dispatcher_file.max_bytes, - backupCount=CONF.dispatcher_file.backup_count, - encoding='utf8') - - rfh.setLevel(logging.INFO) - # Only wanted the data to be saved in the file, not the - # project root logger. - dispatcher_logger.propagate = False - dispatcher_logger.addHandler(rfh) - self.log = dispatcher_logger + self.result = [] def record_result_data(self, data): - if self.log: - self.log.info(jsonutils.dump_as_bytes(data)) + self.result.append(data) def flush_result_data(self): - pass + file_path = self.conf.get('file_path', consts.DEFAULT_OUTPUT_FILE) + + data = {'status': 1, 'result': self.result} + utils.write_json_to_file(file_path, data) diff --git a/yardstick/main.py b/yardstick/main.py index 5d427beb8..5fc0c2e17 100755 --- a/yardstick/main.py +++ b/yardstick/main.py @@ -45,7 +45,7 @@ from yardstick.cmd.cli import YardstickCLI def main(): - '''yardstick main''' + """yardstick main""" YardstickCLI().main(sys.argv[1:]) if __name__ == '__main__': diff --git a/yardstick/network_services/__init__.py b/yardstick/network_services/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/network_services/__init__.py diff --git a/yardstick/network_services/collector/__init__.py b/yardstick/network_services/collector/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/network_services/collector/__init__.py diff --git a/yardstick/network_services/collector/publisher.py b/yardstick/network_services/collector/publisher.py new file mode 100644 index 000000000..004d4774b --- /dev/null +++ b/yardstick/network_services/collector/publisher.py @@ -0,0 +1,29 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""This module implements stub for publishing results in yardstick format.""" + + +class Publisher(object): + """Class that handles publishing test results in yardstick format.""" + + def __init__(self): + super(Publisher, self).__init__() + + def start(self): + """Nothing to do, yet""" + pass + + def stop(self): + """Nothing to do, yet""" + pass diff --git a/yardstick/network_services/collector/subscriber.py b/yardstick/network_services/collector/subscriber.py new file mode 100644 index 000000000..3bcb20876 --- /dev/null +++ b/yardstick/network_services/collector/subscriber.py @@ -0,0 +1,39 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""This module implements stub for publishing results in yardstick format.""" + + +class Collector(object): + """Class that handles dictionary of results in yardstick-plot format.""" + + def __init__(self, traffic_profile, vnfs): + super(Collector, self).__init__() + self.traffic_profile = traffic_profile + self.service = vnfs + + def start(self): + """Nothing to do, yet""" + pass + + def stop(self): + """Nothing to do, yet""" + pass + + @classmethod + def get_kpi(cls, vnf): + """Returns dictionary of results in yardstick-plot format + + :return: + """ + return {vnf.name: vnf.collect_kpi()} diff --git a/yardstick/network_services/nfvi/__init__.py b/yardstick/network_services/nfvi/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/network_services/nfvi/__init__.py diff --git a/yardstick/network_services/nfvi/collectd.conf b/yardstick/network_services/nfvi/collectd.conf new file mode 100644 index 000000000..abcf24ded --- /dev/null +++ b/yardstick/network_services/nfvi/collectd.conf @@ -0,0 +1,80 @@ +# Config file for collectd(1). +# +# Some plugins need additional configuration and are disabled by default. +# Please read collectd.conf(5) for details. +# +# You should also read /usr/share/doc/collectd-core/README.Debian.plugins +# before enabling any more plugins. + +############################################################################## +# Global # +#----------------------------------------------------------------------------# +# Global settings for the daemon. # +############################################################################## + +Hostname "nsb_stats" +FQDNLookup true + +Interval 5 + +############################################################################## +# LoadPlugin section # +#----------------------------------------------------------------------------# +# Specify what features to activate. # +############################################################################## + +LoadPlugin amqp +LoadPlugin cpu +LoadPlugin intel_rdt +LoadPlugin memory + +############################################################################## +# Plugin configuration # +#----------------------------------------------------------------------------# +# In this section configuration stubs for each plugin are provided. A desc- # +# ription of those options is available in the collectd.conf(5) manual page. # +############################################################################## + +<Plugin amqp> + <Publish "name"> + Host "0.0.0.0" + Port "5672" + VHost "/" + User "admin" + Password "admin" + Exchange "amq.fanout" + RoutingKey "collectd" + Persistent false + StoreRates false + ConnectionRetryDelay 0 + </Publish> +</Plugin> + +<Plugin cpu> + ReportByCpu true + ReportByState true + ValuesPercentage false +</Plugin> + +<Plugin memory> + ValuesAbsolute true + ValuesPercentage false +</Plugin> + +<LoadPlugin intel_rdt> + Interval 5 +</LoadPlugin> +<Plugin "intel_rdt"> + Cores "" +</Plugin> + +<Plugin memcached> + <Instance "local"> + Host "127.0.0.1" + Port "11211" + </Instance> +</Plugin> + +<Include "/etc/collectd/collectd.conf.d"> + Filter "*.conf" +</Include> diff --git a/yardstick/network_services/nfvi/collectd.py b/yardstick/network_services/nfvi/collectd.py new file mode 100644 index 000000000..ea80e4ff8 --- /dev/null +++ b/yardstick/network_services/nfvi/collectd.py @@ -0,0 +1,158 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" AMQP Consumer senario definition """ + +from __future__ import absolute_import +from __future__ import print_function +import logging +import pika +from pika.exceptions import AMQPConnectionError + + +class AmqpConsumer(object): + """ This Class handles amqp consumer and collects collectd data """ + EXCHANGE = 'amq.fanout' + EXCHANGE_TYPE = 'fanout' + QUEUE = '' + ROUTING_KEY = 'collectd' + + def __init__(self, amqp_url, queue): + self._connection = None + self._channel = None + self._closing = False + self._consumer_tag = None + self._url = amqp_url + self._queue = queue + + def connect(self): + """ connect to amqp url """ + try: + return pika.SelectConnection(pika.URLParameters(self._url), + self.on_connection_open, + stop_ioloop_on_close=False) + except AMQPConnectionError: + raise RuntimeError + + def on_connection_open(self, unused_connection): + """ call back from pika & open channel """ + logging.info("list of unused connections %s", unused_connection) + self._connection.add_on_close_callback(self.on_connection_closed) + self._connection.channel(on_open_callback=self.on_channel_open) + + def on_connection_closed(self, connection, reply_code, reply_text): + """ close the amqp connections. if force close, try re-connect """ + logging.info("amqp connection (%s)", connection) + self._channel = None + if self._closing: + self._connection.ioloop.stop() + else: + logging.debug(('Connection closed, reopening in 5 sec: (%s) %s', + reply_code, reply_text)) + self._connection.add_timeout(5, self.reconnect) + + def reconnect(self): + """ re-connect amqp consumer""" + self._connection.ioloop.stop() + + if not self._closing: + self._connection = self.connect() + self._connection.ioloop.start() + + def on_channel_open(self, channel): + """ add close callback & setup exchange """ + self._channel = channel + self.add_on_channel_close_callback() + self._channel.exchange_declare(self.on_exchange_declareok, + self.EXCHANGE, + self.EXCHANGE_TYPE, + durable=True, auto_delete=False) + + def add_on_channel_close_callback(self): + """ register for close callback """ + self._channel.add_on_close_callback(self.on_channel_closed) + + def on_channel_closed(self, channel, reply_code, reply_text): + """ close amqp channel connection """ + logging.info("amqp channel closed channel(%s), " + "reply_code(%s) reply_text(%s)", + channel, reply_code, reply_text) + self._connection.close() + + def on_exchange_declareok(self, unused_frame): + """ if exchange declare is ok, setup queue """ + logging.info("amqp exchange unused frame (%s)", unused_frame) + self.setup_queue(self.QUEUE) + + def setup_queue(self, queue_name): + """ setup queue & declare same with channel """ + logging.info("amqp queue name (%s)", queue_name) + self._channel.queue_declare(self.on_queue_declareok, queue_name) + + def on_queue_declareok(self, method_frame): + """ bind queue to channel """ + logging.info("amqp queue method frame (%s)", method_frame) + self._channel.queue_bind(self._on_bindok, self.QUEUE, + self.EXCHANGE, self.ROUTING_KEY) + + def _on_bindok(self, unused_frame): + """ call back on bind start consuming data from amqp queue """ + logging.info("amqp unused frame %s", unused_frame) + self.add_on_cancel_callback() + self._consumer_tag = self._channel.basic_consume(self.on_message, + self.QUEUE) + + def add_on_cancel_callback(self): + """ add cancel func to amqp callback """ + self._channel.add_on_cancel_callback(self.on_consumer_cancelled) + + def on_consumer_cancelled(self, method_frame): + """ on cancel close the channel """ + logging.info("amqp method frame %s", method_frame) + if self._channel: + self._channel.close() + + def on_message(self, unused_channel, basic_deliver, properties, body): + """ parse received data from amqp server (collectd) """ + logging.info("amqp unused channel %s, properties %s", + unused_channel, properties) + metrics = body.rsplit() + self._queue.put({metrics[1]: metrics[3]}) + self.ack_message(basic_deliver.delivery_tag) + + def ack_message(self, delivery_tag): + """ acknowledge amqp msg """ + self._channel.basic_ack(delivery_tag) + + def on_cancelok(self, unused_frame): + """ initiate amqp close channel on callback """ + logging.info("amqp unused frame %s", unused_frame) + self._channel.close() + + def run(self): + """ Initiate amqp connection. """ + self._connection = self.connect() + self._connection.ioloop.start() + + def stop(self): + """ stop amqp consuming data """ + self._closing = True + if self._channel: + self._channel.basic_cancel(self.on_cancelok, self._consumer_tag) + + if self._connection: + self._connection.ioloop.start() + + def close_connection(self): + """ close amqp connection """ + self._connection.close() diff --git a/yardstick/network_services/nfvi/collectd.sh b/yardstick/network_services/nfvi/collectd.sh new file mode 100755 index 000000000..7acb40431 --- /dev/null +++ b/yardstick/network_services/nfvi/collectd.sh @@ -0,0 +1,89 @@ +#!/bin/bash +# +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +INSTALL_NSB_BIN="/opt/nsb_bin" +cd $INSTALL_NSB_BIN + +if [ "$(whoami)" != "root" ]; then + echo "Must be root to run $0" + exit 1; +fi + +echo "Install required libraries to run collectd..." +pkg=(git flex bison build-essential pkg-config automake autotools-dev libltdl-dev librabbitmq-dev rabbitmq-server) +for i in "${pkg[@]}"; do +dpkg-query -W --showformat='${Status}\n' "${i}"|grep "install ok installed" + if [ "$?" -eq "1" ]; then + apt-get -y install "${i}"; + fi +done +echo "Done" + +ldconfig -p | grep libpqos >/dev/null +if [ $? -eq 0 ] +then + echo "Intel RDT library already installed. Done" +else + pushd . + + echo "Get intel_rdt repo and install..." + rm -rf intel-cmt-cat >/dev/null + git clone https://github.com/01org/intel-cmt-cat.git + pushd intel-cmt-cat + git checkout tags/v1.5 -b v1.5 + make install PREFIX=/usr + popd + + popd + echo "Done." +fi + +which /opt/nsb_bin/collectd/collectd >/dev/null +if [ $? -eq 0 ] +then + echo "Collectd already installed. Done" +else + pushd . + echo "Get collectd from repository and install..." + rm -rf collectd >/dev/null + git clone https://github.com/collectd/collectd.git + pushd collectd + git stash + git checkout -b collectd 43a4db3b3209f497a0ba408aebf8aee385c6262d + ./build.sh + ./configure --with-libpqos=/usr/ + make install > /dev/null + popd + echo "Done." + popd +fi + +modprobe msr +cp $INSTALL_NSB_BIN/collectd.conf /opt/collectd/etc/ + +echo "Check if admin user already created" +rabbitmqctl list_users | grep '^admin$' > /dev/null +if [ $? -eq 0 ]; +then + echo "'admin' user already created..." +else + echo "Creating 'admin' user for collectd data export..." + rabbitmqctl delete_user guest + rabbitmqctl add_user admin admin + rabbitmqctl authenticate_user admin admin + rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" + echo "Done" +fi diff --git a/yardstick/network_services/nfvi/resource.py b/yardstick/network_services/nfvi/resource.py new file mode 100644 index 000000000..d71e1e995 --- /dev/null +++ b/yardstick/network_services/nfvi/resource.py @@ -0,0 +1,162 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Resource collection definitions """ + +from __future__ import absolute_import +import logging +import os.path +import re +import multiprocessing +from oslo_config import cfg + +from yardstick import ssh +from yardstick.network_services.nfvi.collectd import AmqpConsumer +from yardstick.network_services.utils import provision_tool + +CONF = cfg.CONF +ZMQ_OVS_PORT = 5567 +ZMQ_POLLING_TIME = 12000 + + +class ResourceProfile(object): + """ + This profile adds a resource at the beginning of the test session + """ + + def __init__(self, vnfd, cores): + self.enable = True + self.connection = None + self.cores = cores + + mgmt_interface = vnfd.get("mgmt-interface") + user = mgmt_interface.get("user") + passwd = mgmt_interface.get("password") + ip_addr = mgmt_interface.get("ip") + self.vnfip = mgmt_interface.get("host", ip_addr) + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + self.connection = ssh.SSH(user, self.vnfip, + password=passwd, port=ssh_port) + self.connection.wait() + + def check_if_sa_running(self, process): + """ verify if system agent is running """ + err, pid, _ = self.connection.execute("pgrep -f %s" % process) + return [err == 0, pid] + + def run_collectd_amqp(self, queue): + """ run amqp consumer to collect the NFVi data """ + amqp = \ + AmqpConsumer('amqp://admin:admin@{}:5672/%2F'.format(self.vnfip), + queue) + try: + amqp.run() + except (AttributeError, RuntimeError, KeyboardInterrupt): + amqp.stop() + + @classmethod + def get_cpu_data(cls, reskey, value): + """ Get cpu topology of the host """ + pattern = r"-(\d+)" + if "cpufreq" in reskey[1]: + match = re.search(pattern, reskey[2], re.MULTILINE) + metric = reskey[1] + else: + match = re.search(pattern, reskey[1], re.MULTILINE) + metric = reskey[2] + + time, val = re.split(":", value) + if match: + return [str(match.group(1)), metric, val, time] + + return ["error", "Invalid", ""] + + def parse_collectd_result(self, metrics, listcores): + """ convert collectd data into json""" + res = {"cpu": {}, "memory": {}} + testcase = "" + + for key, value in metrics.items(): + reskey = key.rsplit("/") + if "cpu" in reskey[1] or "intel_rdt" in reskey[1]: + cpu_key, name, metric, testcase = \ + self.get_cpu_data(reskey, value) + if cpu_key in listcores: + res["cpu"].setdefault(cpu_key, {}).update({name: metric}) + elif "memory" in reskey[1]: + val = re.split(":", value)[1] + res["memory"].update({reskey[2]: val}) + res["timestamp"] = testcase + + return res + + def amqp_collect_nfvi_kpi(self, _queue=multiprocessing.Queue()): + """ amqp collect and return nfvi kpis """ + try: + metric = {} + amqp_client = \ + multiprocessing.Process(target=self.run_collectd_amqp, + args=(_queue,)) + amqp_client.start() + amqp_client.join(7) + amqp_client.terminate() + + while not _queue.empty(): + metric.update(_queue.get()) + except (AttributeError, RuntimeError, TypeError, ValueError): + logging.debug("Failed to get NFVi stats...") + msg = {} + else: + msg = self.parse_collectd_result(metric, self.cores) + + return msg + + @classmethod + def _start_collectd(cls, connection, bin_path): + connection.execute('pkill -9 collectd') + collectd = os.path.join(bin_path, "collectd.sh") + provision_tool(connection, collectd) + provision_tool(connection, os.path.join(bin_path, "collectd.conf")) + + # Reset amqp queue + connection.execute("sudo service rabbitmq-server start") + connection.execute("sudo rabbitmqctl stop_app") + connection.execute("sudo rabbitmqctl reset") + connection.execute("sudo rabbitmqctl start_app") + connection.execute("sudo service rabbitmq-server restart") + + # Run collectd + connection.execute(collectd) + connection.execute(os.path.join(bin_path, "collectd", "collectd")) + + def initiate_systemagent(self, bin_path): + """ Start system agent for NFVi collection on host """ + if self.enable: + self._start_collectd(self.connection, bin_path) + + def start(self): + """ start nfvi collection """ + if self.enable: + logging.debug("Start NVFi metric collection...") + + def stop(self): + """ stop nfvi collection """ + if self.enable: + agent = "collectd" + logging.debug("Stop resource monitor...") + status, pid = self.check_if_sa_running(agent) + if status: + self.connection.execute('kill -9 %s' % pid) + self.connection.execute('pkill -9 %s' % agent) + self.connection.execute('service rabbitmq-server stop') + self.connection.execute("sudo rabbitmqctl stop_app") diff --git a/yardstick/network_services/traffic_profile/__init__.py b/yardstick/network_services/traffic_profile/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/network_services/traffic_profile/__init__.py diff --git a/yardstick/network_services/traffic_profile/base.py b/yardstick/network_services/traffic_profile/base.py new file mode 100644 index 000000000..906498586 --- /dev/null +++ b/yardstick/network_services/traffic_profile/base.py @@ -0,0 +1,64 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Base class for the generic traffic profile implementation """ + +from __future__ import absolute_import +from yardstick.common.utils import import_modules_from_package, itersubclasses + + +class TrafficProfile(object): + """ + This class defines the behavior + + """ + + @staticmethod + def get(tp_config): + """Get the traffic profile instance for the given traffic type + + :param tp_config: loaded YAML file + :return: + """ + profile_class = tp_config["traffic_profile"]["traffic_type"] + import_modules_from_package( + "yardstick.network_services.traffic_profile") + try: + return next(c for c in itersubclasses(TrafficProfile) + if c.__name__ == profile_class)(tp_config) + except StopIteration: + raise RuntimeError("No implementation for %s", profile_class) + + def __init__(self, tp_config): + # e.g. RFC2544 start_ip, stop_ip, drop_rate, + # IMIX = {"10K": 0.1, "100M": 0.5} + self.params = tp_config + + def execute(self, traffic_generator): + """ This methods defines the behavior of the traffic generator. + It will be called in a loop until the traffic generator exits. + + :param traffic_generator: TrafficGen instance + :return: None + """ + raise NotImplementedError() + + +class DummyProfile(TrafficProfile): + """ + This is an empty TrafficProfile implementation - if it is used, + the traffic will be completely handled by the Traffic Generator + implementation with no regard for the Traffic Profile. + """ + def execute(self, traffic_generator): + pass diff --git a/yardstick/network_services/traffic_profile/fixed.py b/yardstick/network_services/traffic_profile/fixed.py new file mode 100644 index 000000000..a456c2bd7 --- /dev/null +++ b/yardstick/network_services/traffic_profile/fixed.py @@ -0,0 +1,60 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Fixed traffic profile definitions """ + +from __future__ import absolute_import + +from yardstick.network_services.traffic_profile.base import TrafficProfile +from stl.trex_stl_lib.trex_stl_streams import STLTXCont +from stl.trex_stl_lib.trex_stl_client import STLStream +from stl.trex_stl_lib.trex_stl_packet_builder_scapy import STLPktBuilder +from stl.trex_stl_lib import api as Pkt + + +class FixedProfile(TrafficProfile): + """ + This profile adds a single stream at the beginning of the traffic session + """ + def __init__(self, tp_config): + super(FixedProfile, self).__init__(tp_config) + self.first_run = True + + def execute(self, traffic_generator): + if self.first_run: + for index, ports in enumerate(traffic_generator.my_ports): + ext_intf = \ + traffic_generator.vnfd["vdu"][0]["external-interface"] + virtual_interface = ext_intf[index]["virtual-interface"] + src_ip = virtual_interface["local_ip"] + dst_ip = virtual_interface["dst_ip"] + + traffic_generator.client.add_streams( + self._create_stream(src_ip, dst_ip), + ports=[ports]) + + traffic_generator.client.start(ports=traffic_generator.my_ports) + self.first_run = False + + def _create_stream(self, src_ip, dst_ip): + base_frame = \ + Pkt.Ether() / Pkt.IP(src=src_ip, dst=dst_ip) / Pkt.UDP(dport=12, + sport=1025) + + frame_size = self.params["traffic_profile"]["frame_size"] + pad_size = max(0, frame_size - len(base_frame)) + frame = base_frame / ("x" * max(0, pad_size)) + + frame_rate = self.params["traffic_profile"]["frame_rate"] + return STLStream(packet=STLPktBuilder(pkt=frame), + mode=STLTXCont(pps=frame_rate)) diff --git a/yardstick/network_services/traffic_profile/http.py b/yardstick/network_services/traffic_profile/http.py new file mode 100644 index 000000000..2d00fb849 --- /dev/null +++ b/yardstick/network_services/traffic_profile/http.py @@ -0,0 +1,33 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Generic HTTP profile used by different Traffic generators """ + +from __future__ import absolute_import + +from yardstick.network_services.traffic_profile.base import TrafficProfile + + +class TrafficProfileGenericHTTP(TrafficProfile): + """ This Class handles setup of generic http traffic profile """ + + def __init__(self, TrafficProfile): + super(TrafficProfileGenericHTTP, self).__init__(TrafficProfile) + + def execute(self, traffic_generator): + ''' send run traffic for a selected traffic generator''' + pass + + def _send_http_request(self, server, port, locator, **kwargs): + ''' send http request for a given server, port ''' + pass diff --git a/yardstick/network_services/traffic_profile/rfc2544.py b/yardstick/network_services/traffic_profile/rfc2544.py new file mode 100644 index 000000000..99964d329 --- /dev/null +++ b/yardstick/network_services/traffic_profile/rfc2544.py @@ -0,0 +1,106 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" RFC2544 Throughput implemenation """ + +from __future__ import absolute_import +from __future__ import division +import logging + +from yardstick.network_services.traffic_profile.traffic_profile \ + import TrexProfile + +LOGGING = logging.getLogger(__name__) + + +class RFC2544Profile(TrexProfile): + """ This class handles rfc2544 implemenation. """ + + def __init__(self, traffic_generator): + super(RFC2544Profile, self).__init__(traffic_generator) + self.max_rate = None + self.min_rate = None + self.rate = 100 + self.tmp_drop = None + self.tmp_throughput = None + self.profile_data = None + + def execute(self, traffic_generator): + ''' Generate the stream and run traffic on the given ports ''' + if self.first_run: + self.profile_data = self.params.get('private', '') + ports = [traffic_generator.my_ports[0]] + traffic_generator.client.add_streams(self.get_streams(), + ports=ports[0]) + profile_data = self.params.get('public', '') + if profile_data: + self.profile_data = profile_data + ports.append(traffic_generator.my_ports[1]) + traffic_generator.client.add_streams(self.get_streams(), + ports=ports[1]) + + self.max_rate = self.rate + self.min_rate = 0 + traffic_generator.client.start(ports=ports, + mult=self.get_multiplier(), + duration=30, force=True) + self.tmp_drop = 0 + self.tmp_throughput = 0 + + def get_multiplier(self): + ''' Get the rate at which next iternation to run ''' + self.rate = round((self.max_rate + self.min_rate) / 2.0, 2) + multiplier = round(self.rate / self.pps, 2) + return str(multiplier) + + def get_drop_percentage(self, traffic_generator, + samples, tol_min, tolerance): + ''' Calculate the drop percentage and run the traffic ''' + in_packets = sum([samples[iface]['in_packets'] for iface in samples]) + out_packets = sum([samples[iface]['out_packets'] for iface in samples]) + packet_drop = abs(out_packets - in_packets) + drop_percent = 100.0 + try: + drop_percent = round((packet_drop / float(out_packets)) * 100, 2) + except ZeroDivisionError: + LOGGING.info('No traffic is flowing') + samples['TxThroughput'] = out_packets / 30 + samples['RxThroughput'] = in_packets / 30 + samples['CurrentDropPercentage'] = drop_percent + samples['Throughput'] = self.tmp_throughput + samples['DropPercentage'] = self.tmp_drop + if drop_percent > tolerance and self.tmp_throughput == 0: + samples['Throughput'] = (in_packets / 30) + samples['DropPercentage'] = drop_percent + if self.first_run: + max_supported_rate = out_packets / 30 + self.rate = max_supported_rate + self.first_run = False + if drop_percent > tolerance: + self.max_rate = self.rate + elif drop_percent < tol_min: + self.min_rate = self.rate + if drop_percent >= self.tmp_drop: + self.tmp_drop = drop_percent + self.tmp_throughput = (in_packets / 30) + samples['Throughput'] = (in_packets / 30) + samples['DropPercentage'] = drop_percent + else: + samples['Throughput'] = (in_packets / 30) + samples['DropPercentage'] = drop_percent + + traffic_generator.client.clear_stats(ports=traffic_generator.my_ports) + traffic_generator.client.start(ports=traffic_generator.my_ports, + mult=self.get_multiplier(), + duration=30, force=True) + return samples diff --git a/yardstick/network_services/traffic_profile/traffic_profile.py b/yardstick/network_services/traffic_profile/traffic_profile.py new file mode 100644 index 000000000..156cc6644 --- /dev/null +++ b/yardstick/network_services/traffic_profile/traffic_profile.py @@ -0,0 +1,499 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Trex Traffic Profile definitions """ + +from __future__ import absolute_import +import struct +import socket +import logging +from random import SystemRandom +import six + +from yardstick.network_services.traffic_profile.base import TrafficProfile +from stl.trex_stl_lib.trex_stl_client import STLStream +from stl.trex_stl_lib.trex_stl_streams import STLFlowLatencyStats +from stl.trex_stl_lib.trex_stl_streams import STLTXCont +from stl.trex_stl_lib.trex_stl_streams import STLProfile +from stl.trex_stl_lib.trex_stl_packet_builder_scapy import STLVmWrFlowVar +from stl.trex_stl_lib.trex_stl_packet_builder_scapy import STLVmFlowVar +from stl.trex_stl_lib.trex_stl_packet_builder_scapy import STLPktBuilder +from stl.trex_stl_lib.trex_stl_packet_builder_scapy import STLScVmRaw +from stl.trex_stl_lib.trex_stl_packet_builder_scapy import STLVmFixIpv4 +from stl.trex_stl_lib import api as Pkt + + +class TrexProfile(TrafficProfile): + """ This class handles Trex Traffic profile generation and execution """ + + def __init__(self, yaml_data): + super(TrexProfile, self).__init__(yaml_data) + self.flows = 100 + self.pps = 100 + self.pg_id = 0 + self.first_run = True + self.streams = 1 + self.profile_data = [] + self.profile = None + self.base_pkt = None + self.fsize = None + self.trex_vm = None + self.vms = [] + self.rate = None + self.ip_packet = None + self.ip6_packet = None + self.udp_packet = None + self.udp_dport = '' + self.udp_sport = '' + self.qinq_packet = None + self.qinq = False + self.vm_flow_vars = [] + self.packets = [] + self.ether_packet = [] + + def execute(self, traffic_generator): + """ Generate the stream and run traffic on the given ports """ + pass + + def _set_ether_fields(self, **kwargs): + """ set ethernet protocol fields """ + if not self.ether_packet: + self.ether_packet = Pkt.Ether() + for key, value in six.iteritems(kwargs): + setattr(self.ether_packet, key, value) + + def _set_ip_fields(self, **kwargs): + """ set l3 ipv4 protocol fields """ + + if not self.ip_packet: + self.ip_packet = Pkt.IP() + for key in kwargs: + setattr(self.ip_packet, key, kwargs[key]) + + def _set_ip6_fields(self, **kwargs): + """ set l3 ipv6 protocol fields """ + if not self.ip6_packet: + self.ip6_packet = Pkt.IPv6() + for key in kwargs: + setattr(self.ip6_packet, key, kwargs[key]) + + def _set_udp_fields(self, **kwargs): + """ set l4 udp ports fields """ + if not self.udp_packet: + self.udp_packet = Pkt.UDP() + for key in kwargs: + setattr(self.udp_packet, key, kwargs[key]) + + def set_src_mac(self, src_mac): + """ set source mac address fields """ + src_macs = src_mac.split('-') + min_value = src_macs[0] + if len(src_macs) == 1: + src_mac = min_value + self._set_ether_fields(src=src_mac) + else: + stl_vm_flow_var = STLVmFlowVar(name="mac_src", + min_value=1, + max_value=30, + size=4, + op='inc', + step=1) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='mac_src', + pkt_offset='Ether.src') + self.vm_flow_vars.append(stl_vm_wr_flow_var) + + def set_dst_mac(self, dst_mac): + """ set destination mac address fields """ + dst_macs = dst_mac.split('-') + min_value = dst_macs[0] + if len(dst_macs) == 1: + dst_mac = min_value + self._set_ether_fields(dst=dst_mac) + else: + stl_vm_flow_var = STLVmFlowVar(name="mac_dst", + min_value=1, + max_value=30, + size=4, + op='inc', + step=1) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='mac_dst', + pkt_offset='Ether.dst') + self.vm_flow_vars.append(stl_vm_wr_flow_var) + + def set_src_ip4(self, src_ip4): + """ set source ipv4 address fields """ + src_ips = src_ip4.split('-') + min_value = src_ips[0] + max_value = src_ips[1] if len(src_ips) == 2 else src_ips[0] + if len(src_ips) == 1: + src_ip4 = min_value + self._set_ip_fields(src=src_ip4) + else: + stl_vm_flow_var = STLVmFlowVar(name="ip4_src", + min_value=min_value, + max_value=max_value, + size=4, + op='random', + step=1) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='ip4_src', + pkt_offset='IP.src') + self.vm_flow_vars.append(stl_vm_wr_flow_var) + stl_vm_fix_ipv4 = STLVmFixIpv4(offset="IP") + self.vm_flow_vars.append(stl_vm_fix_ipv4) + + def set_dst_ip4(self, dst_ip4): + """ set destination ipv4 address fields """ + dst_ips = dst_ip4.split('-') + min_value = dst_ips[0] + max_value = dst_ips[1] if len(dst_ips) == 2 else dst_ips[0] + if len(dst_ips) == 1: + dst_ip4 = min_value + self._set_ip_fields(dst=dst_ip4) + else: + stl_vm_flow_var = STLVmFlowVar(name="dst_ip4", + min_value=min_value, + max_value=max_value, + size=4, + op='random', + step=1) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='dst_ip4', + pkt_offset='IP.dst') + self.vm_flow_vars.append(stl_vm_wr_flow_var) + stl_vm_fix_ipv4 = STLVmFixIpv4(offset="IP") + self.vm_flow_vars.append(stl_vm_fix_ipv4) + + def set_src_ip6(self, src_ip6): + """ set source ipv6 address fields """ + src_ips = src_ip6.split('-') + min_value = src_ips[0] + max_value = src_ips[1] if len(src_ips) == 2 else src_ips[0] + src_ip6 = min_value + self._set_ip6_fields(src=src_ip6) + if len(src_ips) == 2: + min_value, max_value = \ + self._get_start_end_ipv6(min_value, max_value) + stl_vm_flow_var = STLVmFlowVar(name="ip6_src", + min_value=min_value, + max_value=max_value, + size=8, + op='random', + step=1) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='ip6_src', + pkt_offset='IPv6.src', + offset_fixup=8) + self.vm_flow_vars.append(stl_vm_wr_flow_var) + + def set_dst_ip6(self, dst_ip6): + """ set destination ipv6 address fields """ + dst_ips = dst_ip6.split('-') + min_value = dst_ips[0] + max_value = dst_ips[1] if len(dst_ips) == 2 else dst_ips[0] + dst_ip6 = min_value + self._set_ip6_fields(dst=dst_ip6) + if len(dst_ips) == 2: + min_value, max_value = \ + self._get_start_end_ipv6(min_value, max_value) + stl_vm_flow_var = STLVmFlowVar(name="dst_ip6", + min_value=min_value, + max_value=max_value, + size=8, + op='random', + step=1) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='dst_ip6', + pkt_offset='IPv6.dst', + offset_fixup=8) + self.vm_flow_vars.append(stl_vm_wr_flow_var) + + def set_dscp(self, dscp): + """ set dscp for trex """ + dscps = str(dscp).split('-') + min_value = int(dscps[0]) + max_value = int(dscps[1]) if len(dscps) == 2 else int(dscps[0]) + if len(dscps) == 1: + dscp = min_value + self._set_ip_fields(tos=dscp) + else: + stl_vm_flow_var = STLVmFlowVar(name="dscp", + min_value=min_value, + max_value=max_value, + size=2, + op='inc', + step=8) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='dscp', + pkt_offset='IP.tos') + self.vm_flow_vars.append(stl_vm_wr_flow_var) + + def set_src_port(self, src_port): + """ set packet source port """ + src_ports = str(src_port).split('-') + min_value = int(src_ports[0]) + if len(src_ports) == 1: + max_value = int(src_ports[0]) + src_port = min_value + self._set_udp_fields(sport=src_port) + else: + max_value = int(src_ports[1]) + stl_vm_flow_var = STLVmFlowVar(name="port_src", + min_value=min_value, + max_value=max_value, + size=2, + op='random', + step=1) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='port_src', + pkt_offset=self.udp_sport) + self.vm_flow_vars.append(stl_vm_wr_flow_var) + + def set_dst_port(self, dst_port): + """ set packet destnation port """ + dst_ports = str(dst_port).split('-') + min_value = int(dst_ports[0]) + if len(dst_ports) == 1: + max_value = int(dst_ports[0]) + dst_port = min_value + self._set_udp_fields(dport=dst_port) + else: + max_value = int(dst_ports[1]) + stl_vm_flow_var = STLVmFlowVar(name="port_dst", + min_value=min_value, + max_value=max_value, + size=2, + op='random', + step=1) + self.vm_flow_vars.append(stl_vm_flow_var) + stl_vm_wr_flow_var = STLVmWrFlowVar(fv_name='port_dst', + pkt_offset=self.udp_dport) + self.vm_flow_vars.append(stl_vm_wr_flow_var) + + def set_svlan_cvlan(self, svlan, cvlan): + """ set svlan & cvlan """ + self.qinq = True + ether_params = {'type': 0x8100} + self._set_ether_fields(**ether_params) + svlans = str(svlan['id']).split('-') + svlan_min = int(svlans[0]) + svlan_max = int(svlans[1]) if len(svlans) == 2 else int(svlans[0]) + if len(svlans) == 2: + svlan = self._get_random_value(svlan_min, svlan_max) + else: + svlan = svlan_min + cvlans = str(cvlan['id']).split('-') + cvlan_min = int(cvlans[0]) + cvlan_max = int(cvlans[1]) if len(cvlans) == 2 else int(cvlans[0]) + if len(cvlans) == 2: + cvlan = self._get_random_value(cvlan_min, cvlan_max) + else: + cvlan = cvlan_min + self.qinq_packet = Pkt.Dot1Q(vlan=svlan) / Pkt.Dot1Q(vlan=cvlan) + + def set_qinq(self, qinq): + """ set qinq in packet """ + self.set_svlan_cvlan(qinq['S-VLAN'], qinq['C-VLAN']) + + def set_outer_l2_fields(self, outer_l2): + """ setup outer l2 fields from traffic profile """ + ether_params = {'type': 0x800} + self._set_ether_fields(**ether_params) + if 'srcmac' in outer_l2: + self.set_src_mac(outer_l2['srcmac']) + if 'dstmac' in outer_l2: + self.set_dst_mac(outer_l2['dstmac']) + if 'QinQ' in outer_l2: + self.set_qinq(outer_l2['QinQ']) + + def set_outer_l3v4_fields(self, outer_l3v4): + """ setup outer l3v4 fields from traffic profile """ + ip_params = {} + if 'proto' in outer_l3v4: + ip_params['proto'] = outer_l3v4['proto'] + if outer_l3v4['proto'] == 'tcp': + self.udp_packet = Pkt.TCP() + self.udp_dport = 'TCP.dport' + self.udp_sport = 'TCP.sport' + tcp_params = {'flags': '', 'window': 0} + self._set_udp_fields(**tcp_params) + if 'ttl' in outer_l3v4: + ip_params['ttl'] = outer_l3v4['ttl'] + self._set_ip_fields(**ip_params) + if 'dscp' in outer_l3v4: + self.set_dscp(outer_l3v4['dscp']) + if 'srcip4' in outer_l3v4: + self.set_src_ip4(outer_l3v4['srcip4']) + if 'dstip4' in outer_l3v4: + self.set_dst_ip4(outer_l3v4['dstip4']) + + def set_outer_l3v6_fields(self, outer_l3v6): + """ setup outer l3v6 fields from traffic profile """ + ether_params = {'type': 0x86dd} + self._set_ether_fields(**ether_params) + ip6_params = {} + if 'proto' in outer_l3v6: + ip6_params['proto'] = outer_l3v6['proto'] + if outer_l3v6['proto'] == 'tcp': + self.udp_packet = Pkt.TCP() + self.udp_dport = 'TCP.dport' + self.udp_sport = 'TCP.sport' + tcp_params = {'flags': '', 'window': 0} + self._set_udp_fields(**tcp_params) + if 'ttl' in outer_l3v6: + ip6_params['ttl'] = outer_l3v6['ttl'] + if 'tc' in outer_l3v6: + ip6_params['tc'] = outer_l3v6['tc'] + if 'hlim' in outer_l3v6: + ip6_params['hlim'] = outer_l3v6['hlim'] + self._set_ip6_fields(**ip6_params) + if 'srcip6' in outer_l3v6: + self.set_src_ip6(outer_l3v6['srcip6']) + if 'dstip6' in outer_l3v6: + self.set_dst_ip6(outer_l3v6['dstip6']) + + def set_outer_l4_fields(self, outer_l4): + """ setup outer l4 fields from traffic profile """ + if 'srcport' in outer_l4: + self.set_src_port(outer_l4['srcport']) + if 'dstport' in outer_l4: + self.set_dst_port(outer_l4['dstport']) + + def generate_imix_data(self, packet_definition): + """ generate packet size for a given traffic profile """ + imix_count = {} + imix_data = {} + if not packet_definition: + return imix_count + imix = packet_definition.get('framesize') + if imix: + for size in imix: + data = imix[size] + imix_data[int(size[:-1])] = int(data) + imix_sum = sum(imix_data.values()) + if imix_sum > 100: + raise SystemExit("Error in IMIX data") + elif imix_sum < 100: + imix_data[64] = imix_data.get(64, 0) + (100 - imix_sum) + + avg_size = 0.0 + for size in imix_data: + count = int(imix_data[size]) + if count: + avg_size += round(size * count / 100, 2) + pps = round(self.pps * count / 100, 0) + imix_count[size] = pps + self.rate = round(1342177280 / avg_size, 0) * 2 + logging.debug("Imax: %s rate: %s", imix_count, self.rate) + return imix_count + + def get_streams(self): + """ generate trex stream """ + self.streams = [] + self.pps = self.params['traffic_profile'].get('frame_rate', 100) + for packet_name in self.profile_data: + outer_l2 = self.profile_data[packet_name].get('outer_l2') + imix_data = self.generate_imix_data(outer_l2) + if not imix_data: + imix_data = {64: self.pps} + self.generate_vm(self.profile_data[packet_name]) + for size in imix_data: + self._generate_streams(size, imix_data[size]) + self._generate_profile() + return self.profile + + def generate_vm(self, packet_definition): + """ generate trex vm with flows setup """ + self.ether_packet = Pkt.Ether() + self.ip_packet = Pkt.IP() + self.ip6_packet = None + self.udp_packet = Pkt.UDP() + self.udp_dport = 'UDP.dport' + self.udp_sport = 'UDP.sport' + self.qinq = False + self.vm_flow_vars = [] + outer_l2 = packet_definition.get('outer_l2', None) + outer_l3v4 = packet_definition.get('outer_l3v4', None) + outer_l3v6 = packet_definition.get('outer_l3v6', None) + outer_l4 = packet_definition.get('outer_l4', None) + if outer_l2: + self.set_outer_l2_fields(outer_l2) + if outer_l3v4: + self.set_outer_l3v4_fields(outer_l3v4) + if outer_l3v6: + self.set_outer_l3v6_fields(outer_l3v6) + if outer_l4: + self.set_outer_l4_fields(outer_l4) + self.trex_vm = STLScVmRaw(self.vm_flow_vars) + + def generate_packets(self): + """ generate packets from trex TG """ + base_pkt = self.base_pkt + size = self.fsize - 4 + pad = max(0, size - len(base_pkt)) * 'x' + self.packets = [STLPktBuilder(pkt=base_pkt / pad, + vm=vm) for vm in self.vms] + + def _create_single_packet(self, size=64): + size = size - 4 + ether_packet = self.ether_packet + ip_packet = self.ip6_packet if self.ip6_packet else self.ip_packet + udp_packet = self.udp_packet + if self.qinq: + qinq_packet = self.qinq_packet + base_pkt = ether_packet / qinq_packet / ip_packet / udp_packet + else: + base_pkt = ether_packet / ip_packet / udp_packet + pad = max(0, size - len(base_pkt)) * 'x' + packet = STLPktBuilder(pkt=base_pkt / pad, vm=self.trex_vm) + return packet + + def _create_single_stream(self, packet_size, pps, isg=0): + packet = self._create_single_packet(packet_size) + if self.pg_id: + self.pg_id += 1 + stl_flow = STLFlowLatencyStats(pg_id=self.pg_id) + stream = STLStream(isg=isg, packet=packet, mode=STLTXCont(pps=pps), + flow_stats=stl_flow) + else: + stream = STLStream(isg=isg, packet=packet, mode=STLTXCont(pps=pps)) + return stream + + def _generate_streams(self, packet_size, pps): + self.streams.append(self._create_single_stream(packet_size, pps)) + + def _generate_profile(self): + self.profile = STLProfile(self.streams) + + @classmethod + def _get_start_end_ipv6(cls, start_ip, end_ip): + try: + ip1 = socket.inet_pton(socket.AF_INET6, start_ip) + ip2 = socket.inet_pton(socket.AF_INET6, end_ip) + hi1, lo1 = struct.unpack('!QQ', ip1) + hi2, lo2 = struct.unpack('!QQ', ip2) + if ((hi1 << 64) | lo1) > ((hi2 << 64) | lo2): + raise SystemExit("IPv6: start_ip is greater then end_ip") + max_p1 = abs(int(lo1) - int(lo2)) + base_p1 = lo1 + except Exception as ex_error: + raise SystemExit(ex_error) + else: + return base_p1, max_p1 + base_p1 + + @classmethod + def _get_random_value(cls, min_port, max_port): + cryptogen = SystemRandom() + return cryptogen.randrange(min_port, max_port) diff --git a/yardstick/network_services/utils.py b/yardstick/network_services/utils.py new file mode 100644 index 000000000..cb71a6029 --- /dev/null +++ b/yardstick/network_services/utils.py @@ -0,0 +1,64 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Helper function to get Network Service testing configuration """ + +from __future__ import absolute_import +import logging +import os + +from oslo_config import cfg +from oslo_config.cfg import NoSuchOptError +from oslo_utils import encodeutils + +NSB_ROOT = "/opt/nsb_bin" + +CONF = cfg.CONF +OPTS = [ + cfg.StrOpt('bin_path', + default=NSB_ROOT, + help='bin_path for VNFs location.'), + cfg.StrOpt('trex_path', + default=os.path.join(NSB_ROOT, 'trex/scripts'), + help='trex automation lib pathh.'), +] +CONF.register_opts(OPTS, group="nsb") + + +def get_nsb_option(option, default=None): + """return requested option for yardstick.conf""" + + try: + return CONF.nsb.__getitem__(option) + except NoSuchOptError: + logging.debug("Invalid key %s", option) + return default + + +def provision_tool(connection, tool_path): + """ + verify if the tool path exits on the node, + if not push the local binary to remote node + + :return - Tool path + """ + bin_path = get_nsb_option("bin_path") + exit_status, stdout = connection.execute("which %s" % tool_path)[:2] + if exit_status == 0: + return encodeutils.safe_decode(stdout, incoming='utf-8').rstrip() + + logging.warning("%s not found on %s, will try to copy from localhost", + tool_path, connection.host) + connection.execute('mkdir -p "%s"' % bin_path) + connection.put(tool_path, tool_path) + return tool_path diff --git a/yardstick/network_services/vnf_generic/__init__.py b/yardstick/network_services/vnf_generic/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/network_services/vnf_generic/__init__.py diff --git a/yardstick/network_services/vnf_generic/vnf/__init__.py b/yardstick/network_services/vnf_generic/vnf/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/__init__.py diff --git a/yardstick/network_services/vnf_generic/vnf/base.py b/yardstick/network_services/vnf_generic/vnf/base.py new file mode 100644 index 000000000..1d770f724 --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/base.py @@ -0,0 +1,327 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Base class implementation for generic vnf implementation """ + +from __future__ import absolute_import +import logging +import ipaddress +import six + +from yardstick.network_services.utils import get_nsb_option + +LOG = logging.getLogger(__name__) + + +class QueueFileWrapper(object): + """ Class providing file-like API for talking with SSH connection """ + + def __init__(self, q_in, q_out, prompt): + self.q_in = q_in + self.q_out = q_out + self.closed = False + self.buf = [] + self.bufsize = 20 + self.prompt = prompt + + def read(self, size): + """ read chunk from input queue """ + if self.q_in.qsize() > 0 and size: + in_data = self.q_in.get() + return in_data + + def write(self, chunk): + """ write chunk to output queue """ + self.buf.append(chunk) + # flush on prompt or if we exceed bufsize + + size = sum(len(c) for c in self.buf) + if self.prompt in chunk or size > self.bufsize: + out = ''.join(self.buf) + self.buf = [] + self.q_out.put(out) + + def close(self): + """ close multiprocessing queue """ + pass + + def clear(self): + """ clear queue """ + while self.q_out.qsize() > 0: + self.q_out.get() + + +class GenericVNF(object): + """ Class providing file-like API for generic VNF implementation """ + def __init__(self, vnfd): + super(GenericVNF, self).__init__() + self.vnfd = vnfd # fixme: parse this into a structure + # List of statistics we can obtain from this VNF + # - ETSI MANO 6.3.1.1 monitoring_parameter + self.kpi = self._get_kpi_definition(vnfd) + # Standard dictionary containing params like thread no, buffer size etc + self.config = {} + self.runs_traffic = False + self.name = "vnf__1" # name in topology file + self.bin_path = get_nsb_option("bin_path", "") + + @classmethod + def _get_kpi_definition(cls, vnfd): + """ Get list of KPIs defined in VNFD + + :param vnfd: + :return: list of KPIs, e.g. ['throughput', 'latency'] + """ + return vnfd['benchmark']['kpi'] + + @classmethod + def get_ip_version(cls, ip_addr): + """ get ip address version v6 or v4 """ + try: + address = ipaddress.ip_address(six.text_type(ip_addr)) + except ValueError: + LOG.error(ip_addr, " is not valid") + return + else: + return address.version + + def _ip_to_hex(self, ip_addr): + ip_to_convert = ip_addr.split(".") + ip_x = ip_addr + if self.get_ip_version(ip_addr) == 4: + ip_to_convert = ip_addr.split(".") + ip_octect = [int(octect) for octect in ip_to_convert] + ip_x = "{0[0]:02X}{0[1]:02X}{0[2]:02X}{0[3]:02X}".format(ip_octect) + return ip_x + + def _get_dpdk_port_num(self, name): + for intf in self.vnfd['vdu'][0]['external-interface']: + if name == intf['name']: + return intf['virtual-interface']['dpdk_port_num'] + + def _append_routes(self, ip_pipeline_cfg): + if 'routing_table' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['routing_table'] + + where = ip_pipeline_cfg.find("arp_route_tbl") + link = ip_pipeline_cfg[:where] + route_add = ip_pipeline_cfg[where:] + + tmp = route_add.find('\n') + route_add = route_add[tmp:] + + cmds = "arp_route_tbl =" + + for route in routing_table: + net = self._ip_to_hex(route['network']) + net_nm = self._ip_to_hex(route['netmask']) + net_gw = self._ip_to_hex(route['gateway']) + port = self._get_dpdk_port_num(route['if']) + cmd = \ + " ({port0_local_ip_hex},{port0_netmask_hex},{dpdk_port},"\ + "{port1_local_ip_hex})".format(port0_local_ip_hex=net, + port0_netmask_hex=net_nm, + dpdk_port=port, + port1_local_ip_hex=net_gw) + cmds += cmd + + cmds += '\n' + ip_pipeline_cfg = link + cmds + route_add + + return ip_pipeline_cfg + + def _append_nd_routes(self, ip_pipeline_cfg): + if 'nd_route_tbl' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['nd_route_tbl'] + + where = ip_pipeline_cfg.find("nd_route_tbl") + link = ip_pipeline_cfg[:where] + route_nd = ip_pipeline_cfg[where:] + + tmp = route_nd.find('\n') + route_nd = route_nd[tmp:] + + cmds = "nd_route_tbl =" + + for route in routing_table: + net = route['network'] + net_nm = route['netmask'] + net_gw = route['gateway'] + port = self._get_dpdk_port_num(route['if']) + cmd = \ + " ({port0_local_ip_hex},{port0_netmask_hex},{dpdk_port},"\ + "{port1_local_ip_hex})".format(port0_local_ip_hex=net, + port0_netmask_hex=net_nm, + dpdk_port=port, + port1_local_ip_hex=net_gw) + cmds += cmd + + cmds += '\n' + ip_pipeline_cfg = link + cmds + route_nd + + return ip_pipeline_cfg + + def _get_port0localip6(self): + return_value = "" + if 'nd_route_tbl' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['nd_route_tbl'] + + inc = 0 + for route in routing_table: + inc += 1 + if inc == 1: + return_value = route['network'] + LOG.info("_get_port0localip6 : %s", return_value) + return return_value + + def _get_port1localip6(self): + return_value = "" + if 'nd_route_tbl' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['nd_route_tbl'] + + inc = 0 + for route in routing_table: + inc += 1 + if inc == 2: + return_value = route['network'] + LOG.info("_get_port1localip6 : %s", return_value) + return return_value + + def _get_port0prefixlen6(self): + return_value = "" + if 'nd_route_tbl' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['nd_route_tbl'] + + inc = 0 + for route in routing_table: + inc += 1 + if inc == 1: + return_value = route['netmask'] + LOG.info("_get_port0prefixlen6 : %s", return_value) + return return_value + + def _get_port1prefixlen6(self): + return_value = "" + if 'nd_route_tbl' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['nd_route_tbl'] + + inc = 0 + for route in routing_table: + inc += 1 + if inc == 2: + return_value = route['netmask'] + LOG.info("_get_port1prefixlen6 : %s", return_value) + return return_value + + def _get_port0gateway6(self): + return_value = "" + if 'nd_route_tbl' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['nd_route_tbl'] + + inc = 0 + for route in routing_table: + inc += 1 + if inc == 1: + return_value = route['network'] + LOG.info("_get_port0gateway6 : %s", return_value) + return return_value + + def _get_port1gateway6(self): + return_value = "" + if 'nd_route_tbl' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['nd_route_tbl'] + + inc = 0 + for route in routing_table: + inc += 1 + if inc == 2: + return_value = route['network'] + LOG.info("_get_port1gateway6 : %s", return_value) + return return_value + + def instantiate(self, scenario_cfg, context_cfg): + """ Prepare VNF for operation and start the VNF process/VM + + :param scenario_cfg: + :param context_cfg: + :return: True/False + """ + raise NotImplementedError() + + def terminate(self): + """ Kill all VNF processes + + :return: + """ + raise NotImplementedError() + + def scale(self, flavor=""): + """ + + :param flavor: + :return: + """ + raise NotImplementedError() + + def collect_kpi(self): + """This method should return a dictionary containing the + selected KPI at a given point of time. + + :return: {"kpi": value, "kpi2": value} + """ + raise NotImplementedError() + + +class GenericTrafficGen(GenericVNF): + """ Class providing file-like API for generic traffic generator """ + + def __init__(self, vnfd): + super(GenericTrafficGen, self).__init__(vnfd) + self.runs_traffic = True + self.traffic_finished = False + self.name = "tgen__1" # name in topology file + + def run_traffic(self, traffic_profile): + """ Generate traffic on the wire according to the given params. + Method is non-blocking, returns immediately when traffic process + is running. Mandatory. + + :param traffic_profile: + :return: True/False + """ + raise NotImplementedError() + + def listen_traffic(self, traffic_profile): + """ Listen to traffic with the given parameters. + Method is non-blocking, returns immediately when traffic process + is running. Optional. + + :param traffic_profile: + :return: True/False + """ + pass + + def verify_traffic(self, traffic_profile): + """ Verify captured traffic after it has ended. Optional. + + :param traffic_profile: + :return: dict + """ + pass + + def terminate(self): + """ After this method finishes, all traffic processes should stop. Mandatory. + + :return: True/False + """ + raise NotImplementedError() diff --git a/yardstick/network_services/vnf_generic/vnf/tg_ping.py b/yardstick/network_services/vnf_generic/vnf/tg_ping.py new file mode 100644 index 000000000..2844a5c01 --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/tg_ping.py @@ -0,0 +1,167 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" PING acts as traffic generation and vnf definitions based on IETS Spec """ + +from __future__ import absolute_import +from __future__ import print_function +import logging +import multiprocessing +import re +import time +import os + +from yardstick import ssh +from yardstick.network_services.vnf_generic.vnf.base import GenericTrafficGen +from yardstick.network_services.utils import provision_tool + +LOG = logging.getLogger(__name__) + + +class PingParser(object): + """ Class providing file-like API for talking with SSH connection """ + + def __init__(self, q_out): + self.queue = q_out + self.closed = False + + def write(self, chunk): + """ 64 bytes from 10.102.22.93: icmp_seq=1 ttl=64 time=0.296 ms """ + match = re.search(r"icmp_seq=(\d+).*time=([0-9.]+)", chunk) + LOG.debug("Parser called on %s", chunk) + if match: + # IMPORTANT: in order for the data to be properly taken + # in by InfluxDB, it needs to be converted to numeric types + self.queue.put({"packets_received": float(match.group(1)), + "rtt": float(match.group(2))}) + + def close(self): + ''' close the ssh connection ''' + pass + + def clear(self): + ''' clear queue till Empty ''' + while self.queue.qsize() > 0: + self.queue.get() + + +class PingTrafficGen(GenericTrafficGen): + """ + This traffic generator can ping a single IP with pingsize + and target given in traffic profile + """ + + def __init__(self, vnfd): + super(PingTrafficGen, self).__init__(vnfd) + self._result = {} + self._parser = None + self._queue = None + self._traffic_process = None + + mgmt_interface = vnfd["mgmt-interface"] + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + LOG.debug("Connecting to %s", mgmt_interface["ip"]) + + self.connection = ssh.SSH(mgmt_interface["user"], mgmt_interface["ip"], + password=mgmt_interface["password"], + port=ssh_port) + self.connection.wait() + + def _bind_device_kernel(self, connection): + dpdk_nic_bind = \ + provision_tool(self.connection, + os.path.join(self.bin_path, "dpdk_nic_bind.py")) + + drivers = {intf["virtual-interface"]["vpci"]: + intf["virtual-interface"]["driver"] + for intf in self.vnfd["vdu"][0]["external-interface"]} + + commands = \ + ['"{0}" --force -b "{1}" "{2}"'.format(dpdk_nic_bind, value, key) + for key, value in drivers.items()] + for command in commands: + connection.execute(command) + + for index, out in enumerate(self.vnfd["vdu"][0]["external-interface"]): + vpci = out["virtual-interface"]["vpci"] + net = "find /sys/class/net -lname '*{}*' -printf '%f'".format(vpci) + out = connection.execute(net)[1] + ifname = out.split('/')[-1].strip('\n') + self.vnfd["vdu"][0]["external-interface"][index][ + "virtual-interface"]["local_iface_name"] = ifname + + def scale(self, flavor=""): + ''' scale vnfbased on flavor input ''' + super(PingTrafficGen, self).scale(flavor) + + def instantiate(self, scenario_cfg, context_cfg): + self._result = {"packets_received": 0, "rtt": 0} + self._bind_device_kernel(self.connection) + + def run_traffic(self, traffic_profile): + self._queue = multiprocessing.Queue() + self._parser = PingParser(self._queue) + self._traffic_process = \ + multiprocessing.Process(target=self._traffic_runner, + args=(traffic_profile, self._parser)) + self._traffic_process.start() + # Wait for traffic process to start + time.sleep(4) + return self._traffic_process.is_alive() + + def listen_traffic(self, traffic_profile): + """ Not needed for ping + + :param traffic_profile: + :return: + """ + pass + + def _traffic_runner(self, traffic_profile, filewrapper): + + mgmt_interface = self.vnfd["mgmt-interface"] + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + self.connection = ssh.SSH(mgmt_interface["user"], mgmt_interface["ip"], + password=mgmt_interface["password"], + port=ssh_port) + self.connection.wait() + external_interface = self.vnfd["vdu"][0]["external-interface"] + virtual_interface = external_interface[0]["virtual-interface"] + target_ip = virtual_interface["dst_ip"].split('/')[0] + local_ip = virtual_interface["local_ip"].split('/')[0] + local_if_name = \ + virtual_interface["local_iface_name"].split('/')[0] + packet_size = traffic_profile.params["traffic_profile"]["frame_size"] + + run_cmd = [] + + run_cmd.append("ip addr flush %s" % local_if_name) + run_cmd.append("ip addr add %s/24 dev %s" % (local_ip, local_if_name)) + run_cmd.append("ip link set %s up" % local_if_name) + + for cmd in run_cmd: + self.connection.execute(cmd) + + ping_cmd = ("ping -s %s %s" % (packet_size, target_ip)) + self.connection.run(ping_cmd, stdout=filewrapper, + keep_stdin_open=True, pty=True) + + def collect_kpi(self): + if not self._queue.empty(): + kpi = self._queue.get() + self._result.update(kpi) + return self._result + + def terminate(self): + if self._traffic_process is not None: + self._traffic_process.terminate() diff --git a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_trex.py b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_trex.py new file mode 100644 index 000000000..37c1a7345 --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_trex.py @@ -0,0 +1,285 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Trex traffic generation definitions which implements rfc2544 """ + +from __future__ import absolute_import +from __future__ import print_function +import multiprocessing +import time +import logging +import os +import yaml + +from yardstick import ssh +from yardstick.network_services.vnf_generic.vnf.base import GenericTrafficGen +from yardstick.network_services.utils import get_nsb_option +from stl.trex_stl_lib.trex_stl_client import STLClient +from stl.trex_stl_lib.trex_stl_client import LoggerApi +from stl.trex_stl_lib.trex_stl_exceptions import STLError + +LOGGING = logging.getLogger(__name__) + +DURATION = 30 +WAIT_TIME = 3 +TREX_SYNC_PORT = 4500 +TREX_ASYNC_PORT = 4501 + + +class TrexTrafficGenRFC(GenericTrafficGen): + """ + This class handles mapping traffic profile and generating + traffic for rfc2544 testcase. + """ + + def __init__(self, vnfd): + super(TrexTrafficGenRFC, self).__init__(vnfd) + self._result = {} + self._terminated = multiprocessing.Value('i', 0) + self._queue = multiprocessing.Queue() + self._terminated = multiprocessing.Value('i', 0) + self._traffic_process = None + self._vpci_ascending = None + self.tc_file_name = None + self.client = None + self.my_ports = None + + mgmt_interface = self.vnfd["mgmt-interface"] + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + self.connection = ssh.SSH(mgmt_interface["user"], mgmt_interface["ip"], + password=mgmt_interface["password"], + port=ssh_port) + self.connection.wait() + + @classmethod + def _split_mac_address_into_list(cls, mac): + octets = mac.split(':') + for i, elem in enumerate(octets): + octets[i] = "0x" + str(elem) + return octets + + def _generate_trex_cfg(self, vnfd): + """ + + :param vnfd: vnfd.yaml + :return: trex_cfg.yaml file + """ + trex_cfg = dict( + port_limit=0, + version='2', + interfaces=[], + port_info=list(dict( + )) + ) + trex_cfg["port_limit"] = len(vnfd["vdu"][0]["external-interface"]) + trex_cfg["version"] = '2' + + cfg_file = [] + vpci = [] + port = {} + + ext_intf = vnfd["vdu"][0]["external-interface"] + for interface in ext_intf: + virt_intf = interface["virtual-interface"] + vpci.append(virt_intf["vpci"]) + + port["src_mac"] = \ + self._split_mac_address_into_list(virt_intf["local_mac"]) + + time.sleep(WAIT_TIME) + port["dest_mac"] = \ + self._split_mac_address_into_list(virt_intf["dst_mac"]) + if virt_intf["dst_mac"]: + trex_cfg["port_info"].append(port.copy()) + + trex_cfg["interfaces"] = vpci + cfg_file.append(trex_cfg) + + with open('/tmp/trex_cfg.yaml', 'w') as outfile: + outfile.write(yaml.safe_dump(cfg_file, default_flow_style=False)) + self.connection.put('/tmp/trex_cfg.yaml', '/etc') + + self._vpci_ascending = sorted(vpci) + + def scale(self, flavor=""): + ''' scale vnfbased on flavor input ''' + super(TrexTrafficGenRFC, self).scale(flavor) + + def instantiate(self, scenario_cfg, context_cfg): + self._generate_trex_cfg(self.vnfd) + self.tc_file_name = '{0}.yaml'.format(scenario_cfg['tc']) + trex = os.path.join(self.bin_path, "trex") + err, _, _ = \ + self.connection.execute("ls {} >/dev/null 2>&1".format(trex)) + if err != 0: + self.connection.put(trex, trex, True) + + LOGGING.debug("Starting TRex server...") + _tg_server = \ + multiprocessing.Process(target=self._start_server) + _tg_server.start() + while True: + LOGGING.info("Waiting for TG Server to start.. ") + time.sleep(WAIT_TIME) + + status = \ + self.connection.execute("lsof -i:%s" % TREX_SYNC_PORT)[0] + if status == 0: + LOGGING.info("TG server is up and running.") + return _tg_server.exitcode + if not _tg_server.is_alive(): + raise RuntimeError("Traffic Generator process died.") + + def listen_traffic(self, traffic_profile): + pass + + def _get_logical_if_name(self, vpci): + ext_intf = self.vnfd["vdu"][0]["external-interface"] + for interface in range(len(self.vnfd["vdu"][0]["external-interface"])): + virtual_intf = ext_intf[interface]["virtual-interface"] + if virtual_intf["vpci"] == vpci: + return ext_intf[interface]["name"] + + def run_traffic(self, traffic_profile, + client_started=multiprocessing.Value('i', 0)): + + self._traffic_process = \ + multiprocessing.Process(target=self._traffic_runner, + args=(traffic_profile, self._queue, + client_started, self._terminated)) + self._traffic_process.start() + # Wait for traffic process to start + while client_started.value == 0: + time.sleep(1) + + return self._traffic_process.is_alive() + + def _start_server(self): + mgmt_interface = self.vnfd["mgmt-interface"] + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + _server = ssh.SSH(mgmt_interface["user"], mgmt_interface["ip"], + password=mgmt_interface["password"], + port=ssh_port) + _server.wait() + + _server.execute("fuser -n tcp %s %s -k > /dev/null 2>&1" % + (TREX_SYNC_PORT, TREX_ASYNC_PORT)) + _server.execute("pkill -9 rex > /dev/null 2>&1") + + trex_path = os.path.join(self.bin_path, "trex/scripts") + path = get_nsb_option("trex_path", trex_path) + trex_cmd = "cd " + path + "; sudo ./t-rex-64 -i > /dev/null 2>&1" + + _server.execute(trex_cmd) + + def _connect_client(self, client=None): + if client is None: + client = STLClient(username=self.vnfd["mgmt-interface"]["user"], + server=self.vnfd["mgmt-interface"]["ip"], + verbose_level=LoggerApi.VERBOSE_QUIET) + for idx in range(6): + try: + client.connect() + break + except STLError: + LOGGING.info("Unable to connect to Trex. Attempt %s", idx) + time.sleep(WAIT_TIME) + return client + + @classmethod + def _get_rfc_tolerance(cls, tc_yaml): + tolerance = '0.8 - 1.0' + if 'tc_options' in tc_yaml['scenarios'][0]: + tc_options = tc_yaml['scenarios'][0]['tc_options'] + if 'rfc2544' in tc_options: + tolerance = \ + tc_options['rfc2544'].get('allowed_drop_rate', '0.8 - 1.0') + + tolerance = tolerance.split('-') + min_tol = float(tolerance[0]) + if len(tolerance) == 2: + max_tol = float(tolerance[1]) + else: + max_tol = float(tolerance[0]) + + return [min_tol, max_tol] + + def _traffic_runner(self, traffic_profile, queue, + client_started, terminated): + LOGGING.info("Starting TRex client...") + tc_yaml = {} + + with open(self.tc_file_name) as tc_file: + tc_yaml = yaml.load(tc_file.read()) + + tolerance = self._get_rfc_tolerance(tc_yaml) + + # fixme: fix passing correct trex config file, + # instead of searching the default path + self.my_ports = [0, 1] + self.client = self._connect_client() + self.client.reset(ports=self.my_ports) + self.client.remove_all_streams(self.my_ports) # remove all streams + while not terminated.value: + traffic_profile.execute(self) + client_started.value = 1 + time.sleep(DURATION) + self.client.stop(self.my_ports) + time.sleep(WAIT_TIME) + last_res = self.client.get_stats(self.my_ports) + samples = {} + for vpci_idx in range(len(self._vpci_ascending)): + name = \ + self._get_logical_if_name(self._vpci_ascending[vpci_idx]) + # fixme: VNFDs KPIs values needs to be mapped to TRex structure + if not isinstance(last_res, dict): + terminated.value = 1 + last_res = {} + + samples[name] = \ + {"rx_throughput_fps": + float(last_res.get(vpci_idx, {}).get("rx_pps", 0.0)), + "tx_throughput_fps": + float(last_res.get(vpci_idx, {}).get("tx_pps", 0.0)), + "rx_throughput_mbps": + float(last_res.get(vpci_idx, {}).get("rx_bps", 0.0)), + "tx_throughput_mbps": + float(last_res.get(vpci_idx, {}).get("tx_bps", 0.0)), + "in_packets": + last_res.get(vpci_idx, {}).get("ipackets", 0), + "out_packets": + last_res.get(vpci_idx, {}).get("opackets", 0)} + + samples = \ + traffic_profile.get_drop_percentage(self, samples, + tolerance[0], tolerance[1]) + queue.put(samples) + self.client.stop(self.my_ports) + self.client.disconnect() + queue.put(samples) + + def collect_kpi(self): + if not self._queue.empty(): + result = self._queue.get() + self._result.update(result) + LOGGING.debug("trex collect Kpis %s", self._result) + return self._result + + def terminate(self): + self._terminated.value = 1 # stop Trex clinet + + self.connection.execute("fuser -n tcp %s %s -k > /dev/null 2>&1" % + (TREX_SYNC_PORT, TREX_ASYNC_PORT)) + + if self._traffic_process: + self._traffic_process.terminate() diff --git a/yardstick/network_services/vnf_generic/vnf/tg_trex.py b/yardstick/network_services/vnf_generic/vnf/tg_trex.py new file mode 100644 index 000000000..2731476e0 --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/tg_trex.py @@ -0,0 +1,278 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Trex acts as traffic generation and vnf definitions based on IETS Spec """ + +from __future__ import absolute_import +from __future__ import print_function +import multiprocessing +import time +import logging +import os +import yaml + +from yardstick import ssh +from yardstick.network_services.vnf_generic.vnf.base import GenericTrafficGen +from yardstick.network_services.utils import get_nsb_option +from yardstick.network_services.utils import provision_tool +from stl.trex_stl_lib.trex_stl_client import STLClient +from stl.trex_stl_lib.trex_stl_client import LoggerApi +from stl.trex_stl_lib.trex_stl_exceptions import STLError + +LOG = logging.getLogger(__name__) +DURATION = 30 +TREX_SYNC_PORT = 4500 +TREX_ASYNC_PORT = 4501 + + +class TrexTrafficGen(GenericTrafficGen): + """ + This class handles mapping traffic profile and generating + traffic for given testcase + """ + + def __init__(self, vnfd): + super(TrexTrafficGen, self).__init__(vnfd) + self._result = {} + self._queue = multiprocessing.Queue() + self._terminated = multiprocessing.Value('i', 0) + self._traffic_process = None + self._vpci_ascending = None + self.client = None + self.my_ports = None + self.client_started = multiprocessing.Value('i', 0) + + mgmt_interface = self.vnfd["mgmt-interface"] + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + self.connection = ssh.SSH(mgmt_interface["user"], + mgmt_interface["ip"], + password=mgmt_interface["password"], + port=ssh_port) + self.connection.wait() + + @classmethod + def _split_mac_address_into_list(cls, mac): + octets = mac.split(':') + for i, elem in enumerate(octets): + octets[i] = "0x" + str(elem) + return octets + + def _generate_trex_cfg(self, vnfd): + """ + + :param vnfd: vnfd.yaml + :return: trex_cfg.yaml file + """ + trex_cfg = dict( + port_limit=0, + version='2', + interfaces=[], + port_info=list(dict( + )) + ) + trex_cfg["port_limit"] = len(vnfd["vdu"][0]["external-interface"]) + trex_cfg["version"] = '2' + + cfg_file = [] + vpci = [] + port = {} + + for interface in range(len(vnfd["vdu"][0]["external-interface"])): + ext_intrf = vnfd["vdu"][0]["external-interface"] + virtual_interface = ext_intrf[interface]["virtual-interface"] + vpci.append(virtual_interface["vpci"]) + + port["src_mac"] = self._split_mac_address_into_list( + virtual_interface["local_mac"]) + port["dest_mac"] = self._split_mac_address_into_list( + virtual_interface["dst_mac"]) + + trex_cfg["port_info"].append(port.copy()) + + trex_cfg["interfaces"] = vpci + cfg_file.append(trex_cfg) + + with open('/tmp/trex_cfg.yaml', 'w') as outfile: + outfile.write(yaml.safe_dump(cfg_file, default_flow_style=False)) + self.connection.put('/tmp/trex_cfg.yaml', '/etc') + + self._vpci_ascending = sorted(vpci) + + @classmethod + def __setup_hugepages(cls, connection): + hugepages = \ + connection.execute( + "awk '/Hugepagesize/ { print $2$3 }' < /proc/meminfo")[1] + hugepages = hugepages.rstrip() + + memory_path = \ + '/sys/kernel/mm/hugepages/hugepages-%s/nr_hugepages' % hugepages + connection.execute("awk -F: '{ print $1 }' < %s" % memory_path) + + pages = 16384 if hugepages.rstrip() == "2048kB" else 16 + connection.execute("echo %s > %s" % (pages, memory_path)) + + def setup_vnf_environment(self, connection): + ''' setup dpdk environment needed for vnf to run ''' + + self.__setup_hugepages(connection) + connection.execute("modprobe uio && modprobe igb_uio") + + exit_status = connection.execute("lsmod | grep -i igb_uio")[0] + if exit_status == 0: + return + + dpdk = os.path.join(self.bin_path, "dpdk-16.07") + dpdk_setup = \ + provision_tool(self.connection, + os.path.join(self.bin_path, "nsb_setup.sh")) + status = connection.execute("ls {} >/dev/null 2>&1".format(dpdk))[0] + if status: + connection.execute("bash %s dpdk >/dev/null 2>&1" % dpdk_setup) + + def scale(self, flavor=""): + ''' scale vnfbased on flavor input ''' + super(TrexTrafficGen, self).scale(flavor) + + def instantiate(self, scenario_cfg, context_cfg): + self._generate_trex_cfg(self.vnfd) + self.setup_vnf_environment(self.connection) + + trex = os.path.join(self.bin_path, "trex") + err = \ + self.connection.execute("ls {} >/dev/null 2>&1".format(trex))[0] + if err != 0: + LOG.info("Copying trex to destination...") + self.connection.put("/root/.bash_profile", "/root/.bash_profile") + self.connection.put(trex, trex, True) + ko_src = os.path.join(trex, "scripts/ko/src/") + self.connection.execute("cd %s && make && make install" % ko_src) + + LOG.info("Starting TRex server...") + _tg_process = \ + multiprocessing.Process(target=self._start_server) + _tg_process.start() + while True: + if not _tg_process.is_alive(): + raise RuntimeError("Traffic Generator process died.") + LOG.info("Waiting for TG Server to start.. ") + time.sleep(1) + status = \ + self.connection.execute("lsof -i:%s" % TREX_SYNC_PORT)[0] + if status == 0: + LOG.info("TG server is up and running.") + return _tg_process.exitcode + + def listen_traffic(self, traffic_profile): + pass + + def _get_logical_if_name(self, vpci): + ext_intf = self.vnfd["vdu"][0]["external-interface"] + for interface in range(len(self.vnfd["vdu"][0]["external-interface"])): + virtual_intf = ext_intf[interface]["virtual-interface"] + if virtual_intf["vpci"] == vpci: + return ext_intf[interface]["name"] + + def run_traffic(self, traffic_profile): + self._traffic_process = \ + multiprocessing.Process(target=self._traffic_runner, + args=(traffic_profile, self._queue, + self.client_started, + self._terminated)) + self._traffic_process.start() + # Wait for traffic process to start + while self.client_started.value == 0: + time.sleep(1) + + return self._traffic_process.is_alive() + + def _start_server(self): + mgmt_interface = self.vnfd["mgmt-interface"] + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + _server = ssh.SSH(mgmt_interface["user"], mgmt_interface["ip"], + password=mgmt_interface["password"], + port=ssh_port) + _server.wait() + + _server.execute("fuser -n tcp %s %s -k > /dev/null 2>&1" % + (TREX_SYNC_PORT, TREX_ASYNC_PORT)) + + trex_path = os.path.join(self.bin_path, "trex/scripts") + path = get_nsb_option("trex_path", trex_path) + trex_cmd = "cd " + path + "; sudo ./t-rex-64 -i > /dev/null 2>&1" + + _server.execute(trex_cmd) + + def _connect_client(self, client=None): + if client is None: + client = STLClient(username=self.vnfd["mgmt-interface"]["user"], + server=self.vnfd["mgmt-interface"]["ip"], + verbose_level=LoggerApi.VERBOSE_QUIET) + # try to connect with 5s intervals, 30s max + for idx in range(6): + try: + client.connect() + break + except STLError: + LOG.info("Unable to connect to Trex Server.. Attempt %s", idx) + time.sleep(5) + return client + + def _traffic_runner(self, traffic_profile, queue, + client_started, terminated): + LOG.info("Starting TRex client...") + + self.my_ports = [0, 1] + self.client = self._connect_client() + self.client.reset(ports=self.my_ports) + + self.client.remove_all_streams(self.my_ports) # remove all streams + + while not terminated.value: + traffic_profile.execute(self) + client_started.value = 1 + last_res = self.client.get_stats(self.my_ports) + if not isinstance(last_res, dict): # added for mock unit test + terminated.value = 1 + last_res = {} + + samples = {} + for vpci_idx in range(len(self._vpci_ascending)): + name = \ + self._get_logical_if_name(self._vpci_ascending[vpci_idx]) + # fixme: VNFDs KPIs values needs to be mapped to TRex structure + xe_value = last_res.get(vpci_idx, {}) + samples[name] = \ + {"rx_throughput_fps": float(xe_value.get("rx_pps", 0.0)), + "tx_throughput_fps": float(xe_value.get("tx_pps", 0.0)), + "rx_throughput_mbps": float(xe_value.get("rx_bps", 0.0)), + "tx_throughput_mbps": float(xe_value.get("tx_bps", 0.0)), + "in_packets": xe_value.get("ipackets", 0), + "out_packets": xe_value.get("opackets", 0)} + queue.put(samples) + + self.client.disconnect() + terminated.value = 0 + + def collect_kpi(self): + if not self._queue.empty(): + self._result.update(self._queue.get()) + LOG.debug("trex collect Kpis %s", self._result) + return self._result + + def terminate(self): + self.connection.execute("fuser -n tcp %s %s -k > /dev/null 2>&1" % + (TREX_SYNC_PORT, TREX_ASYNC_PORT)) + self.traffic_finished = True + if self._traffic_process: + self._traffic_process.terminate() diff --git a/yardstick/network_services/vnf_generic/vnf/vpe_vnf.py b/yardstick/network_services/vnf_generic/vnf/vpe_vnf.py new file mode 100644 index 000000000..8c766f01e --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnf/vpe_vnf.py @@ -0,0 +1,331 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" vPE (Power Edge router) VNF model definitions based on IETS Spec """ + +from __future__ import absolute_import +from __future__ import print_function +import tempfile +import time +import os +import logging +import re +from multiprocessing import Queue +import multiprocessing +import ipaddress +import six + +from yardstick import ssh +from yardstick.network_services.vnf_generic.vnf.base import GenericVNF +from yardstick.network_services.utils import provision_tool +from yardstick.network_services.vnf_generic.vnf.base import QueueFileWrapper +from yardstick.network_services.nfvi.resource import ResourceProfile + +LOG = logging.getLogger(__name__) +VPE_PIPELINE_COMMAND = '{tool_path} -p 0x3 -f {cfg_file} -s {script}' +CORES = ['0', '1', '2'] +WAIT_TIME = 20 + + +class VpeApproxVnf(GenericVNF): + """ This class handles vPE VNF model-driver definitions """ + + def __init__(self, vnfd): + super(VpeApproxVnf, self).__init__(vnfd) + self.socket = None + self.q_in = Queue() + self.q_out = Queue() + self.vnf_cfg = None + self._vnf_process = None + self.connection = None + self.resource = None + + def _resource_collect_start(self): + self.resource.initiate_systemagent(self.bin_path) + self.resource.start() + + def _resource_collect_stop(self): + self.resource.stop() + + def _collect_resource_kpi(self): + result = {} + + status = self.resource.check_if_sa_running("collectd")[0] + if status: + result = self.resource.amqp_collect_nfvi_kpi() + + result = {"core": result} + + return result + + @classmethod + def __setup_hugepages(cls, connection): + hugepages = \ + connection.execute( + "awk '/Hugepagesize/ { print $2$3 }' < /proc/meminfo")[1] + hugepages = hugepages.rstrip() + + memory_path = \ + '/sys/kernel/mm/hugepages/hugepages-%s/nr_hugepages' % hugepages + connection.execute("awk -F: '{ print $1 }' < %s" % memory_path) + + pages = 16384 if hugepages.rstrip() == "2048kB" else 16 + connection.execute("echo %s > %s" % (pages, memory_path)) + + def setup_vnf_environment(self, connection): + ''' setup dpdk environment needed for vnf to run ''' + + self.__setup_hugepages(connection) + connection.execute("modprobe uio && modprobe igb_uio") + + exit_status = connection.execute("lsmod | grep -i igb_uio")[0] + if exit_status == 0: + return + + dpdk = os.path.join(self.bin_path, "dpdk-16.07") + dpdk_setup = \ + provision_tool(self.connection, + os.path.join(self.bin_path, "nsb_setup.sh")) + status = connection.execute("ls {} >/dev/null 2>&1".format(dpdk))[0] + if status: + connection.execute("bash %s dpdk >/dev/null 2>&1" % dpdk_setup) + + def _get_cpu_sibling_list(self): + cpu_topo = [] + for core in CORES: + sys_cmd = \ + "/sys/devices/system/cpu/cpu%s/topology/thread_siblings_list" \ + % core + cpuid = \ + self.connection.execute("awk -F: '{ print $1 }' < %s" % + sys_cmd)[1] + cpu_topo += \ + [(idx) if idx.isdigit() else idx for idx in cpuid.split(',')] + + return [cpu.strip() for cpu in cpu_topo] + + def scale(self, flavor=""): + ''' scale vnfbased on flavor input ''' + super(VpeApproxVnf, self).scale(flavor) + + def instantiate(self, scenario_cfg, context_cfg): + vnf_cfg = scenario_cfg['vnf_options']['vpe']['cfg'] + mgmt_interface = self.vnfd["mgmt-interface"] + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + + self.connection = ssh.SSH(mgmt_interface["user"], mgmt_interface["ip"], + password=mgmt_interface["password"], + port=ssh_port) + + self.connection.wait() + + self.setup_vnf_environment(self.connection) + + cores = self._get_cpu_sibling_list() + self.resource = ResourceProfile(self.vnfd, cores) + + self.connection.execute("pkill vPE_vnf") + dpdk_nic_bind = \ + provision_tool(self.connection, + os.path.join(self.bin_path, "dpdk_nic_bind.py")) + + interfaces = self.vnfd["vdu"][0]['external-interface'] + self.socket = \ + next((0 for v in interfaces + if v['virtual-interface']["vpci"][5] == "0"), 1) + + bound_pci = [v['virtual-interface']["vpci"] for v in interfaces] + for vpci in bound_pci: + self.connection.execute( + "%s --force -b igb_uio %s" % (dpdk_nic_bind, vpci)) + queue_wrapper = \ + QueueFileWrapper(self.q_in, self.q_out, "pipeline>") + self._vnf_process = multiprocessing.Process(target=self._run_vpe, + args=(queue_wrapper, + vnf_cfg,)) + self._vnf_process.start() + buf = [] + time.sleep(WAIT_TIME) # Give some time for config to load + while True: + message = '' + while self.q_out.qsize() > 0: + buf.append(self.q_out.get()) + message = ''.join(buf) + if "pipeline>" in message: + LOG.info("VPE VNF is up and running.") + queue_wrapper.clear() + self._resource_collect_start() + return self._vnf_process.exitcode + if "PANIC" in message: + raise RuntimeError("Error starting vPE VNF.") + + LOG.info("Waiting for VNF to start.. ") + time.sleep(3) + if not self._vnf_process.is_alive(): + raise RuntimeError("vPE VNF process died.") + + def _get_ports_gateway(self, name): + if 'routing_table' in self.vnfd['vdu'][0]: + routing_table = self.vnfd['vdu'][0]['routing_table'] + + for route in routing_table: + if name == route['if']: + return route['gateway'] + + def terminate(self): + self.execute_command("quit") + if self._vnf_process: + self._vnf_process.terminate() + + def _run_vpe(self, filewrapper, vnf_cfg): + mgmt_interface = self.vnfd["mgmt-interface"] + ssh_port = mgmt_interface.get("ssh_port", ssh.DEFAULT_PORT) + self.connection = ssh.SSH(mgmt_interface["user"], mgmt_interface["ip"], + password=mgmt_interface["password"], + port=ssh_port) + self.connection.wait() + interfaces = self.vnfd["vdu"][0]['external-interface'] + port0_ip = ipaddress.ip_interface(six.text_type( + "%s/%s" % (interfaces[0]["virtual-interface"]["local_ip"], + interfaces[0]["virtual-interface"]["netmask"]))) + port1_ip = ipaddress.ip_interface(six.text_type( + "%s/%s" % (interfaces[1]["virtual-interface"]["local_ip"], + interfaces[1]["virtual-interface"]["netmask"]))) + dst_port0_ip = ipaddress.ip_interface( + u"%s/%s" % (interfaces[0]["virtual-interface"]["dst_ip"], + interfaces[0]["virtual-interface"]["netmask"])) + dst_port1_ip = ipaddress.ip_interface( + u"%s/%s" % (interfaces[1]["virtual-interface"]["dst_ip"], + interfaces[1]["virtual-interface"]["netmask"])) + + vpe_vars = {"port0_local_ip": port0_ip.ip.exploded, + "port0_dst_ip": dst_port0_ip.ip.exploded, + "port0_local_ip_hex": + self._ip_to_hex(port0_ip.ip.exploded), + "port0_prefixlen": port0_ip.network.prefixlen, + "port0_netmask": port0_ip.network.netmask.exploded, + "port0_netmask_hex": + self._ip_to_hex(port0_ip.network.netmask.exploded), + "port0_local_mac": + interfaces[0]["virtual-interface"]["local_mac"], + "port0_dst_mac": + interfaces[0]["virtual-interface"]["dst_mac"], + "port0_gateway": + self._get_ports_gateway(interfaces[0]["name"]), + "port0_local_network": + port0_ip.network.network_address.exploded, + "port0_prefix": port0_ip.network.prefixlen, + "port1_local_ip": port1_ip.ip.exploded, + "port1_dst_ip": dst_port1_ip.ip.exploded, + "port1_local_ip_hex": + self._ip_to_hex(port1_ip.ip.exploded), + "port1_prefixlen": port1_ip.network.prefixlen, + "port1_netmask": port1_ip.network.netmask.exploded, + "port1_netmask_hex": + self._ip_to_hex(port1_ip.network.netmask.exploded), + "port1_local_mac": + interfaces[1]["virtual-interface"]["local_mac"], + "port1_dst_mac": + interfaces[1]["virtual-interface"]["dst_mac"], + "port1_gateway": + self._get_ports_gateway(interfaces[1]["name"]), + "port1_local_network": + port1_ip.network.network_address.exploded, + "port1_prefix": port1_ip.network.prefixlen, + "port0_local_ip6": self._get_port0localip6(), + "port1_local_ip6": self._get_port1localip6(), + "port0_prefixlen6": self._get_port0prefixlen6(), + "port1_prefixlen6": self._get_port1prefixlen6(), + "port0_gateway6": self._get_port0gateway6(), + "port1_gateway6": self._get_port1gateway6(), + "port0_dst_ip_hex6": self._get_port0localip6(), + "port1_dst_ip_hex6": self._get_port1localip6(), + "port0_dst_netmask_hex6": self._get_port0prefixlen6(), + "port1_dst_netmask_hex6": self._get_port1prefixlen6(), + "bin_path": self.bin_path, + "socket": self.socket} + + for cfg in os.listdir(vnf_cfg): + vpe_config = "" + with open(os.path.join(vnf_cfg, cfg), 'r') as vpe_cfg: + vpe_config = vpe_cfg.read() + + self._provide_config_file(cfg, vpe_config, vpe_vars) + + LOG.info("Provision and start the vPE") + tool_path = provision_tool(self.connection, + os.path.join(self.bin_path, "vPE_vnf")) + cmd = VPE_PIPELINE_COMMAND.format(cfg_file="/tmp/vpe_config", + script="/tmp/vpe_script", + tool_path=tool_path) + self.connection.run(cmd, stdin=filewrapper, stdout=filewrapper, + keep_stdin_open=True, pty=True) + + def _provide_config_file(self, prefix, template, args): + cfg, cfg_content = tempfile.mkstemp() + cfg = os.fdopen(cfg, "w+") + cfg.write(template.format(**args)) + cfg.close() + cfg_file = "/tmp/%s" % prefix + self.connection.put(cfg_content, cfg_file) + return cfg_file + + def execute_command(self, cmd): + ''' send cmd to vnf process ''' + LOG.info("VPE command: %s", cmd) + output = [] + if self.q_in: + self.q_in.put(cmd + "\r\n") + time.sleep(3) + while self.q_out.qsize() > 0: + output.append(self.q_out.get()) + return "".join(output) + + def collect_kpi(self): + result = self.get_stats_vpe() + collect_stats = self._collect_resource_kpi() + result["collect_stats"] = collect_stats + LOG.debug("vPE collet Kpis: %s", result) + return result + + def get_stats_vpe(self): + ''' get vpe statistics ''' + result = {'pkt_in_up_stream': 0, 'pkt_drop_up_stream': 0, + 'pkt_in_down_stream': 0, 'pkt_drop_down_stream': 0} + up_stat_commands = ['p 5 stats port in 0', 'p 5 stats port out 0', + 'p 5 stats port out 1'] + down_stat_commands = ['p 9 stats port in 0', 'p 9 stats port out 0'] + pattern = \ + "Pkts in:\\s(\\d+)\\r\\n\\tPkts dropped by " \ + "AH:\\s(\\d+)\\r\\n\\tPkts dropped by other:\\s(\\d+)" + + for cmd in up_stat_commands: + stats = self.execute_command(cmd) + match = re.search(pattern, stats, re.MULTILINE) + if match: + result["pkt_in_up_stream"] = \ + result.get("pkt_in_up_stream", 0) + int(match.group(1)) + result["pkt_drop_up_stream"] = \ + result.get("pkt_drop_up_stream", 0) + \ + int(match.group(2)) + int(match.group(3)) + + for cmd in down_stat_commands: + stats = self.execute_command(cmd) + match = re.search(pattern, stats, re.MULTILINE) + if match: + result["pkt_in_down_stream"] = \ + result.get("pkt_in_down_stream", 0) + int(match.group(1)) + result["pkt_drop_down_stream"] = \ + result.get("pkt_drop_down_stream", 0) + \ + int(match.group(2)) + int(match.group(3)) + return result diff --git a/yardstick/network_services/vnf_generic/vnfdgen.py b/yardstick/network_services/vnf_generic/vnfdgen.py new file mode 100644 index 000000000..64554cdaf --- /dev/null +++ b/yardstick/network_services/vnf_generic/vnfdgen.py @@ -0,0 +1,71 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Generic file to map and build vnf discriptor """ + +from __future__ import absolute_import +import collections +import yaml + +from yardstick.common.task_template import TaskTemplate + + +def generate_vnfd(vnf_model, node): + """ + + :param vnf_model: VNF definition template, e.g. tg_ping_tpl.yaml + :param node: node configuration taken from pod.yaml + :return: Complete VNF Descriptor that will be taken + as input for GenericVNF.__init__ + """ + node["get"] = get + rendered_vnfd = TaskTemplate.render(vnf_model, **node) + # This is done to get rid of issues with serializing node + del node["get"] + filled_vnfd = yaml.load(rendered_vnfd) + return filled_vnfd + + +def dict_key_flatten(data): + """ Convert nested dict structure to dotted key + (e.g. {"a":{"b":1}} -> {"a.b":1} + + :param data: nested dictionary + :return: flat dicrionary + """ + next_data = {} + + # check for non-string iterables + if not any((isinstance(v, collections.Iterable) and not isinstance(v, str)) + for v in data.values()): + return data + + for key, val in data.items(): + if isinstance(val, collections.Mapping): + for n_k, n_v in val.items(): + next_data["%s.%s" % (key, n_k)] = n_v + elif isinstance(val, collections.Iterable) and not isinstance(val, + str): + for index, item in enumerate(val): + next_data["%s%d" % (key, index)] = item + else: + next_data[key] = val + + return dict_key_flatten(next_data) + + +def get(obj, key, *args): + """ Get template key from dictionary, get default value or raise an exception + """ + data = dict_key_flatten(obj) + return data.get(key, *args) diff --git a/yardstick/orchestrator/heat.py b/yardstick/orchestrator/heat.py index 7e0f360c4..e39c4356c 100644 --- a/yardstick/orchestrator/heat.py +++ b/yardstick/orchestrator/heat.py @@ -38,14 +38,14 @@ def get_short_key_uuid(uuid): class HeatObject(object): - ''' base class for template and stack''' + """ base class for template and stack""" def __init__(self): self._heat_client = None self.uuid = None def _get_heat_client(self): - '''returns a heat client instance''' + """returns a heat client instance""" if self._heat_client is None: sess = op_utils.get_session() @@ -57,14 +57,14 @@ class HeatObject(object): return self._heat_client def status(self): - '''returns stack state as a string''' + """returns stack state as a string""" heat = self._get_heat_client() stack = heat.stacks.get(self.uuid) return getattr(stack, 'stack_status') class HeatStack(HeatObject): - ''' Represents a Heat stack (deployed template) ''' + """ Represents a Heat stack (deployed template) """ stacks = [] def __init__(self, name): @@ -76,11 +76,11 @@ class HeatStack(HeatObject): @staticmethod def stacks_exist(): - '''check if any stack has been deployed''' + """check if any stack has been deployed""" return len(HeatStack.stacks) > 0 def _delete(self): - '''deletes a stack from the target cloud using heat''' + """deletes a stack from the target cloud using heat""" if self.uuid is None: return @@ -106,10 +106,10 @@ class HeatStack(HeatObject): self.uuid = None def delete(self, block=True, retries=3): - '''deletes a stack in the target cloud using heat (with retry) + """deletes a stack in the target cloud using heat (with retry) Sometimes delete fail with "InternalServerError" and the next attempt succeeds. So it is worthwhile to test a couple of times. - ''' + """ if self.uuid is None: return @@ -139,12 +139,12 @@ class HeatStack(HeatObject): stack.delete() def update(self): - '''update a stack''' + """update a stack""" raise RuntimeError("not implemented") class HeatTemplate(HeatObject): - '''Describes a Heat template and a method to deploy template to a stack''' + """Describes a Heat template and a method to deploy template to a stack""" def _init_template(self): self._template = {} @@ -152,9 +152,9 @@ class HeatTemplate(HeatObject): timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self._template['description'] = \ - '''Stack built by the yardstick framework for %s on host %s %s. + """Stack built by the yardstick framework for %s on host %s %s. All referred generated resources are prefixed with the template - name (i.e. %s).''' % (getpass.getuser(), socket.gethostname(), + name (i.e. %s).""" % (getpass.getuser(), socket.gethostname(), timestamp, self.name) # short hand for resources part of template @@ -179,7 +179,7 @@ class HeatTemplate(HeatObject): with open(template_file) as stream: print("Parsing external template:", template_file) template_str = stream.read() - self._template = template_format.parse(template_str) + self._template = template_format.parse(template_str) self._parameters = heat_parameters else: self._init_template() @@ -190,7 +190,7 @@ class HeatTemplate(HeatObject): log.debug("template object '%s' created", name) def add_network(self, name): - '''add to the template a Neutron Net''' + """add to the template a Neutron Net""" log.debug("adding Neutron::Net '%s'", name) self.resources[name] = { 'type': 'OS::Neutron::Net', @@ -198,7 +198,7 @@ class HeatTemplate(HeatObject): } def add_subnet(self, name, network, cidr): - '''add to the template a Neutron Subnet''' + """add to the template a Neutron Subnet""" log.debug("adding Neutron::Subnet '%s' in network '%s', cidr '%s'", name, network, cidr) self.resources[name] = { @@ -217,7 +217,7 @@ class HeatTemplate(HeatObject): } def add_router(self, name, ext_gw_net, subnet_name): - '''add to the template a Neutron Router and interface''' + """add to the template a Neutron Router and interface""" log.debug("adding Neutron::Router:'%s', gw-net:'%s'", name, ext_gw_net) self.resources[name] = { @@ -232,7 +232,7 @@ class HeatTemplate(HeatObject): } def add_router_interface(self, name, router_name, subnet_name): - '''add to the template a Neutron RouterInterface and interface''' + """add to the template a Neutron RouterInterface and interface""" log.debug("adding Neutron::RouterInterface '%s' router:'%s', " "subnet:'%s'", name, router_name, subnet_name) @@ -246,7 +246,7 @@ class HeatTemplate(HeatObject): } def add_port(self, name, network_name, subnet_name, sec_group_id=None): - '''add to the template a named Neutron Port''' + """add to the template a named Neutron Port""" log.debug("adding Neutron::Port '%s', network:'%s', subnet:'%s', " "secgroup:%s", name, network_name, subnet_name, sec_group_id) self.resources[name] = { @@ -272,9 +272,9 @@ class HeatTemplate(HeatObject): def add_floating_ip(self, name, network_name, port_name, router_if_name, secgroup_name=None): - '''add to the template a Nova FloatingIP resource + """add to the template a Nova FloatingIP resource see: https://bugs.launchpad.net/heat/+bug/1299259 - ''' + """ log.debug("adding Nova::FloatingIP '%s', network '%s', port '%s', " "rif '%s'", name, network_name, port_name, router_if_name) @@ -295,8 +295,8 @@ class HeatTemplate(HeatObject): } def add_floating_ip_association(self, name, floating_ip_name, port_name): - '''add to the template a Nova FloatingIP Association resource - ''' + """add to the template a Nova FloatingIP Association resource + """ log.debug("adding Nova::FloatingIPAssociation '%s', server '%s', " "floating_ip '%s'", name, port_name, floating_ip_name) @@ -310,7 +310,7 @@ class HeatTemplate(HeatObject): } def add_keypair(self, name, key_uuid): - '''add to the template a Nova KeyPair''' + """add to the template a Nova KeyPair""" log.debug("adding Nova::KeyPair '%s'", name) self.resources[name] = { 'type': 'OS::Nova::KeyPair', @@ -327,7 +327,7 @@ class HeatTemplate(HeatObject): } def add_servergroup(self, name, policy): - '''add to the template a Nova ServerGroup''' + """add to the template a Nova ServerGroup""" log.debug("adding Nova::ServerGroup '%s', policy '%s'", name, policy) if policy not in ["anti-affinity", "affinity"]: raise ValueError(policy) @@ -346,7 +346,7 @@ class HeatTemplate(HeatObject): } def add_security_group(self, name): - '''add to the template a Neutron SecurityGroup''' + """add to the template a Neutron SecurityGroup""" log.debug("adding Neutron::SecurityGroup '%s'", name) self.resources[name] = { 'type': 'OS::Neutron::SecurityGroup', @@ -376,7 +376,7 @@ class HeatTemplate(HeatObject): def add_server(self, name, image, flavor, ports=None, networks=None, scheduler_hints=None, user=None, key_name=None, user_data=None, metadata=None, additional_properties=None): - '''add to the template a Nova Server''' + """add to the template a Nova Server""" log.debug("adding Nova::Server '%s', image '%s', flavor '%s', " "ports %s", name, image, flavor, ports) @@ -435,8 +435,8 @@ class HeatTemplate(HeatObject): } def create(self, block=True): - '''creates a template in the target cloud using heat - returns a dict with the requested output values from the template''' + """creates a template in the target cloud using heat + returns a dict with the requested output values from the template""" log.info("Creating stack '%s'", self.name) # create stack early to support cleanup, e.g. ctrl-c while waiting diff --git a/yardstick/plot/plotter.py b/yardstick/plot/plotter.py index 4e65303dc..2f1f25228 100644 --- a/yardstick/plot/plotter.py +++ b/yardstick/plot/plotter.py @@ -9,12 +9,12 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -''' yardstick-plot - a command line tool for visualizing results from the +""" yardstick-plot - a command line tool for visualizing results from the output file of yardstick framework. Example invocation: $ yardstick-plot -i /tmp/yardstick.out -o /tmp/plots/ -''' +""" from __future__ import absolute_import from __future__ import print_function @@ -32,7 +32,7 @@ from six.moves import zip class Parser(object): - ''' Command-line argument and input file parser for yardstick-plot tool''' + """ Command-line argument and input file parser for yardstick-plot tool""" def __init__(self): self.data = { @@ -45,7 +45,7 @@ class Parser(object): self.scenarios = {} def _get_parser(self): - '''get a command-line parser''' + """get a command-line parser""" parser = argparse.ArgumentParser( prog='yardstick-plot', description="A tool for visualizing results from yardstick. " @@ -65,7 +65,7 @@ class Parser(object): return parser def _add_record(self, record): - '''add record to the relevant scenario''' + """add record to the relevant scenario""" if "runner_id" in record and "benchmark" not in record: obj_name = record["scenario_cfg"]["runner"]["object"] self.scenarios[record["runner_id"]] = obj_name @@ -76,13 +76,13 @@ class Parser(object): self.data[test_type].append(record) def parse_args(self): - '''parse command-line arguments''' + """parse command-line arguments""" parser = self._get_parser() self.args = parser.parse_args() return self.args def parse_input_file(self): - '''parse the input test results file''' + """parse the input test results file""" if self.args.input: input_file = self.args.input else: @@ -101,7 +101,7 @@ class Parser(object): class Plotter(object): - '''Graph plotter for scenario-specific results from yardstick framework''' + """Graph plotter for scenario-specific results from yardstick framework""" def __init__(self, data, output_folder): self.data = data @@ -110,7 +110,7 @@ class Plotter(object): self.colors = ['g', 'b', 'c', 'm', 'y'] def plot(self): - '''plot the graph(s)''' + """plot the graph(s)""" for test_type in self.data.keys(): if self.data[test_type]: plt.figure(self.fig_counter) @@ -122,7 +122,7 @@ class Plotter(object): self._save_plot(test_type) def _save_plot(self, test_type): - '''save the graph to output folder''' + """save the graph to output folder""" timestr = time.strftime("%Y%m%d-%H%M%S") file_name = test_type + "_" + timestr + ".png" if not self.output_folder: @@ -135,7 +135,7 @@ class Plotter(object): print(("Saved graph to " + new_file)) def _plot_ping(self, records): - '''ping test result interpretation and visualization on the graph''' + """ping test result interpretation and visualization on the graph""" rtts = [r['benchmark']['data']['rtt'] for r in records] seqs = [r['benchmark']['sequence'] for r in records] @@ -157,7 +157,7 @@ class Plotter(object): plt.ylabel("round trip time in milliseconds (rtt)") def _plot_pktgen(self, records): - '''pktgen test result interpretation and visualization on the graph''' + """pktgen test result interpretation and visualization on the graph""" flows = [r['benchmark']['data']['flows'] for r in records] sent = [r['benchmark']['data']['packets_sent'] for r in records] received = [int(r['benchmark']['data']['packets_received']) @@ -183,7 +183,7 @@ class Plotter(object): plt.ylabel("lost packets per million packets (ppm)") def _plot_iperf3(self, records): - '''iperf3 test result interpretation and visualization on the graph''' + """iperf3 test result interpretation and visualization on the graph""" intervals = [] for r in records: # If did not fail the SLA @@ -213,7 +213,7 @@ class Plotter(object): plt.ylabel("bandwidth in Kb/s") def _plot_fio(self, records): - '''fio test result interpretation and visualization on the graph''' + """fio test result interpretation and visualization on the graph""" rw_types = [r['sargs']['options']['rw'] for r in records] seqs = [x for x in range(1, len(records) + 1)] data = {} @@ -277,8 +277,8 @@ class Plotter(object): plt.xticks(seqs, seqs) def _plot_fio_helper(self, data, seqs, key, bar_color, axl): - '''check if measurements exist for a key and then plot the - data to a given subplot''' + """check if measurements exist for a key and then plot the + data to a given subplot""" if key in data: if len(data[key]) == 1: axl.bar(0.1, data[key], 0.35, color=bar_color) @@ -287,7 +287,7 @@ class Plotter(object): axl.plot(seqs, data[key], line_style) def _construct_legend(self, legend_texts, obj=plt): - '''construct legend for the plot or subplot''' + """construct legend for the plot or subplot""" ci = 0 lines = [] diff --git a/yardstick/ssh.py b/yardstick/ssh.py index 1cad8eefa..cfbc3ca96 100644 --- a/yardstick/ssh.py +++ b/yardstick/ssh.py @@ -202,7 +202,7 @@ class SSH(object): start_time = time.time() # encode on transmit, decode on receive - data_to_send = encodeutils.safe_encode("") + data_to_send = encodeutils.safe_encode("", incoming='utf-8') stderr_data = None # If we have data to be sent to stdin then `select' should also @@ -234,8 +234,11 @@ class SSH(object): if session.send_ready(): if stdin is not None and not stdin.closed: if not data_to_send: + stdin_txt = stdin.read(4096) + if stdin_txt is None: + stdin_txt = '' data_to_send = encodeutils.safe_encode( - stdin.read(4096), incoming='utf-8') + stdin_txt, incoming='utf-8') if not data_to_send: # we may need to keep stdin open if not keep_stdin_open: diff --git a/yardstick/vTC/apexlake/experimental_framework/benchmarking_unit.py b/yardstick/vTC/apexlake/experimental_framework/benchmarking_unit.py index d5de308c7..56ea6d2f0 100644 --- a/yardstick/vTC/apexlake/experimental_framework/benchmarking_unit.py +++ b/yardstick/vTC/apexlake/experimental_framework/benchmarking_unit.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -''' +""" The Benchmarking Unit manages the Benchmarking of VNFs orchestrating the initialization, execution and finalization -''' +""" from __future__ import absolute_import diff --git a/yardstick/vTC/apexlake/experimental_framework/benchmarks/benchmark_base_class.py b/yardstick/vTC/apexlake/experimental_framework/benchmarks/benchmark_base_class.py index 96cce2265..38c91ee3a 100644 --- a/yardstick/vTC/apexlake/experimental_framework/benchmarks/benchmark_base_class.py +++ b/yardstick/vTC/apexlake/experimental_framework/benchmarks/benchmark_base_class.py @@ -18,11 +18,11 @@ import abc class BenchmarkBaseClass(object): - ''' + """ This class represents a Benchmark that we want to run on the platform. One of them will be the calculation of the throughput changing the configuration parameters - ''' + """ def __init__(self, name, params): if not params: diff --git a/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py b/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py index 0f0af8b05..bbf55853d 100644 --- a/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py +++ b/yardstick/vTC/apexlake/experimental_framework/heat_template_generation.py @@ -13,14 +13,16 @@ # limitations under the License. -''' +""" Generation of the heat templates from the base template -''' +""" from __future__ import absolute_import -import json import os import shutil + +from oslo_serialization import jsonutils + from experimental_framework import common from experimental_framework.constants import framework_parameters as fp @@ -193,7 +195,7 @@ def generates_templates(base_heat_template, deployment_configuration): new_template += "_" + str(counter) + template_file_extension shutil.copy(base_template, new_template) - metadata = dict() + metadata = {} for var in heat_template_vars: if var.get_variable_name(): common.replace_in_file(new_template, "#" + @@ -203,7 +205,8 @@ def generates_templates(base_heat_template, deployment_configuration): # Save the metadata on a JSON file with open(new_template + ".json", 'w') as outfile: - json.dump(metadata, outfile) + # sort keys to maintain persistent order for git + jsonutils.dump(metadata, outfile, sort_keys=True) common.LOG.debug("Heat Templates and Metadata file " + str(counter) + " created") @@ -222,7 +225,7 @@ def get_all_heat_templates(template_dir, template_file_extension): (type: str) :return: type: list """ - template_files = list() + template_files = [] for dirname, dirnames, filenames in os.walk(template_dir): for filename in filenames: if template_file_extension in filename and \ diff --git a/yardstick/vTC/apexlake/experimental_framework/libraries/__init__.py b/yardstick/vTC/apexlake/experimental_framework/libraries/__init__.py index dcc18a45b..876e3ca31 100644 --- a/yardstick/vTC/apexlake/experimental_framework/libraries/__init__.py +++ b/yardstick/vTC/apexlake/experimental_framework/libraries/__init__.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -''' +""" Libraries to be used by the framework. -''' +""" __author__ = 'vmriccox' diff --git a/yardstick/vTC/apexlake/experimental_framework/packet_generators/__init__.py b/yardstick/vTC/apexlake/experimental_framework/packet_generators/__init__.py index a7c96a842..935f144f4 100644 --- a/yardstick/vTC/apexlake/experimental_framework/packet_generators/__init__.py +++ b/yardstick/vTC/apexlake/experimental_framework/packet_generators/__init__.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -''' +""" Packet generators -''' +""" __author__ = 'vmriccox' diff --git a/yardstick/vTC/apexlake/experimental_framework/packet_generators/dpdk_packet_generator.py b/yardstick/vTC/apexlake/experimental_framework/packet_generators/dpdk_packet_generator.py index 959003628..bd81527a2 100644 --- a/yardstick/vTC/apexlake/experimental_framework/packet_generators/dpdk_packet_generator.py +++ b/yardstick/vTC/apexlake/experimental_framework/packet_generators/dpdk_packet_generator.py @@ -34,10 +34,10 @@ class DpdkPacketGenerator(base_packet_generator.BasePacketGenerator): self.dpdk_interfaces = -1 def send_traffic(self): - ''' + """ Calls the packet generator and starts to send traffic Blocking call - ''' + """ current_dir = os.path.dirname(os.path.realpath(__file__)) DpdkPacketGenerator._chdir(self.directory) dpdk_vars = common.get_dpdk_pktgen_vars() diff --git a/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_1.yaml.json b/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_1.yaml.json index 3af9a1cc7..44a8aeb2e 100644 --- a/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_1.yaml.json +++ b/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_1.yaml.json @@ -1 +1 @@ -{"vnic_type": "normal", "ram": "1024", "vcpus": "2"}
\ No newline at end of file +{"ram": "1024", "vcpus": "2", "vnic_type": "normal"}
\ No newline at end of file diff --git a/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_2.yaml.json b/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_2.yaml.json index 9f246891d..0a66448b7 100644 --- a/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_2.yaml.json +++ b/yardstick/vTC/apexlake/tests/data/generated_templates/experiment_2.yaml.json @@ -1 +1 @@ -{"vnic_type": "direct", "ram": "1024", "vcpus": "2"}
\ No newline at end of file +{"ram": "1024", "vcpus": "2", "vnic_type": "direct"}
\ No newline at end of file diff --git a/yardstick/vTC/apexlake/tests/dpdk_packet_generator_test.py b/yardstick/vTC/apexlake/tests/dpdk_packet_generator_test.py index 0b0df6c2b..96ead5ef7 100644 --- a/yardstick/vTC/apexlake/tests/dpdk_packet_generator_test.py +++ b/yardstick/vTC/apexlake/tests/dpdk_packet_generator_test.py @@ -288,10 +288,10 @@ class TestDpdkPacketGenSendTraffic(unittest.TestCase): mock_dir_name, mock_os_path, mock_os_system): - ''' + """ Calls the packet generator and starts to send traffic Blocking call - ''' + """ mock_get_core_nics.return_value = "{corenics}" mock_os_path.realpath.return_value = 'pktgen_dir_test' mock_os_path.dirname.return_value = 'current_directory' |