Merge "Adding scale up feature to prox MPLS Tagging OvS-DPDK & SRIOV"
authorVolodymyr Mytnyk <volodymyrx.mytnyk@intel.com>
Tue, 15 Jan 2019 15:45:19 +0000 (15:45 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Tue, 15 Jan 2019 15:45:19 +0000 (15:45 +0000)
21 files changed:
docker/Dockerfile_ubuntu18
docs/testing/user/userguide/12-nsb-overview.rst
docs/testing/user/userguide/13-nsb-installation.rst
docs/testing/user/userguide/14-nsb-operation.rst
samples/vnf_samples/nsut/agnostic/tc_baremetal_rfc2544_latency_ipv4_64B_ixia_L3.yaml [moved from samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml with 59% similarity]
samples/vnf_samples/nsut/firewall/firewall-tg-topology-4port.yaml [deleted file]
samples/vnf_samples/nsut/firewall/firewall-tg-topology.yaml [deleted file]
samples/vnf_samples/nsut/firewall/firewall_vnf_topology_ixia.yaml [deleted file]
samples/vnf_samples/nsut/firewall/firewall_vnf_topology_ixia_4port.yaml [deleted file]
samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1flow_64B_trex.yaml [deleted file]
samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_1518B_ixia.yaml [deleted file]
samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_1518B_ixia_4port.yaml [deleted file]
samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia_4port.yaml [deleted file]
samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_L3.yaml [new file with mode: 0644]
yardstick/common/exceptions.py
yardstick/common/utils.py
yardstick/network_services/libs/ixia_libs/ixnet/ixnet_api.py
yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
yardstick/tests/unit/common/test_utils.py
yardstick/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py
yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py

index a9dfaeb..e9fe42e 100644 (file)
@@ -9,7 +9,7 @@
 
 FROM ubuntu:18.04
 
-LABEL image=opnfv/yardstick
+LABEL image=opnfv/yardstick-ubuntu-18.04
 
 ARG BRANCH=master
 
index 7b0d468..c5e395e 100644 (file)
@@ -7,16 +7,17 @@
 Network Services Benchmarking (NSB)
 ===================================
 
-Abstract
-========
-
 .. _Yardstick: https://wiki.opnfv.org/display/yardstick
+.. _`ETSI GS NFV-TST001`: http://www.etsi.org/deliver/etsi_gs/NFV-TST/001_099/001/01.01.01_60/gs_nfv-tst001v010101p.pdf
+
+Abstract
+--------
 
 This chapter provides an overview of the NSB, a contribution to OPNFV
 Yardstick_ from Intel.
 
 Overview
-========
+--------
 
 The goal of NSB is to Extend Yardstick to perform real world VNFs and NFVi
 Characterization and benchmarking with repeatable and deterministic methods.
@@ -31,44 +32,34 @@ according to user defined profiles.
 
 NSB extension includes:
 
-    - Generic data models of Network Services, based on ETSI spec `ETSI GS NFV-TST 001 <http://www.etsi.org/deliver/etsi_gs/NFV-TST/001_099/001/01.01.01_60/gs_nfv-tst001v010101p.pdf>`_
-
-    - New Standalone context for VNF testing like SRIOV, OVS, OVS-DPDK etc
-
-    - Generic VNF configuration models and metrics implemented with Python
-      classes
-
-    - Traffic generator features and traffic profiles
-
-        - L1-L3 state-less traffic profiles
-
-        - L4-L7 state-full  traffic  profiles
-
-        - Tunneling protocol / network overlay support
-
-    - Test case samples
-
-        - Ping
-
-        - Trex
+* Generic data models of Network Services, based on ETSI spec
+  `ETSI GS NFV-TST 001`_
+* Standalone :term:`context` for VNF testing like SRIOV, OVS, OVS-DPDK, etc
+* Generic VNF configuration models and metrics implemented with Python
+  classes
+* Traffic generator features and traffic profiles
 
-        - vPE,vCGNAT, vFirewall etc - ipv4 throughput, latency etc
+    * L1-L3 stateless traffic profiles
+    * L4-L7 state-full traffic profiles
+    * Tunneling protocol/network overlay support
 
-    - Traffic generators like Trex, ab/nginx, ixia, iperf etc
+* Test case samples
 
-    - KPIs for a given use case:
+    * Ping
+    * Trex
+    * vPE, vCGNAT, vFirewall etc - ipv4 throughput, latency etc
 
-        - System agent support for collecting NFVi KPI. This includes:
+* Traffic generators i.e. Trex, ab/nginx, ixia, iperf, etc
+* KPIs for a given use case:
 
-            - CPU statistic
+    * System agent support for collecting NFVi KPI. This includes:
 
-            - Memory BW
+        * CPU statistic
+        * Memory BW
+        * OVS-DPDK Stats
 
-            - OVS-DPDK Stats
-
-        - Network KPIs,  e.g., inpackets, outpackets, thoughput, latency etc
-
-        - VNF KPIs, e.g., packet_in, packet_drop, packet_fwd etc
+    * Network KPIs e.g. inpackets, outpackets, thoughput, latency
+    * VNF KPIs e.g. packet_in, packet_drop, packet_fwd
 
 Architecture
 ============
@@ -83,111 +74,102 @@ performed network functionality. The part of the data model is a set of the
 configuration parameters, number of connection points used and flavor including
 core and memory amount.
 
-The ETSI defines a Network Service as a set of configurable VNFs working in
-some NFV Infrastructure connecting each other using Virtual Links available
-through Connection Points. The ETSI MANO specification defines a set of
-management entities called Network Service Descriptors (NSD) and
-VNF Descriptors (VNFD) that define real Network Service. The picture below
-makes an example how the real Network Operator use-case can map into ETSI
-Network service definition
-
-Network Service framework performs the necessary test steps. It may involve
-
-    - Interacting with traffic generator and providing the inputs on traffic
-      type / packet structure to generate the required traffic as per the
-      test case. Traffic profiles will be used for this.
-
-    - Executing the commands required for the test procedure and analyses the
-      command output for confirming whether the command got executed correctly
-      or not. E.g. As per the test case, run the traffic for the given
-      time period / wait for the necessary time delay
-
-    - Verify the test result.
-
-    - Validate the traffic flow from SUT
-
-    - Fetch the table / data from SUT and verify the value as per the test case
-
-    - Upload the logs from SUT onto the Test Harness server
-
-    - Read the KPI's provided by particular VNF
+ETSI defines a Network Service as a set of configurable VNFs working in some
+NFV Infrastructure connecting each other using Virtual Links available through
+Connection Points. The ETSI MANO specification defines a set of management
+entities called Network Service Descriptors (NSD) and VNF Descriptors (VNFD)
+that define real Network Service. The picture below makes an example how the
+real Network Operator use-case can map into ETSI Network service definition.
+
+Network Service framework performs the necessary test steps. It may involve:
+
+* Interacting with traffic generator and providing the inputs on traffic
+  type / packet structure to generate the required traffic as per the
+  test case. Traffic profiles will be used for this.
+* Executing the commands required for the test procedure and analyses the
+  command output for confirming whether the command got executed correctly
+  or not e.g. as per the test case, run the traffic for the given
+  time period and wait for the necessary time delay.
+* Verify the test result.
+* Validate the traffic flow from SUT.
+* Fetch the data from SUT and verify the value as per the test case.
+* Upload the logs from SUT onto the Test Harness server
+* Retrieve the KPI's provided by particular VNF
 
 Components of Network Service
 -----------------------------
 
-  * *Models for Network Service benchmarking*: The Network Service benchmarking
-    requires the proper modelling approach. The NSB provides models using Python
-    files and defining of NSDs and VNFDs.
+* *Models for Network Service benchmarking*: The Network Service benchmarking
+  requires the proper modelling approach. The NSB provides models using Python
+  files and defining of NSDs and VNFDs.
 
-  The benchmark control application being a part of OPNFV yardstick can call
-  that python models to instantiate and configure the VNFs. Depending on
-  infrastructure type (bare-metal or fully virtualized) that calls could be
-  made directly or using MANO system.
+The benchmark control application being a part of OPNFV yardstick can call
+that python models to instantiate and configure the VNFs. Depending on
+infrastructure type (bare-metal or fully virtualized) that calls could be
+made directly or using MANO system.
 
-  * *Traffic generators in NSB*: Any benchmark application requires a set of
-    traffic generator and traffic profiles defining the method in which traffic
-    is generated.
+* *Traffic generators in NSB*: Any benchmark application requires a set of
+  traffic generator and traffic profiles defining the method in which traffic
+  is generated.
 
-  The Network Service benchmarking model extends the Network Service
-  definition with a set of Traffic Generators (TG) that are treated
-  same way as other VNFs being a part of benchmarked network service.
-  Same as other VNFs the traffic generator are instantiated and terminated.
+The Network Service benchmarking model extends the Network Service
+definition with a set of Traffic Generators (TG) that are treated
+same way as other VNFs being a part of benchmarked network service.
+Same as other VNFs the traffic generator are instantiated and terminated.
 
-  Every traffic generator has own configuration defined as a traffic profile
-  and a set of KPIs supported. The python models for TG is extended by
-  specific calls to listen and generate traffic.
+Every traffic generator has own configuration defined as a traffic profile
+and a set of KPIs supported. The python models for TG is extended by
+specific calls to listen and generate traffic.
 
-  * *The stateless TREX traffic generator*: The main traffic generator used as
-    Network Service stimulus is open source TREX tool.
+* *The stateless TREX traffic generator*: The main traffic generator used as
+  Network Service stimulus is open source TREX tool.
 
-  The TREX tool can generate any kind of stateless traffic.
+The TREX tool can generate any kind of stateless traffic.
 
-  .. code-block:: console
-
-          +--------+      +-------+      +--------+
-          |        |      |       |      |        |
-          |  Trex  | ---> |  VNF  | ---> |  Trex  |
-          |        |      |       |      |        |
-          +--------+      +-------+      +--------+
-
-  Supported testcases scenarios:
+.. code-block:: console
 
-      - Correlated UDP traffic using TREX traffic generator and replay VNF.
+        +--------+      +-------+      +--------+
+        |        |      |       |      |        |
+        |  Trex  | ---> |  VNF  | ---> |  Trex  |
+        |        |      |       |      |        |
+        +--------+      +-------+      +--------+
 
-          - using different IMIX configuration like pure voice, pure video traffic etc
+Supported testcases scenarios:
 
-          - using different number IP flows like 1 flow, 1K, 16K, 64K, 256K, 1M flows
+* Correlated UDP traffic using TREX traffic generator and replay VNF.
 
-          - Using different number of rules configured like 1 rule, 1K, 10K rules
+    * using different IMIX configuration like pure voice, pure video traffic etc
+    * using different number IP flows e.g. 1, 1K, 16K, 64K, 256K, 1M flows
+    * Using different number of rules configured e.g. 1, 1K, 10K rules
 
-  For UDP correlated traffic following Key Performance Indicators are collected
-  for every combination of test case parameters:
+For UDP correlated traffic following Key Performance Indicators are collected
+for every combination of test case parameters:
 
-      - RFC2544 throughput for various loss rate defined (1% is a default)
+* RFC2544 throughput for various loss rate defined (1% is a default)
 
 Graphical Overview
 ==================
 
-NSB Testing with yardstick framework  facilitate performance testing of various
+NSB Testing with Yardstick framework facilitate performance testing of various
 VNFs provided.
 
 .. code-block:: console
 
   +-----------+
-  |           |                                                     +-----------+
-  |   vPE     |                                                   ->|TGen Port 0|
-  | TestCase  |                                                   | +-----------+
-  |           |                                                   |
-  +-----------+     +------------------+            +-------+     |
-                    |                  | -- API --> |  VNF  | <--->
-  +-----------+     |     Yardstick    |            +-------+     |
-  | Test Case | --> |    NSB Testing   |                          |
-  +-----------+     |                  |                          |
-        |           |                  |                          |
-        |           +------------------+                          |
-  +-----------+                                                   | +-----------+
-  |   Traffic |                                                   ->|TGen Port 1|
-  |  patterns |                                                     +-----------+
+  |           |                                             +-------------+
+  |   vPE     |                                          -->| TGen Port 0 |
+  | TestCase  |                                          |  +-------------+
+  |           |                                          |
+  +-----------+     +---------------+      +-------+     |
+                    |               | ---> |  VNF  | <--->
+  +-----------+     |   Yardstick   |      +-------+     |
+  | Test Case | --> |  NSB Testing  |                    |
+  +-----------+     |               |                    |
+        |           |               |                    |
+        |           +---------------+                    |
+  +-----------+                                          |  +-------------+
+  |   Traffic |                                          -->| TGen Port 1 |
+  |  patterns |                                             +-------------+
   +-----------+
 
               Figure 1: Network Service - 2 server configuration
@@ -199,8 +181,8 @@ VNFs supported for chracterization:
 2. vFW - Virtual Firewall
 3. vACL - Access Control List
 4. Prox - Packet pROcessing eXecution engine:
-    - VNF can act as Drop, Basic Forwarding (no touch),
-      L2 Forwarding (change MAC), GRE encap/decap, Load balance based on
-      packet fields, Symmetric load balancing
-    - QinQ encap/decap IPv4/IPv6, ARP, QoS, Routing, Unmpls, Policing, ACL
+     * VNF can act as Drop, Basic Forwarding (no touch),
+       L2 Forwarding (change MAC), GRE encap/decap, Load balance based on
+       packet fields, Symmetric load balancing
+     * QinQ encap/decap IPv4/IPv6, ARP, QoS, Routing, Unmpls, Policing, ACL
 5. UDP_Replay
index 973d566..69f6a5a 100644 (file)
 
    Avoid deeper levels because they do not render well.
 
-=====================================
-Yardstick - NSB Testing -Installation
-=====================================
+================
+NSB Installation
+================
 
-Abstract
---------
+.. _OVS-DPDK: http://docs.openvswitch.org/en/latest/intro/install/dpdk/
+.. _devstack: https://docs.openstack.org/devstack/pike/>
 
 The Network Service Benchmarking (NSB) extends the yardstick framework to do
 VNF characterization and benchmarking in three different execution
@@ -32,16 +32,16 @@ according to user defined profiles.
 The steps needed to run Yardstick with NSB testing are:
 
 * Install Yardstick (NSB Testing).
-* Setup/Reference pod.yaml describing Test topology
-* Create/Reference the test configuration yaml file.
+* Setup/reference ``pod.yaml`` describing Test topology
+* Create/reference the test configuration yaml file.
 * Run the test case.
 
 
 Prerequisites
 -------------
 
-Refer chapter Yardstick Installation for more information on yardstick
-prerequisites
+Refer to :doc:`04-installation` for more information on Yardstick
+prerequisites.
 
 Several prerequisites are needed for Yardstick (VNF testing):
 
@@ -61,7 +61,6 @@ Hardware & Software Ingredients
 
 SUT requirements:
 
-
    ======= ===================
    Item    Description
    ======= ===================
@@ -93,29 +92,25 @@ Boot and BIOS settings:
                  Turbo Boost Disabled
    ============= =================================================
 
-
-
 Install Yardstick (NSB Testing)
 -------------------------------
 
-Download the source code and install Yardstick from it
+Download the source code and check out the latest stable branch::
 
 .. code-block:: console
 
   git clone https://gerrit.opnfv.org/gerrit/yardstick
-
   cd yardstick
-
   # Switch to latest stable branch
-  # git checkout <tag or stable branch>
-  git checkout stable/euphrates
+  git checkout stable/gambia
 
 Configure the network proxy, either using the environment variables or setting
-the global environment file:
+the global environment file.
+
+* Set environment
 
-.. code-block:: ini
+.. code-block::
 
-    cat /etc/environment
     http_proxy='http://proxy.company.com:port'
     https_proxy='http://proxy.company.com:port'
 
@@ -124,14 +119,11 @@ the global environment file:
     export http_proxy='http://proxy.company.com:port'
     export https_proxy='http://proxy.company.com:port'
 
-The last step is to modify the Yardstick installation inventory, used by
-Ansible:
-
-.. code-block:: ini
+Modify the Yardstick installation inventory, used by Ansible::
 
   cat ./ansible/install-inventory.ini
   [jumphost]
-  localhost  ansible_connection=local
+  localhost ansible_connection=local
 
   [yardstick-standalone]
   yardstick-standalone-node ansible_host=192.168.1.2
@@ -148,35 +140,29 @@ Ansible:
 
 .. note::
 
-   SSH access without password needs to be configured for all your nodes defined in
-   ``install-inventory.ini`` file.
-   If you want to use password authentication you need to install sshpass
-
-   .. code-block:: console
+   SSH access without password needs to be configured for all your nodes
+   defined in ``yardstick-install-inventory.ini`` file.
+   If you want to use password authentication you need to install ``sshpass``::
 
      sudo -EH apt-get install sshpass
 
-To execute an installation for a Bare-Metal or a Standalone context:
-
-.. code-block:: console
+To execute an installation for a BareMetal or a Standalone context::
 
     ./nsb_setup.sh
 
 
-To execute an installation for an OpenStack context:
-
-.. code-block:: console
+To execute an installation for an OpenStack context::
 
     ./nsb_setup.sh <path to admin-openrc.sh>
 
-Above command setup docker with latest yardstick code. To execute
-
-.. code-block:: console
+The above commands will set up Docker with the latest Yardstick code. To
+execute::
 
   docker exec -it yardstick bash
 
 It will also automatically download all the packages needed for NSB Testing
-setup. Refer chapter :doc:`04-installation` for more on docker
+setup. Refer chapter :doc:`04-installation` for more on Docker
+
 **Install Yardstick using Docker (recommended)**
 
 Another way to execute an installation for a Bare-Metal or a Standalone context
@@ -201,24 +187,22 @@ System Topology
 Environment parameters and credentials
 --------------------------------------
 
-Config yardstick conf
-~~~~~~~~~~~~~~~~~~~~~
+Configure yardstick.conf
+^^^^^^^^^^^^^^^^^^^^^^^^
 
-If user did not run 'yardstick env influxdb' inside the container, which will
-generate correct ``yardstick.conf``, then create the config file manually (run
-inside the container):
-::
+If you did not run ``yardstick env influxdb`` inside the container to generate
+ ``yardstick.conf``, then create the config file manually (run inside the
+container)::
 
     cp ./etc/yardstick/yardstick.conf.sample /etc/yardstick/yardstick.conf
     vi /etc/yardstick/yardstick.conf
 
-Add trex_path, trex_client_lib and bin_path in 'nsb' section.
-
-::
+Add ``trex_path``, ``trex_client_lib`` and ``bin_path`` to the ``nsb``
+section::
 
   [DEFAULT]
   debug = True
-  dispatcher = file, influxdb
+  dispatcher = influxdb
 
   [dispatcher_influxdb]
   timeout = 5
@@ -235,18 +219,26 @@ Add trex_path, trex_client_lib and bin_path in 'nsb' section.
 Run Yardstick - Network Service Testcases
 -----------------------------------------
 
-
 NS testing - using yardstick CLI
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
   See :doc:`04-installation`
 
-.. code-block:: console
+Connect to the Yardstick container::
 
 
   docker exec -it yardstick /bin/bash
-  source /etc/yardstick/openstack.creds (only for heat TC if nsb_setup.sh was NOT used)
-  export EXTERNAL_NETWORK="<openstack public network>" (only for heat TC)
+
+If you're running ``heat`` testcases and ``nsb_setup.sh`` was not used::
+  source /etc/yardstick/openstack.creds
+
+In addition to the above, you need to se the ``EXTERNAL_NETWORK`` for
+OpenStack::
+
+  export EXTERNAL_NETWORK="<openstack public network>"
+
+Finally, you should be able to run the testcase::
+
   yardstick --debug task start yardstick/samples/vnf_samples/nsut/<vnf>/<test case>
 
 Network Service Benchmarking - Bare-Metal
@@ -284,8 +276,8 @@ Bare-Metal 3-Node setup - Correlated Traffic
 
 
 Bare-Metal Config pod.yaml
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-Before executing Yardstick test cases, make sure that pod.yaml reflects the
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+Before executing Yardstick test cases, make sure that ``pod.yaml`` reflects the
 topology and update all the required fields.::
 
     cp /etc/yardstick/nodes/pod.yaml.nsb.sample /etc/yardstick/nodes/pod.yaml
@@ -368,12 +360,10 @@ SR-IOV Pre-requisites
 +++++++++++++++++++++
 
 On Host, where VM is created:
- a) Create and configure a bridge named ``br-int`` for VM to connect to external network.
-    Currently this can be done using VXLAN tunnel.
+ a) Create and configure a bridge named ``br-int`` for VM to connect to
+    external network. Currently this can be done using VXLAN tunnel.
 
-    Execute the following on host, where VM is created:
-
-  .. code-block:: console
+    Execute the following on host, where VM is created::
 
       ip link add type vxlan remote <Jumphost IP> local <DUT IP> id <ID: 10> dstport 4789
       brctl addbr br-int
@@ -382,7 +372,7 @@ On Host, where VM is created:
       ip addr add <IP#1, like: 172.20.2.1/24> dev br-int
       ip link set dev br-int up
 
-  .. note:: May be needed to add extra rules to iptable to forward traffic.
+  .. note:: You may need to add extra rules to iptable to forward traffic.
 
   .. code-block:: console
 
@@ -416,23 +406,24 @@ On Host, where VM is created:
     Yardstick has a tool for building this custom image with SampleVNF.
     It is necessary to have ``sudo`` rights to use this tool.
 
-    Also you may need to install several additional packages to use this tool, by
-    following the commands below::
-
-       sudo apt-get update && sudo apt-get install -y qemu-utils kpartx
+   Also you may need to install several additional packages to use this tool, by
+   following the commands below::
 
-    This image can be built using the following command in the directory where Yardstick is installed
+      sudo apt-get update && sudo apt-get install -y qemu-utils kpartx
 
-    .. code-block:: console
+   This image can be built using the following command in the directory where
+   Yardstick is installed::
 
-       export YARD_IMG_ARCH='amd64'
-       sudo echo "Defaults env_keep += \'YARD_IMG_ARCH\'" >> /etc/sudoers
+      export YARD_IMG_ARCH='amd64'
+      sudo echo "Defaults env_keep += \'YARD_IMG_ARCH\'" >> /etc/sudoers
 
-    Please use ansible script to generate a cloud image refer to :doc:`04-installation`
+   For instructions on generating a cloud image using Ansible, refer to
+   :doc:`04-installation`.
 
-    for more details refer to chapter :doc:`04-installation`
+   for more details refer to chapter :doc:`04-installation`
 
-    .. note:: VM should be build with static IP and should be accessible from yardstick host.
+   .. note:: VM should be build with static IP and be accessible from the
+      Yardstick host.
 
 
 SR-IOV Config pod.yaml describing Topology
@@ -457,10 +448,10 @@ SR-IOV 2-Node setup
   +----------+               +-------------------------+
   |          |               |       ^          ^      |
   |          |               |       |          |      |
-  |          | (0)<----->(0) | ------           |      |
-  |    TG1   |               |           SUT    |      |
-  |          |               |                  |      |
-  |          | (n)<----->(n) |------------------       |
+  |          | (0)<----->(0) | ------    SUT    |      |
+  |    TG1   |               |                  |      |
+  |          | (n)<----->(n) | -----------------       |
+  |          |               |                         |
   +----------+               +-------------------------+
   trafficgen_1                          host
 
@@ -470,29 +461,29 @@ SR-IOV 3-Node setup - Correlated Traffic
 ++++++++++++++++++++++++++++++++++++++++
 .. code-block:: console
 
-                               +--------------------+
-                               |                    |
-                               |                    |
-                               |        DUT         |
-                               |       (VNF)        |
-                               |                    |
-                               +--------------------+
-                               | VF NIC |  | VF NIC |
-                               +--------+  +--------+
-                                     ^          ^
-                                     |          |
-                                     |          |
-  +----------+               +-------------------------+            +--------------+
-  |          |               |       ^          ^      |            |              |
-  |          |               |       |          |      |            |              |
-  |          | (0)<----->(0) | ------           |      |            |     TG2      |
-  |    TG1   |               |           SUT    |      |            | (UDP Replay) |
-  |          |               |                  |      |            |              |
-  |          | (n)<----->(n) |                  ------ | (n)<-->(n) |              |
-  +----------+               +-------------------------+            +--------------+
-  trafficgen_1                          host                       trafficgen_2
-
-Before executing Yardstick test cases, make sure that pod.yaml reflects the
+                             +--------------------+
+                             |                    |
+                             |                    |
+                             |        DUT         |
+                             |       (VNF)        |
+                             |                    |
+                             +--------------------+
+                             | VF NIC |  | VF NIC |
+                             +--------+  +--------+
+                                   ^          ^
+                                   |          |
+                                   |          |
+  +----------+               +---------------------+            +--------------+
+  |          |               |     ^          ^    |            |              |
+  |          |               |     |          |    |            |              |
+  |          | (0)<----->(0) |-----           |    |            |     TG2      |
+  |    TG1   |               |         SUT    |    |            | (UDP Replay) |
+  |          |               |                |    |            |              |
+  |          | (n)<----->(n) |                -----| (n)<-->(n) |              |
+  +----------+               +---------------------+            +--------------+
+  trafficgen_1                          host                      trafficgen_2
+
+Before executing Yardstick test cases, make sure that ``pod.yaml`` reflects the
 topology and update all the required fields.
 
 .. code-block:: console
@@ -599,8 +590,8 @@ OVS-DPDK Pre-requisites
 ~~~~~~~~~~~~~~~~~~~~~~~
 
 On Host, where VM is created:
- a) Create and configure a bridge named ``br-int`` for VM to connect to external network.
-    Currently this can be done using VXLAN tunnel.
+ a) Create and configure a bridge named ``br-int`` for VM to connect to
+    external network. Currently this can be done using VXLAN tunnel.
 
     Execute the following on host, where VM is created:
 
@@ -647,26 +638,27 @@ On Host, where VM is created:
     Yardstick has a tool for building this custom image with SampleVNF.
     It is necessary to have ``sudo`` rights to use this tool.
 
-    Also you may need to install several additional packages to use this tool, by
-    following the commands below::
+   You may need to install several additional packages to use this tool, by
+   following the commands below::
 
-       sudo apt-get update && sudo apt-get install -y qemu-utils kpartx
+      sudo apt-get update && sudo apt-get install -y qemu-utils kpartx
 
-    This image can be built using the following command in the directory where Yardstick is installed::
+   This image can be built using the following command in the directory where
+   Yardstick is installed::
 
-       export YARD_IMG_ARCH='amd64'
-       sudo echo "Defaults env_keep += \'YARD_IMG_ARCH\'" >> /etc/sudoers
-       sudo tools/yardstick-img-dpdk-modify tools/ubuntu-server-cloudimg-samplevnf-modify.sh
+      export YARD_IMG_ARCH='amd64'
+      sudo echo "Defaults env_keep += \'YARD_IMG_ARCH\'" >> /etc/sudoers
+      sudo tools/yardstick-img-dpdk-modify tools/ubuntu-server-cloudimg-samplevnf-modify.sh
 
-    for more details refer to chapter :doc:`04-installation`
+   for more details refer to chapter :doc:`04-installation`
 
-    .. note::  VM should be build with static IP and should be accessible from yardstick host.
+   .. note::  VM should be build with static IP and should be accessible from
+      yardstick host.
 
- c) OVS & DPDK version.
-     - OVS 2.7 and DPDK 16.11.1 above version is supported
+3. OVS & DPDK version.
+   * OVS 2.7 and DPDK 16.11.1 above version is supported
 
- d) Setup OVS/DPDK on host.
-     Please refer to below link on how to setup `OVS-DPDK <http://docs.openvswitch.org/en/latest/intro/install/dpdk/>`_
+4. Setup `OVS-DPDK`_ on host.
 
 
 OVS-DPDK Config pod.yaml describing Topology
@@ -732,10 +724,8 @@ OVS-DPDK 3-Node setup - Correlated Traffic
   trafficgen_1                          host                       trafficgen_2
 
 
-Before executing Yardstick test cases, make sure that pod.yaml reflects the
-topology and update all the required fields.
-
-.. code-block:: console
+Before executing Yardstick test cases, make sure that the ``pod.yaml`` reflects
+the topology and update all the required fields::
 
   cp <yardstick>/etc/yardstick/nodes/standalone/trex_bm.yaml.sample /etc/yardstick/nodes/standalone/pod_trex.yaml
   cp <yardstick>/etc/yardstick/nodes/standalone/host_ovs.yaml /etc/yardstick/nodes/standalone/host_ovs.yaml
@@ -883,26 +873,22 @@ Single node OpenStack setup with external TG
 Host pre-configuration
 ++++++++++++++++++++++
 
-.. warning:: The following configuration requires sudo access to the system. Make
-  sure that your user have the access.
+.. warning:: The following configuration requires sudo access to the system.
+   Make sure that your user have the access.
 
-Enable the Intel VT-d or AMD-Vi extension in the BIOS. Some system manufacturers
-disable this extension by default.
+Enable the Intel VT-d or AMD-Vi extension in the BIOS. Some system
+manufacturers disable this extension by default.
 
 Activate the Intel VT-d or AMD-Vi extension in the kernel by modifying the GRUB
 config file ``/etc/default/grub``.
 
-For the Intel platform:
-
-.. code:: bash
+For the Intel platform::
 
   ...
   GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"
   ...
 
-For the AMD platform:
-
-.. code:: bash
+For the AMD platform::
 
   ...
   GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on"
@@ -917,9 +903,7 @@ Update the grub configuration file and restart the system:
   sudo update-grub
   sudo reboot
 
-Make sure the extension has been enabled:
-
-.. code:: bash
+Make sure the extension has been enabled::
 
   sudo journalctl -b 0 | grep -e IOMMU -e DMAR
 
@@ -932,6 +916,8 @@ Make sure the extension has been enabled:
   Feb 06 14:50:14 hostname kernel: DMAR: dmar1: reg_base_addr e0ffc000 ver 1:0 cap 8d2078c106f0466 ecap f020de
   Feb 06 14:50:14 hostname kernel: DMAR: DRHD base: 0x000000ee7fc000 flags: 0x0
 
+.. TODO: Refer to the yardstick installation guide for proxy set up
+
 Setup system proxy (if needed). Add the following configuration into the
 ``/etc/environment`` file:
 
@@ -954,13 +940,11 @@ Upgrade the system:
   sudo -EH apt-get upgrade
   sudo -EH apt-get dist-upgrade
 
-Install dependencies needed for the DevStack
+Install dependencies needed for DevStack
 
 .. code:: bash
 
-  sudo -EH apt-get install python
-  sudo -EH apt-get install python-dev
-  sudo -EH apt-get install python-pip
+  sudo -EH apt-get install python python-dev python-pip
 
 Setup SR-IOV ports on the host:
 
@@ -983,10 +967,10 @@ Setup SR-IOV ports on the host:
 DevStack installation
 +++++++++++++++++++++
 
-Use official `Devstack <https://docs.openstack.org/devstack/pike/>`_
-documentation to install OpenStack on a host. Please note, that stable
-``pike`` branch of devstack repo should be used during the installation.
-The required `local.conf`` configuration file are described below.
+If you want to try out NSB, but don't have OpenStack set-up, you can use
+`Devstack`_ to install OpenStack on a host. Please note, that the
+``stable/pike`` branch of devstack repo should be used during the installation.
+The required ``local.conf`` configuration file are described below.
 
 DevStack configuration file:
 
@@ -1005,11 +989,10 @@ Start the devstack installation on a host.
 TG host configuration
 +++++++++++++++++++++
 
-Yardstick automatically install and configure Trex traffic generator on TG
+Yardstick automatically installs and configures Trex traffic generator on TG
 host based on provided POD file (see below). Anyway, it's recommended to check
-the compatibility of the installed NIC on the TG server with software Trex using
-the manual at https://trex-tgn.cisco.com/trex/doc/trex_manual.html.
-
+the compatibility of the installed NIC on the TG server with software Trex
+using the `manual <https://trex-tgn.cisco.com/trex/doc/trex_manual.html>`_.
 
 Run the Sample VNF test case
 ++++++++++++++++++++++++++++
@@ -1018,7 +1001,7 @@ There is an example of Sample VNF test case ready to be executed in an
 OpenStack environment with SR-IOV support: ``samples/vnf_samples/nsut/vfw/
 tc_heat_sriov_external_rfc2544_ipv4_1rule_1flow_64B_trex.yaml``.
 
-Install yardstick using `Install Yardstick (NSB Testing)`_ steps for OpenStack
+Install Yardstick using `Install Yardstick (NSB Testing)`_ steps for OpenStack
 context.
 
 Create pod file for TG in the yardstick repo folder located in the yardstick
@@ -1071,16 +1054,15 @@ Controller/Compute pre-configuration
 ++++++++++++++++++++++++++++++++++++
 
 Pre-configuration of the controller and compute hosts are the same as
-described in `Host pre-configuration`_ section. Follow the steps in the section.
+described in `Host pre-configuration`_ section.
 
 
 DevStack configuration
 ++++++++++++++++++++++
 
-Use official `Devstack <https://docs.openstack.org/devstack/pike/>`_
-documentation to install OpenStack on a host. Please note, that stable
-``pike`` branch of devstack repo should be used during the installation.
-The required `local.conf`` configuration file are described below.
+A reference ``local.conf`` for deploying OpenStack in a multi-host environment
+using `Devstack`_ is shown in this section. The ``stable/pike`` branch of
+devstack repo should be used during the installation.
 
 .. note:: Update the devstack configuration files by replacing angluar brackets
   with a short description inside.
@@ -1104,13 +1086,14 @@ Start the devstack installation on the controller and compute hosts.
 Run the sample vFW TC
 +++++++++++++++++++++
 
-Install yardstick using `Install Yardstick (NSB Testing)`_ steps for OpenStack
+Install Yardstick using `Install Yardstick (NSB Testing)`_ steps for OpenStack
 context.
 
-Run sample vFW RFC2544 SR-IOV TC (``samples/vnf_samples/nsut/vfw/
-tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml``) in the heat
-context using steps described in `NS testing - using yardstick CLI`_ section
-and the following yardtick command line arguments:
+Run the sample vFW RFC2544 SR-IOV test case
+(``samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml``)
+in the heat context using steps described in
+`NS testing - using yardstick CLI`_ section and the following Yardstick command
+line arguments:
 
 .. code:: bash
 
@@ -1118,8 +1101,8 @@ and the following yardtick command line arguments:
   samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex.yaml
 
 
-Enabling other Traffic generator
---------------------------------
+Enabling other Traffic generators
+---------------------------------
 
 IxLoad
 ~~~~~~
@@ -1138,14 +1121,16 @@ IxLoad
 
   .. code-block:: console
 
-    cp <repo>/etc/yardstick/nodes/pod.yaml.nsb.sample.ixia etc/yardstick/nodes/pod_ixia.yaml
+    cp <repo>/etc/yardstick/nodes/pod.yaml.nsb.sample.ixia \
+      etc/yardstick/nodes/pod_ixia.yaml
 
   Config ``pod_ixia.yaml``
 
   .. literalinclude:: code/pod_ixia.yaml
      :language: console
 
-  for sriov/ovs_dpdk pod files, please refer to above Standalone Virtualization for ovs-dpdk/sriov configuration
+  for sriov/ovs_dpdk pod files, please refer to `Standalone Virtualization`_
+  for ovs-dpdk/sriov configuration
 
 3. Start IxOS TCL Server (Install 'Ixia IxExplorer IxOS <version>')
    You will also need to configure the IxLoad machine to start the IXIA
@@ -1155,7 +1140,7 @@ IxLoad
    * Go to:
      ``Start->Programs->Ixia->IxOS->IxOS 8.01-GA-Patch1->Ixia Tcl Server IxOS 8.01-GA-Patch1``
      or
-     ``"C:\Program Files (x86)\Ixia\IxOS\8.01-GA-Patch1\ixTclServer.exe"``
+     ``C:\Program Files (x86)\Ixia\IxOS\8.01-GA-Patch1\ixTclServer.exe``
 
 4. Create a folder ``Results`` in c:\ and share the folder on the network.
 
@@ -1172,14 +1157,16 @@ installed as part of the requirements of the project.
 
   .. code-block:: console
 
-    cp <repo>/etc/yardstick/nodes/pod.yaml.nsb.sample.ixia etc/yardstick/nodes/pod_ixia.yaml
+    cp <repo>/etc/yardstick/nodes/pod.yaml.nsb.sample.ixia \
+    etc/yardstick/nodes/pod_ixia.yaml
 
-  Config pod_ixia.yaml
+  Configure ``pod_ixia.yaml``
 
   .. literalinclude:: code/pod_ixia.yaml
      :language: console
 
-  for sriov/ovs_dpdk pod files, please refer to above Standalone Virtualization for ovs-dpdk/sriov configuration
+  for sriov/ovs_dpdk pod files, please refer to above
+  `Standalone Virtualization`_ for ovs-dpdk/sriov configuration
 
 2. Start IxNetwork TCL Server
    You will also need to configure the IxNetwork machine to start the IXIA
index 72b1c4b..9109850 100644 (file)
@@ -89,9 +89,9 @@ Availability zone
 ^^^^^^^^^^^^^^^^^
 
 The configuration of the availability zone is requred in cases where location
-of exact compute host/group of compute hosts needs to be specified for SampleVNF
-or traffic generator in the heat test case. If this is the case, please follow
-the instructions below.
+of exact compute host/group of compute hosts needs to be specified for
+:term:`SampleVNF` or traffic generator in the heat test case. If this is the
+case, please follow the instructions below.
 
 .. _`Create a host aggregate`:
 
@@ -105,7 +105,8 @@ the instructions below.
    .. code-block:: bash
 
      # create host aggregate
-     openstack aggregate create --zone <AZ_NAME> --property availability_zone=<AZ_NAME> <AGG_NAME>
+     openstack aggregate create --zone <AZ_NAME> \
+       --property availability_zone=<AZ_NAME> <AGG_NAME>
      # show available hosts
      openstack compute service list --service nova-compute
      # add selected host into the host aggregate
@@ -136,8 +137,9 @@ the instructions below.
        networks:
          ...
 
-There are two example of SampleVNF scale out test case which use the availability zone
-feature to specify the exact location of scaled VNFs and traffic generators.
+There are two example of SampleVNF scale out test case which use the
+``availability zone`` feature to specify the exact location of scaled VNFs and
+traffic generators.
 
 Those are:
 
@@ -164,21 +166,19 @@ Those are:
      |  5 | agg1 | AZ_NAME_1         |
      +----+------+-------------------+
 
-2. If no host aggregates are configured, please use `steps above`__ to
-   configure them.
+2. If no host aggregates are configured, please follow the instructions to
+   `Create a host aggregate`_
 
-__ `Create a host aggregate`_
 
-
-3. Run the SampleVNF PROX scale-out test case, specifying the availability
-   zone of each VNF and traffic generator as a task arguments.
+3. Run the SampleVNF PROX scale-out test case, specifying the
+   ``availability zone`` of each VNF and traffic generator as task arguments.
 
    .. note:: The ``az_0`` and ``az_1`` should be changed according to the host
-     aggregates created in the OpenStack.
+      aggregates created in the OpenStack.
 
    .. code-block:: console
 
-     yardstick -d task start\
+     yardstick -d task start \
      <repo>/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd_multiflow-2-scale-out.yaml\
        --task-args='{
          "num_vnfs": 4, "availability_zone": {
@@ -198,7 +198,7 @@ Collectd KPIs
 -------------
 
 NSB can collect KPIs from collected.  We have support for various plugins
-enabled by the Barometer project.
+enabled by the :term:`Barometer` project.
 
 The default yardstick-samplevnf has collectd installed. This allows for
 collecting KPIs from the VNF.
@@ -208,12 +208,11 @@ We assume that collectd is not installed on the compute nodes.
 
 To collectd KPIs from the NFVi compute nodes:
 
-
     * install_collectd on the compute nodes
     * create pod.yaml for the compute nodes
     * enable specific plugins depending on the vswitch and DPDK
 
-    example pod.yaml section for Compute node running collectd.
+    example ``pod.yaml`` section for Compute node running collectd.
 
 .. code-block:: yaml
 
@@ -356,8 +355,8 @@ Scale-Out
 
 VNFs performance data with scale-out helps
 
-  * in capacity planning to meet the given network node requirements
-  * in comparison between different VNF vendor offerings
+  * capacity planning to meet the given network node requirements
+  * comparison between different VNF vendor offerings
   * better the scale-out index, provides the flexibility in meeting future
     capacity requirements
 
@@ -488,11 +487,11 @@ Default values for OVS-DPDK:
 Sample test case file
 ^^^^^^^^^^^^^^^^^^^^^
 
-  1. Prepare SampleVNF image and copy it to ``flavor/images``.
-  2. Prepare context files for TREX and SampleVNF under ``contexts/file``.
-  3. Add bridge named ``br-int`` to the baremetal where SampleVNF image is deployed.
-  4. Modify ``networks/phy_port`` accordingly to the baremetal setup.
-  5. Run test from:
+1. Prepare SampleVNF image and copy it to ``flavor/images``.
+2. Prepare context files for TREX and SampleVNF under ``contexts/file``.
+3. Add bridge named ``br-int`` to the baremetal where SampleVNF image is deployed.
+4. Modify ``networks/phy_port`` accordingly to the baremetal setup.
+5. Run test from:
 
 .. literalinclude:: /../samples/vnf_samples/nsut/acl/tc_ovs_rfc2544_ipv4_1rule_1flow_64B_trex.yaml
    :language: yaml
@@ -1,4 +1,4 @@
-# Copyright (c) 2016-2018 Intel Corporation
+# Copyright (c) 2018 Intel Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+{% set vports = vports or 2 %}
 ---
 schema: yardstick:task:0.1
 scenarios:
 - type: NSPerf
-  traffic_profile: "../../traffic_profiles/ixia_ipv4_latency.yaml"
-  topology: firewall_vnf_topology_ixia.yaml
+  traffic_profile: ../../traffic_profiles/ixia_ipv4_latency_L3.yaml
+  topology: agnostic_vnf_topology_ixia_{{ vports }}ports.yaml
+  ixia_config: IxiaL3
+  extra_args:
+    vports: {{ vports }}
   nodes:
-    tg__0: trafficgen_1.yardstick
-    vnf__0: vnf.yardstick
+    tg__0: tg_0.yardstick
+    vnf__0: vnf_0.yardstick
   options:
     framesize:
-      private: {64B: 100}
-      public: {64B: 100}
+      uplink: {64B: 100}
+      downlink: {64B: 100}
     flow:
-      src_ip: [{'tg__0': 'xe0'}]
-      dst_ip: [{'tg__0': 'xe1'}]
+      src_ip:
+{% for vport in range(0,vports,2|int) %}
+        - '152.{{ vport }}.0.1-152.{{ vport }}.0.50'
+{% endfor %}
+      dst_ip:
+{% for vport in range(1,vports,2|int) %}
+        - '152.{{ vport }}.1.1-152.{{ vport }}.1.150'
+{% endfor %}
       count: 1
     traffic_type: 4
     rfc2544:
       allowed_drop_rate: 0.0001 - 0.0001
     vnf__0:
-      rules: acl_1rule.yaml
-      vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
-      nfvi_enable: True
+      []
   runner:
     type: Iteration
     iterations: 10
diff --git a/samples/vnf_samples/nsut/firewall/firewall-tg-topology-4port.yaml b/samples/vnf_samples/nsut/firewall/firewall-tg-topology-4port.yaml
deleted file mode 100644 (file)
index 105f85d..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (c) 2016-2017 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-nsd:nsd-catalog:
-    nsd:
-    -   id: 3tg-topology
-        name: 3tg-topology
-        short-name: 3tg-topology
-        description: 3tg-topology
-        constituent-vnfd:
-        -   member-vnf-index: '1'
-            vnfd-id-ref: tg__0
-            VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml      #VNF type
-        -   member-vnf-index: '2'
-            vnfd-id-ref: vnf__0
-            VNF model: ../../vnf_descriptors/firewall_vnf.yaml      #VNF type
-
-        vld:
-        -   id: uplink_0
-            name: tg__0 to vnf__0 link 1
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe0
-                vnfd-id-ref: tg__0
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe0
-                vnfd-id-ref: vnf__0
-        -   id: downlink_0
-            name: vnf__0 to tg__0 link 2
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe1
-                vnfd-id-ref: vnf__0
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe1
-                vnfd-id-ref: tg__0
-
-        -   id: uplink_1
-            name: tg__0 to vnf__0 link 3
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe2
-                vnfd-id-ref: tg__0
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe2
-                vnfd-id-ref: vnf__0
-        -   id: downlink_1
-            name: vnf__0 to tg__0 link 4
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe3
-                vnfd-id-ref: vnf__0
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe3
-                vnfd-id-ref: tg__0
diff --git a/samples/vnf_samples/nsut/firewall/firewall-tg-topology.yaml b/samples/vnf_samples/nsut/firewall/firewall-tg-topology.yaml
deleted file mode 100644 (file)
index b93137b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (c) 2016-2017 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-nsd:nsd-catalog:
-    nsd:
-    -   id: 2node-topology
-        name: 2node-topology
-        short-name: 2node-topology
-        description: 2node-topology
-        constituent-vnfd:
-        -   member-vnf-index: '1'
-            vnfd-id-ref: tg__0
-            VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml      #VNF type
-        -   member-vnf-index: '2'
-            vnfd-id-ref: vnf__0
-            VNF model: ../../vnf_descriptors/firewall_vnf.yaml      #VNF type
-
-        vld:
-        -   id: uplink_0
-            name: tg__0 to vnf__0 link 1
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe0
-                vnfd-id-ref: tg__0
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe0
-                vnfd-id-ref: vnf__0
-
-        -   id: downlink_0
-            name: vnf__0 to tg__0 link 2
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe1
-                vnfd-id-ref: vnf__0
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe1
-                vnfd-id-ref: tg__0
diff --git a/samples/vnf_samples/nsut/firewall/firewall_vnf_topology_ixia.yaml b/samples/vnf_samples/nsut/firewall/firewall_vnf_topology_ixia.yaml
deleted file mode 100644 (file)
index 9913a05..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (c) 2016-2017 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-nsd:nsd-catalog:
-    nsd:
-    -   id: vFW
-        name: vFW
-        short-name: vFW
-        description: scenario with vFW VNF
-        constituent-vnfd:
-        -   member-vnf-index: '1'
-            vnfd-id-ref: tg__0
-            VNF model: ../../vnf_descriptors/ixia_rfc2544_tpl.yaml
-        -   member-vnf-index: '2'
-            vnfd-id-ref: vnf__0
-            VNF model: ../../vnf_descriptors/firewall_vnf.yaml
-
-        vld:
-        -   id: uplink_0
-            name: tg__0 to vnf__0 link 1
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe0
-                vnfd-id-ref: tg__0
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe0
-                vnfd-id-ref: vnf__0
-
-        -   id: downlink_0
-            name: vnf__0 to tg__0 link 2
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe1
-                vnfd-id-ref: vnf__0
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe1
-                vnfd-id-ref: tg__0
diff --git a/samples/vnf_samples/nsut/firewall/firewall_vnf_topology_ixia_4port.yaml b/samples/vnf_samples/nsut/firewall/firewall_vnf_topology_ixia_4port.yaml
deleted file mode 100644 (file)
index 411c63d..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright (c) 2016-2017 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-nsd:nsd-catalog:
-    nsd:
-    -   id: vFW
-        name: vFW
-        short-name: vFW
-        description: scenario with vFW VNF
-        constituent-vnfd:
-        -   member-vnf-index: '1'
-            vnfd-id-ref: tg__0
-            VNF model: ../../vnf_descriptors/ixia_rfc2544_tpl.yaml
-        -   member-vnf-index: '2'
-            vnfd-id-ref: vnf__0
-            VNF model: ../../vnf_descriptors/firewall_vnf.yaml
-
-        vld:
-        -   id: uplink_0
-            name: tg__0 to vnf__0 link 1
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe0
-                vnfd-id-ref: tg__0
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe0
-                vnfd-id-ref: vnf__0
-
-        -   id: downlink_0
-            name: vnf__0 to tg__0 link 2
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe1
-                vnfd-id-ref: vnf__0
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe1
-                vnfd-id-ref: tg__0
-
-        -   id: uplink_1
-            name: tg__0 to vnf__0 link 3
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe2
-                vnfd-id-ref: tg__0
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe2
-                vnfd-id-ref: vnf__0
-
-        -   id: downlink_1
-            name: vnf__0 to tg__0 link 4
-            type: ELAN
-            vnfd-connection-point-ref:
-            -   member-vnf-index-ref: '2'
-                vnfd-connection-point-ref: xe3
-                vnfd-id-ref: vnf__0
-            -   member-vnf-index-ref: '1'
-                vnfd-connection-point-ref: xe3
-                vnfd-id-ref: tg__0
diff --git a/samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1flow_64B_trex.yaml b/samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1flow_64B_trex.yaml
deleted file mode 100644 (file)
index a2595f6..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright (c) 2016-2017 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-schema: yardstick:task:0.1
-scenarios:
-- type: NSPerf
-  traffic_profile: ../../traffic_profiles/ipv4_throughput.yaml
-  topology: firewall-tg-topology.yaml
-  nodes:
-    tg__0: trafficgen_1.yardstick
-    vnf__0: vnf.yardstick
-  options:
-    framesize:
-      private: {64B: 100}
-      public: {64B: 100}
-    flow:
-      src_ip:
-        - '152.16.100.181'
-      dst_ip:
-        - '152.16.40.181'
-      count: 1
-    traffic_type: 4
-    rfc2544:
-      allowed_drop_rate: 0.0001 - 0.0001
-    vnf__0:
-      nfvi_enable: True
-  runner:
-    type: Iteration
-    iterations: 2
-    interval: 35
-context:
-  type: Node
-  name: yardstick
-  nfvi_type: baremetal
-  file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_1518B_ixia.yaml b/samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_1518B_ixia.yaml
deleted file mode 100644 (file)
index ab2a633..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright (c) 2016-2018 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-schema: yardstick:task:0.1
-scenarios:
-- type: NSPerf
-  traffic_profile: "../../traffic_profiles/ixia_ipv4_latency.yaml"
-  topology: firewall_vnf_topology_ixia.yaml
-  nodes:
-    tg__0: trafficgen_1.yardstick
-    vnf__0: vnf.yardstick
-  options:
-    framesize:
-      private: {1518B: 100}
-      public: {1518B: 100}
-    flow:
-      src_ip: [{'tg__0': 'xe0'}]
-      dst_ip: [{'tg__0': 'xe1'}]
-      count: 1
-    traffic_type: 4
-    rfc2544:
-      allowed_drop_rate: 0.0001 - 0.0001
-    vnf__0:
-      rules: acl_1rule.yaml
-      vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
-      nfvi_enable: True
-  runner:
-    type: Iteration
-    iterations: 10
-    interval: 35
-context:
-  type: Node
-  name: yardstick
-  nfvi_type: baremetal
-  file: /etc/yardstick/nodes/pod_ixia.yaml
diff --git a/samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_1518B_ixia_4port.yaml b/samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_1518B_ixia_4port.yaml
deleted file mode 100644 (file)
index 03ceaaf..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2016-2018 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-schema: yardstick:task:0.1
-scenarios:
-- type: NSPerf
-  traffic_profile: "../../traffic_profiles/ixia_ipv4_latency.yaml"
-  topology: firewall_vnf_topology_ixia_4port.yaml
-  nodes:
-    tg__0: trafficgen_1.yardstick
-    vnf__0: vnf.yardstick
-  options:
-    framesize:
-      private: {1518B: 100}
-      public: {1518B: 100}
-    flow:
-      src_ip: [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}]
-      dst_ip: [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}]
-      count: 1
-    traffic_type: 4
-    rfc2544:
-      allowed_drop_rate: 0.0001 - 0.0001
-    vnf__0:
-      rules: acl_1rule.yaml
-      vnf_config: {lb_config: 'SW', lb_count: 2, worker_config: '1C/1T', worker_threads: 1}
-      nfvi_enable: True
-  runner:
-    type: Iteration
-    iterations: 10
-    interval: 35
-context:
-  type: Node
-  name: yardstick
-  nfvi_type: baremetal
-  file: /etc/yardstick/nodes/pod_ixia_4port.yaml
-#/etc/yardstick/nodes/pod_ixia.yaml
diff --git a/samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia_4port.yaml b/samples/vnf_samples/nsut/firewall/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia_4port.yaml
deleted file mode 100644 (file)
index 6850fd8..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2016-2018 Intel Corporation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
----
-schema: yardstick:task:0.1
-scenarios:
-- type: NSPerf
-  traffic_profile: "../../traffic_profiles/ixia_ipv4_latency.yaml"
-  topology: firewall_vnf_topology_ixia_4port.yaml
-  nodes:
-    tg__0: trafficgen_1.yardstick
-    vnf__0: vnf.yardstick
-  options:
-    framesize:
-      private: {64B: 100}
-      public: {64B: 100}
-    flow:
-      src_ip: [{'tg__0': 'xe0'}, {'tg__0': 'xe2'}]
-      dst_ip: [{'tg__0': 'xe1'}, {'tg__0': 'xe3'}]
-      count: 1
-    traffic_type: 4
-    rfc2544:
-      allowed_drop_rate: 0.0001 - 0.0001
-    vnf__0:
-      rules: acl_1rule.yaml
-      vnf_config: {lb_config: 'SW', lb_count: 2, worker_config: '1C/1T', worker_threads: 1}
-      nfvi_enable: True
-  runner:
-    type: Iteration
-    iterations: 10
-    interval: 35
-context:
-  type: Node
-  name: yardstick
-  nfvi_type: baremetal
-  file: /etc/yardstick/nodes/pod_ixia_4port.yaml
-#/etc/yardstick/nodes/pod_ixia.yaml
diff --git a/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_L3.yaml b/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency_L3.yaml
new file mode 100644 (file)
index 0000000..d1abcaf
--- /dev/null
@@ -0,0 +1,64 @@
+# Copyright (c) 2018 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+{% set vports = get(extra_args, 'vports', '2') %}
+---
+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 with L3 support
+traffic_profile:
+  traffic_type : IXIARFC2544Profile # defines traffic behavior - constant or look for highest possible throughput
+  frame_rate : 100%  # pc of linerate
+  duration: {{ duration }}
+  enable_latency: True
+
+{% for vport in range(vports|int) %}
+uplink_{{ vport }}:
+  ipv4:
+    id: {{ (vport * 2) + 1 }}
+    outer_l2:
+      framesize:
+        64B: "{{get(imix, 'imix.uplink.64B', '0') }}"
+        128B: "{{get(imix, 'imix.uplink.128B', '0') }}"
+        256B: "{{get(imix, 'imix.uplink.256B', '0') }}"
+        373b: "{{get(imix, 'imix.uplink.373B', '0') }}"
+        512B: "{{get(imix, 'imix.uplink.512B', '0') }}"
+        570B: "{{get(imix, 'imix.uplink.570B', '0') }}"
+        1024B: "{{get(imix, 'imix.uplink.1024B', '0') }}"
+        1280B: "{{get(imix, 'imix.uplink.1280B', '0') }}"
+        1400B: "{{get(imix, 'imix.uplink.1400B', '0') }}"
+        1500B: "{{get(imix, 'imix.uplink.1500B', '0') }}"
+        1518B: "{{get(imix, 'imix.uplink.1518B', '0') }}"
+
+downlink_{{vport}}:
+  ipv4:
+    id: {{ (vport * 2) + 2 }}
+    outer_l2:
+      framesize:
+        64B: "{{get(imix, 'imix.downlink.64B', '0') }}"
+        128B: "{{get(imix, 'imix.downlink.128B', '0') }}"
+        256B: "{{get(imix, 'imix.downlink.256B', '0') }}"
+        373b: "{{get(imix, 'imix.downlink.373B', '0') }}"
+        512B: "{{get(imix, 'imix.downlink.512B', '0') }}"
+        570B: "{{get(imix, 'imix.downlink.570B', '0') }}"
+        1024B: "{{get(imix, 'imix.downlink.1024B', '0') }}"
+        1280B: "{{get(imix, 'imix.downlink.1280B', '0') }}"
+        1400B: "{{get(imix, 'imix.downlink.1400B', '0') }}"
+        1500B: "{{get(imix, 'imix.downlink.1500B', '0') }}"
+        1518B: "{{get(imix, 'imix.downlink.1518B', '0') }}"
+{% endfor %}
index 5e0df97..f62f02f 100644 (file)
@@ -405,6 +405,10 @@ class IxNetworkFieldNotPresentInStackItem(YardstickException):
     message = 'Field "%(field_name)s" not present in stack item %(stack_item)s'
 
 
+class IncorrectFlowOption(YardstickException):
+    message = 'Flow option {option} for {link} is incorrect'
+
+
 class SLAValidationError(YardstickException):
     message = '%(case_name)s SLA validation failed. Error: %(error_msg)s'
 
index 51313ef..9eba896 100644 (file)
@@ -293,6 +293,17 @@ def make_ipv4_address(ip_addr):
     return ipaddress.IPv4Address(six.text_type(ip_addr))
 
 
+def get_ip_range_count(iprange):
+    start_range, end_range = iprange.split("-")
+    start = int(make_ipv4_address(start_range))
+    end = int(make_ipv4_address(end_range))
+    return end - start
+
+
+def get_ip_range_start(iprange):
+    return str(make_ipv4_address(iprange.split("-")[0]))
+
+
 def safe_ip_address(ip_addr):
     """ get ip address version v6 or v4 """
     try:
index d41dd02..cc627ef 100644 (file)
@@ -152,6 +152,9 @@ class IxNextgen(object):  # pragma: no cover
         vports = self.ixnet.getList(self.ixnet.getRoot(), 'vport')
         return vports
 
+    def get_static_interface(self, vport):
+        return self.ixnet.getList(vport, 'interface')
+
     def _get_config_element_by_flow_group_name(self, flow_group_name):
         """Get a config element using the flow group name
 
index 1d37f8f..4fbbf6a 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2016-2017 Intel Corporation
+# Copyright (c) 2016-2018 Intel Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@ import logging
 import six
 
 from yardstick.common import utils
+from yardstick.common import exceptions
 from yardstick.network_services.libs.ixia_libs.ixnet import ixnet_api
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
@@ -31,6 +32,8 @@ WAIT_PROTOCOLS_STARTED = 360
 
 
 class IxiaBasicScenario(object):
+    """Ixia Basic scenario for flow from port to port"""
+
     def __init__(self, client, context_cfg, ixia_cfg):
 
         self.client = client
@@ -43,6 +46,12 @@ class IxiaBasicScenario(object):
     def apply_config(self):
         pass
 
+    def run_protocols(self):
+        pass
+
+    def stop_protocols(self):
+        pass
+
     def create_traffic_model(self, traffic_profile=None):
         # pylint: disable=unused-argument
         vports = self.client.get_vports()
@@ -51,11 +60,81 @@ class IxiaBasicScenario(object):
         self.client.create_traffic_model(self._uplink_vports,
                                          self._downlink_vports)
 
-    def run_protocols(self):
-        pass
 
-    def stop_protocols(self):
-        pass
+class IxiaL3Scenario(IxiaBasicScenario):
+    """Ixia scenario for L3 flow between static ip's"""
+
+    def _add_static_ips(self):
+        vports = self.client.get_vports()
+        uplink_intf_vport = [(self.client.get_static_interface(vport), vport)
+                             for vport in vports[::2]]
+        downlink_intf_vport = [(self.client.get_static_interface(vport), vport)
+                               for vport in vports[1::2]]
+
+        for index in range(len(uplink_intf_vport)):
+            intf, vport = uplink_intf_vport[index]
+            try:
+                iprange = self.ixia_cfg['flow'].get('src_ip')[index]
+                start_ip = utils.get_ip_range_start(iprange)
+                count = utils.get_ip_range_count(iprange)
+                self.client.add_static_ipv4(intf, vport, start_ip, count, '32')
+            except IndexError:
+                raise exceptions.IncorrectFlowOption(
+                    option="src_ip", link="uplink_{}".format(index))
+
+            intf, vport = downlink_intf_vport[index]
+            try:
+                iprange = self.ixia_cfg['flow'].get('dst_ip')[index]
+                start_ip = utils.get_ip_range_start(iprange)
+                count = utils.get_ip_range_count(iprange)
+                self.client.add_static_ipv4(intf, vport, start_ip, count, '32')
+            except IndexError:
+                raise exceptions.IncorrectFlowOption(
+                    option="dst_ip", link="downlink_{}".format(index))
+
+    def _add_interfaces(self):
+        vports = self.client.get_vports()
+        uplink_vports = (vport for vport in vports[::2])
+        downlink_vports = (vport for vport in vports[1::2])
+
+        ix_node = next(node for _, node in self.context_cfg['nodes'].items()
+                       if node['role'] == 'IxNet')
+
+        for intf in ix_node['interfaces'].values():
+            ip = intf.get('local_ip')
+            mac = intf.get('local_mac')
+            gateway = None
+            try:
+                gateway = next(route.get('gateway')
+                               for route in ix_node.get('routing_table')
+                               if route.get('if') == intf.get('ifname'))
+            except StopIteration:
+                LOG.debug("Gateway not provided")
+
+            if 'uplink' in intf.get('vld_id'):
+                self.client.add_interface(next(uplink_vports),
+                                          ip, mac, gateway)
+            else:
+                self.client.add_interface(next(downlink_vports),
+                                          ip, mac, gateway)
+
+    def apply_config(self):
+        self._add_interfaces()
+        self._add_static_ips()
+
+    def create_traffic_model(self, traffic_profile=None):
+        # pylint: disable=unused-argument
+        vports = self.client.get_vports()
+        self._uplink_vports = vports[::2]
+        self._downlink_vports = vports[1::2]
+
+        uplink_endpoints = [port + '/protocols/static'
+                            for port in self._uplink_vports]
+        downlink_endpoints = [port + '/protocols/static'
+                              for port in self._downlink_vports]
+
+        self.client.create_ipv4_traffic_model(uplink_endpoints,
+                                              downlink_endpoints)
 
 
 class IxiaPppoeClientScenario(object):
@@ -370,6 +449,7 @@ class IxiaResourceHelper(ClientResourceHelper):
 
         self._ixia_scenarios = {
             "IxiaBasic": IxiaBasicScenario,
+            "IxiaL3": IxiaL3Scenario,
             "IxiaPppoeClient": IxiaPppoeClientScenario,
         }
 
index c0c9289..6b8d819 100644 (file)
@@ -1135,6 +1135,15 @@ class TestUtilsIpAddrMethods(ut_base.BaseUnitTestCase):
         for addr in addr_list:
             self.assertRaises(Exception, utils.make_ipv4_address, addr)
 
+    def test_get_ip_range_count(self):
+        iprange = "192.168.0.1-192.168.0.25"
+        count = utils.get_ip_range_count(iprange)
+        self.assertEqual(count, 24)
+
+    def test_get_ip_range_start(self):
+        iprange = "192.168.0.1-192.168.0.25"
+        start = utils.get_ip_range_start(iprange)
+        self.assertEqual(start, "192.168.0.1")
 
     def test_safe_ip_address(self):
         addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST
index 43682dd..a1802aa 100644 (file)
@@ -17,12 +17,14 @@ from copy import deepcopy
 import unittest
 import mock
 
+import paramiko
+
 from yardstick.common import exceptions as y_exceptions
 from yardstick.common import utils
 from yardstick.network_services.nfvi.resource import ResourceProfile
 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
 from yardstick.network_services.vnf_generic.vnf import sample_vnf
-from yardstick.network_services.vnf_generic.vnf.vnf_ssh_helper import VnfSshHelper
+from yardstick.network_services.vnf_generic.vnf import vnf_ssh_helper
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFDeployHelper
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ResourceHelper
@@ -34,6 +36,7 @@ from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTraff
 from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper
 from yardstick.tests.unit.network_services.vnf_generic.vnf import test_base
 from yardstick.benchmark.contexts import base as ctx_base
+from yardstick import ssh
 
 
 class MockError(Exception):
@@ -82,10 +85,11 @@ class TestVnfSshHelper(unittest.TestCase):
                         'virtual-interface': {
                             'dst_mac': '00:00:00:00:00:03',
                             'vpci': '0000:05:00.0',
+                            'dpdk_port_num': 0,
+                            'driver': 'i40e',
                             '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',
@@ -99,10 +103,11 @@ class TestVnfSshHelper(unittest.TestCase):
                         'virtual-interface': {
                             'dst_mac': '00:00:00:00:00:04',
                             'vpci': '0000:05:00.1',
+                            'dpdk_port_num': 1,
+                            'driver': 'ixgbe',
                             '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',
@@ -151,90 +156,88 @@ class TestVnfSshHelper(unittest.TestCase):
         }
     }
 
+    def setUp(self):
+        self.ssh_helper = vnf_ssh_helper.VnfSshHelper(
+            self.VNFD_0['mgmt-interface'], 'my/bin/path')
+        self.ssh_helper._run = mock.Mock()
+
     def assertAll(self, iterable, message=None):
         self.assertTrue(all(iterable), message)
 
     def test_get_class(self):
-        self.assertIs(VnfSshHelper.get_class(), VnfSshHelper)
+        self.assertIs(vnf_ssh_helper.VnfSshHelper.get_class(),
+                      vnf_ssh_helper.VnfSshHelper)
 
-    @mock.patch('yardstick.ssh.paramiko')
+    @mock.patch.object(ssh, 'paramiko')
     def test_copy(self, _):
-        ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
-        ssh_helper._run = mock.Mock()
-
-        ssh_helper.execute('ls')
-        self.assertTrue(ssh_helper.is_connected)
-        result = ssh_helper.copy()
-        self.assertIsInstance(result, VnfSshHelper)
+        self.ssh_helper.execute('ls')
+        self.assertTrue(self.ssh_helper.is_connected)
+        result = self.ssh_helper.copy()
+        self.assertIsInstance(result, vnf_ssh_helper.VnfSshHelper)
         self.assertFalse(result.is_connected)
-        self.assertEqual(result.bin_path, ssh_helper.bin_path)
-        self.assertEqual(result.host, ssh_helper.host)
-        self.assertEqual(result.port, ssh_helper.port)
-        self.assertEqual(result.user, ssh_helper.user)
-        self.assertEqual(result.password, ssh_helper.password)
-        self.assertEqual(result.key_filename, ssh_helper.key_filename)
-
-    @mock.patch('yardstick.ssh.paramiko')
+        self.assertEqual(result.bin_path, self.ssh_helper.bin_path)
+        self.assertEqual(result.host, self.ssh_helper.host)
+        self.assertEqual(result.port, self.ssh_helper.port)
+        self.assertEqual(result.user, self.ssh_helper.user)
+        self.assertEqual(result.password, self.ssh_helper.password)
+        self.assertEqual(result.key_filename, self.ssh_helper.key_filename)
+
+    @mock.patch.object(paramiko, 'SSHClient')
     def test_upload_config_file(self, mock_paramiko):
-        ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
-        ssh_helper._run = mock.MagicMock()
+        self.assertFalse(self.ssh_helper.is_connected)
+        cfg_file = self.ssh_helper.upload_config_file('/my/prefix', 'my content')
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
+        self.assertEqual(cfg_file, '/my/prefix')
 
-        self.assertFalse(ssh_helper.is_connected)
-        cfg_file = ssh_helper.upload_config_file('my/prefix', 'my content')
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
+    @mock.patch.object(paramiko, 'SSHClient')
+    def test_upload_config_file_path_does_not_exist(self, mock_paramiko):
+        self.assertFalse(self.ssh_helper.is_connected)
+        cfg_file = self.ssh_helper.upload_config_file('my/prefix', 'my content')
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
         self.assertTrue(cfg_file.startswith('/tmp'))
 
-        cfg_file = ssh_helper.upload_config_file('/my/prefix', 'my content')
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
-        self.assertEqual(cfg_file, '/my/prefix')
-
     def test_join_bin_path(self):
-        ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
-
         expected_start = 'my'
         expected_middle_list = ['bin']
         expected_end = 'path'
-        result = ssh_helper.join_bin_path()
+        result = self.ssh_helper.join_bin_path()
         self.assertTrue(result.startswith(expected_start))
         self.assertAll(middle in result for middle in expected_middle_list)
         self.assertTrue(result.endswith(expected_end))
 
         expected_middle_list.append(expected_end)
         expected_end = 'some_file.sh'
-        result = ssh_helper.join_bin_path('some_file.sh')
+        result = self.ssh_helper.join_bin_path('some_file.sh')
         self.assertTrue(result.startswith(expected_start))
         self.assertAll(middle in result for middle in expected_middle_list)
         self.assertTrue(result.endswith(expected_end))
 
         expected_middle_list.append('some_dir')
         expected_end = 'some_file.sh'
-        result = ssh_helper.join_bin_path('some_dir', 'some_file.sh')
+        result = self.ssh_helper.join_bin_path('some_dir', 'some_file.sh')
         self.assertTrue(result.startswith(expected_start))
         self.assertAll(middle in result for middle in expected_middle_list)
         self.assertTrue(result.endswith(expected_end))
 
-    @mock.patch('yardstick.ssh.paramiko')
-    @mock.patch('yardstick.ssh.provision_tool')
+    @mock.patch.object(paramiko, 'SSHClient')
+    @mock.patch.object(ssh, 'provision_tool')
     def test_provision_tool(self, mock_provision_tool, mock_paramiko):
-        ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path')
-        ssh_helper._run = mock.MagicMock()
-
-        self.assertFalse(ssh_helper.is_connected)
-        ssh_helper.provision_tool()
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
+        self.assertFalse(self.ssh_helper.is_connected)
+        self.ssh_helper.provision_tool()
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
         mock_provision_tool.assert_called_once()
 
-        ssh_helper.provision_tool(tool_file='my_tool.sh')
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
+        self.ssh_helper.provision_tool(tool_file='my_tool.sh')
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
         self.assertEqual(mock_provision_tool.call_count, 2)
 
-        ssh_helper.provision_tool('tool_path', 'my_tool.sh')
-        self.assertTrue(ssh_helper.is_connected)
-        mock_paramiko.SSHClient.assert_called_once()
+        self.ssh_helper.provision_tool('tool_path', 'my_tool.sh')
+        self.assertTrue(self.ssh_helper.is_connected)
+        mock_paramiko.assert_called_once()
         self.assertEqual(mock_provision_tool.call_count, 3)
 
 
index 65bf56f..ab7a6a8 100644 (file)
@@ -432,7 +432,6 @@ class TestIXIATrafficGen(unittest.TestCase):
 
 
 class TestIxiaBasicScenario(unittest.TestCase):
-
     def setUp(self):
         self._mock_IxNextgen = mock.patch.object(ixnet_api, 'IxNextgen')
         self.mock_IxNextgen = self._mock_IxNextgen.start()
@@ -450,15 +449,15 @@ class TestIxiaBasicScenario(unittest.TestCase):
         self.assertIsInstance(self.scenario, tg_rfc2544_ixia.IxiaBasicScenario)
         self.assertEqual(self.scenario.client, self.mock_IxNextgen)
 
-    def test_apply_config(self):
-        self.assertIsNone(self.scenario.apply_config())
-
     def test_create_traffic_model(self):
         self.mock_IxNextgen.get_vports.return_value = [1, 2, 3, 4]
         self.scenario.create_traffic_model()
         self.scenario.client.get_vports.assert_called_once()
         self.scenario.client.create_traffic_model.assert_called_once_with([1, 3], [2, 4])
 
+    def test_apply_config(self):
+        self.assertIsNone(self.scenario.apply_config())
+
     def test_run_protocols(self):
         self.assertIsNone(self.scenario.run_protocols())
 
@@ -466,6 +465,97 @@ class TestIxiaBasicScenario(unittest.TestCase):
         self.assertIsNone(self.scenario.stop_protocols())
 
 
+class TestIxiaL3Scenario(TestIxiaBasicScenario):
+    IXIA_CFG = {
+        'flow': {
+            'src_ip': ['192.168.0.1-192.168.0.50'],
+            'dst_ip': ['192.168.1.1-192.168.1.150']
+        }
+    }
+
+    CONTEXT_CFG = {
+        'nodes': {
+            'tg__0': {
+                'role': 'IxNet',
+                'interfaces': {
+                    'xe0': {
+                        'vld_id': 'uplink_0',
+                        'local_ip': '10.1.1.1',
+                        'local_mac': 'aa:bb:cc:dd:ee:ff',
+                        'ifname': 'xe0'
+                    },
+                    'xe1': {
+                        'vld_id': 'downlink_0',
+                        'local_ip': '20.2.2.2',
+                        'local_mac': 'bb:bb:cc:dd:ee:ee',
+                        'ifname': 'xe1'
+                    }
+                },
+                'routing_table': [{
+                    'network': "152.16.100.20",
+                    'netmask': '255.255.0.0',
+                    'gateway': '152.16.100.21',
+                    'if': 'xe0'
+                }]
+            }
+        }
+    }
+
+    def setUp(self):
+        super(TestIxiaL3Scenario, self).setUp()
+        self.ixia_cfg = self.IXIA_CFG
+        self.context_cfg = self.CONTEXT_CFG
+        self.scenario = tg_rfc2544_ixia.IxiaL3Scenario(self.mock_IxNextgen,
+                                                       self.context_cfg,
+                                                       self.ixia_cfg)
+
+    def test___init___(self):
+        self.assertIsInstance(self.scenario, tg_rfc2544_ixia.IxiaL3Scenario)
+        self.assertEqual(self.scenario.client, self.mock_IxNextgen)
+
+    def test_create_traffic_model(self):
+        self.mock_IxNextgen.get_vports.return_value = ['1', '2']
+        self.scenario.create_traffic_model()
+        self.scenario.client.get_vports.assert_called_once()
+        self.scenario.client.create_ipv4_traffic_model.\
+            assert_called_once_with(['1/protocols/static'],
+                                    ['2/protocols/static'])
+
+    def test_apply_config(self):
+        self.scenario._add_interfaces = mock.Mock()
+        self.scenario._add_static_ips = mock.Mock()
+        self.assertIsNone(self.scenario.apply_config())
+
+    def test__add_static(self):
+        self.mock_IxNextgen.get_vports.return_value = ['1', '2']
+        self.mock_IxNextgen.get_static_interface.side_effect = ['intf1',
+                                                                'intf2']
+
+        self.scenario._add_static_ips()
+
+        self.mock_IxNextgen.get_static_interface.assert_any_call('1')
+        self.mock_IxNextgen.get_static_interface.assert_any_call('2')
+
+        self.scenario.client.add_static_ipv4.assert_any_call(
+            'intf1', '1', '192.168.0.1', 49, '32')
+        self.scenario.client.add_static_ipv4.assert_any_call(
+            'intf2', '2', '192.168.1.1', 149, '32')
+
+    def test__add_interfaces(self):
+        self.mock_IxNextgen.get_vports.return_value = ['1', '2']
+
+        self.scenario._add_interfaces()
+
+        self.mock_IxNextgen.add_interface.assert_any_call('1',
+                                                          '10.1.1.1',
+                                                          'aa:bb:cc:dd:ee:ff',
+                                                          '152.16.100.21')
+        self.mock_IxNextgen.add_interface.assert_any_call('2',
+                                                          '20.2.2.2',
+                                                          'bb:bb:cc:dd:ee:ee',
+                                                          None)
+
+
 class TestIxiaPppoeClientScenario(unittest.TestCase):
 
     IXIA_CFG = {