Merge "Add scale out TCs with availability zone support"
authorRodolfo Alonso Hernandez <rodolfo.alonso.hernandez@intel.com>
Thu, 21 Jun 2018 13:06:26 +0000 (13:06 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Thu, 21 Jun 2018 13:06:26 +0000 (13:06 +0000)
docs/testing/user/userguide/14-nsb-operation.rst
samples/vnf_samples/nsut/prox/prox-tg-topology-scale-out.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd_multiflow-2-scale-out.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale_out.yaml [new file with mode: 0644]
samples/vnf_samples/nsut/vfw/vfw_tg_topology_scale_out.yaml [new file with mode: 0644]
samples/vnf_samples/traffic_profiles/ipv4_throughput_scale_out.yaml [new file with mode: 0644]

index d157914..851c652 100644 (file)
@@ -84,6 +84,116 @@ In this example we have ``TRex xe0 <-> xe0 VNF xe1 <-> xe0 UDP_Replay``
           downlink_0:
            - xe0
 
+
+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.
+
+.. _`Create a host aggregate`:
+
+1. Create a host aggregate in the OpenStack and add the available compute hosts
+   into the aggregate group.
+
+   .. note:: Change the ``<AZ_NAME>`` (availability zone name), ``<AGG_NAME>``
+     (host aggregate name) and ``<HOST>`` (host name of one of the compute) in the
+     commands below.
+
+   .. code-block:: bash
+
+     # create host aggregate
+     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
+     openstack aggregate add host <AGG_NAME> <HOST>
+
+2. To specify the OpenStack location (the exact compute host or group of the hosts)
+   of SampleVNF or traffic generator in the heat test case, the ``availability_zone`` server
+   configuration option should be used. For example:
+
+   .. note:: The ``<AZ_NAME>`` (availability zone name) should be changed according
+     to the name used during the host aggregate creation steps above.
+
+   .. code-block:: yaml
+
+     context:
+       name: yardstick
+       image: yardstick-samplevnfs
+       ...
+       servers:
+         vnf__0:
+           ...
+           availability_zone: <AZ_NAME>
+           ...
+         tg__0:
+           ...
+           availability_zone: <AZ_NAME>
+           ...
+       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.
+
+Those are:
+
+.. code-block:: console
+
+  <repo>/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd_multiflow-2-scale-out.yaml
+  <repo>/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale_out.yaml
+
+.. note:: This section describes the PROX scale-out testcase, but the same
+  procedure is used for the vFW test case.
+
+1. Before running the scale-out test case, make sure the host aggregates are
+   configured in the OpenStack environment. To check this, run the following
+   command:
+
+   .. code-block:: console
+
+     # show configured host aggregates (example)
+     openstack aggregate list
+     +----+------+-------------------+
+     | ID | Name | Availability Zone |
+     +----+------+-------------------+
+     |  4 | agg0 | AZ_NAME_0         |
+     |  5 | agg1 | AZ_NAME_1         |
+     +----+------+-------------------+
+
+2. If no host aggregates are configured, please use `steps above`__ to
+   configure them.
+
+__ `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.
+
+   .. note:: The ``az_0`` and ``az_1`` should be changed according to the host
+     aggregates created in the OpenStack.
+
+   .. code-block:: console
+
+     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": {
+           "vnf_0": "az_0", "tg_0": "az_1",
+           "vnf_1": "az_0", "tg_1": "az_1",
+           "vnf_2": "az_0", "tg_2": "az_1",
+           "vnf_3": "az_0", "tg_3": "az_1"
+         }
+       }'
+
+   ``num_vnfs`` specifies how many VNFs are going to be deployed in the
+   ``heat`` contexts. ``vnf_X`` and ``tg_X`` arguments configure the
+   availability zone where the VNF and traffic generator is going to be deployed.
+
+
 Collectd KPIs
 -------------
 
@@ -242,7 +352,7 @@ Baremetal
        file: /etc/yardstick/nodes/pod.yaml
 
 Scale-Out
---------------------
+---------
 
 VNFs performance data with scale-out helps
 
diff --git a/samples/vnf_samples/nsut/prox/prox-tg-topology-scale-out.yaml b/samples/vnf_samples/nsut/prox/prox-tg-topology-scale-out.yaml
new file mode 100644 (file)
index 0000000..5f01ecb
--- /dev/null
@@ -0,0 +1,53 @@
+# 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 num_vnfs = get(extra_args, 'num_vnfs', 1) %}
+---
+nsd:nsd-catalog:
+    nsd:
+    -   id: prox-tg-topology
+        name: prox-tg-topology
+        short-name: prox-tg-topology
+        description: prox-tg-topology
+        constituent-vnfd:
+{% for vnf_num in range(num_vnfs|int) %}
+        -   member-vnf-index: '{{ (vnf_num * 2) + 1 }}'
+            vnfd-id-ref: tg__{{ vnf_num }}
+            VNF model: ../../vnf_descriptors/tg_prox_tpl.yaml
+        -   member-vnf-index: '{{ (vnf_num * 2) + 2 }}'
+            vnfd-id-ref: vnf__{{ vnf_num }}
+            VNF model: ../../vnf_descriptors/prox_vnf.yaml
+{% endfor %}
+        vld:
+{% for vnf_num in range(num_vnfs|int) %}
+        -   id: uplink_{{ vnf_num }}
+            name: tg__{{ vnf_num }} to vnf__{{ vnf_num }} link {{ (vnf_num * 2) + 1 }}
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '{{ (vnf_num * 2) + 1 }}'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: tg__{{ vnf_num }}
+            -   member-vnf-index-ref: '{{ (vnf_num * 2) + 2 }}'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: vnf__{{ vnf_num }}
+        -   id: downlink_{{ vnf_num }}
+            name: vnf__{{ vnf_num }} to tg__{{ vnf_num }} link {{ (vnf_num * 2) + 2 }}
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '{{ (vnf_num * 2) + 1 }}'
+                vnfd-connection-point-ref: xe1
+                vnfd-id-ref: vnf__{{ vnf_num }}
+            -   member-vnf-index-ref: '{{ (vnf_num * 2) + 2 }}'
+                vnfd-connection-point-ref: xe1
+                vnfd-id-ref: tg__{{ vnf_num }}
+{% endfor %}
diff --git a/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd_multiflow-2-scale-out.yaml b/samples/vnf_samples/nsut/prox/tc_prox_heat_context_l2fwd_multiflow-2-scale-out.yaml
new file mode 100644 (file)
index 0000000..88581d2
--- /dev/null
@@ -0,0 +1,113 @@
+# 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 num_vnfs = num_vnfs or 1 %}
+{% set availability_zone = availability_zone or {} %}
+---
+schema: "yardstick:task:0.1"
+scenarios:
+-
+  type: NSPerf
+  traffic_profile: ../../traffic_profiles/prox_binsearch.yaml
+  topology: prox-tg-topology-scale-out.yaml
+  extra_args:
+    num_vnfs: {{ num_vnfs }}
+
+  nodes:
+{% for vnf_num in range(num_vnfs|int) %}
+    tg__{{ vnf_num }}: tg_{{ vnf_num }}.yardstick
+    vnf__{{ vnf_num }}: vnf_{{ vnf_num }}.yardstick
+{% endfor %}
+
+  options:
+{% for vnf_num in range(num_vnfs|int) %}
+    vnf__{{ vnf_num }}:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/handle_l2fwd_multiflow-2.cfg"
+      prox_args:
+        "-t": ""
+
+    tg__{{ vnf_num }}:
+      prox_path: /opt/nsb_bin/prox
+      prox_config: "configs/gen_l2fwd_multiflow-2.cfg"
+      prox_args:
+        "-e": ""
+        "-t": ""
+{% endfor %}
+
+  runner:
+    type: Duration
+    # we kill after duration, independent of test duration, so set this high
+    duration: 300
+
+context:
+  name: yardstick
+  image: yardstick-samplevnfs
+  user: ubuntu
+  flavor:
+    vcpus: 8
+    ram: 20480
+    disk: 10
+    extra_specs:
+      hw:cpu_sockets: 1
+      hw:cpu_cores: 8
+      hw:cpu_threads: 1
+  placement_groups:
+    pgrp1:
+      policy: "availability"
+
+  servers:
+{% for vnf_num in range(num_vnfs|int) %}
+    vnf_{{ vnf_num }}:
+      floating_ip: true
+      placement: "pgrp1"
+      {% if 'vnf_%s'|format(vnf_num) in availability_zone %}
+      availability_zone: "{{ availability_zone['vnf_%s'|format(vnf_num)] }}"
+      {% endif %}
+      network_ports:
+        mgmt:
+          - mgmt
+        uplink_{{ vnf_num }}:
+          - xe0
+        downlink_{{ vnf_num }}:
+          - xe1
+    tg_{{ vnf_num }}:
+      floating_ip: true
+      placement: "pgrp1"
+      {% if 'tg_%s'|format(vnf_num) in availability_zone %}
+      availability_zone: "{{ availability_zone['tg_%s'|format(vnf_num)] }}"
+      {% endif %}
+      network_ports:
+        mgmt:
+          - mgmt
+        uplink_{{ vnf_num }}:
+          - xe0
+        downlink_{{ vnf_num }}:
+          - xe1
+{% endfor %}
+
+  networks:
+    mgmt:
+      cidr: '10.0.1.0/24'
+{% for vnf_num in range(num_vnfs|int) %}
+    uplink_{{ vnf_num }}:
+      cidr: '10.0.{{ (vnf_num * 2) + 2 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+    downlink_{{ vnf_num }}:
+      cidr: '10.0.{{ (vnf_num * 2) + 3 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% endfor %}
diff --git a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale_out.yaml b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale_out.yaml
new file mode 100644 (file)
index 0000000..f140893
--- /dev/null
@@ -0,0 +1,114 @@
+# 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 num_vnfs = num_vnfs or 1 %}
+{% set availability_zone = availability_zone or {} %}
+---
+schema: yardstick:task:0.1
+scenarios:
+- type: NSPerf
+  traffic_profile: ../../traffic_profiles/ipv4_throughput_scale_out.yaml
+  topology: vfw_tg_topology_scale_out.yaml
+  extra_args:
+    num_vnfs: {{ num_vnfs }}
+  nodes:
+{% for vnf_num in range(num_vnfs|int) %}
+    tg__{{ vnf_num }}: tg_{{ vnf_num }}.yardstick
+    vnf__{{ vnf_num }}: vnf_{{ vnf_num }}.yardstick
+{% endfor %}
+  options:
+    framesize:
+      uplink: {64B: 100}
+      downlink: {64B: 100}
+    flow:
+      src_ip:
+{% for vnf_num in range(num_vnfs|int) %}
+        - {'tg__{{ vnf_num }}': 'xe0'}
+{% endfor %}
+      dst_ip:
+{% for vnf_num in range(num_vnfs|int) %}
+        - {'tg__{{ vnf_num }}': 'xe1'}
+{% endfor %}
+      count: 1
+    traffic_type: 4
+    rfc2544:
+      allowed_drop_rate: 0.0001 - 0.0001
+{% for vnf_num in range(num_vnfs|int) %}
+    vnf__{{ vnf_num }}:
+      rules: acl_1rule.yaml
+      vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
+{% endfor %}
+  runner:
+    type: Iteration
+    iterations: 10
+    interval: 35
+context:
+  # put node context first, so we don't HEAT deploy if node has errors
+  name: yardstick
+  image: yardstick-samplevnfs
+  flavor:
+    vcpus: 10
+    ram: 20480
+    disk: 6
+    extra_specs:
+      hw:cpu_sockets: 1
+      hw:cpu_cores: 10
+      hw:cpu_threads: 1
+  user: ubuntu
+  placement_groups:
+    pgrp1:
+      policy: "availability"
+  servers:
+{% for vnf_num in range(num_vnfs|int) %}
+    vnf_{{ vnf_num }}:
+      floating_ip: true
+      placement: "pgrp1"
+      {% if 'vnf_%s'|format(vnf_num) in availability_zone %}
+      availability_zone: "{{ availability_zone['vnf_%s'|format(vnf_num)] }}"
+      {% endif %}
+      network_ports:
+        mgmt:
+          - mgmt
+        uplink_{{ vnf_num }}:
+          - xe0
+        downlink_{{ vnf_num }}:
+          - xe1
+    tg_{{ vnf_num }}:
+      floating_ip: true
+      placement: "pgrp1"
+      {% if 'tg_%s'|format(vnf_num) in availability_zone %}
+      availability_zone: "{{ availability_zone['tg_%s'|format(vnf_num)] }}"
+      {% endif %}
+      network_ports:
+        mgmt:
+          - mgmt
+        uplink_{{ vnf_num }}:
+          - xe0
+        downlink_{{ vnf_num }}:
+          - xe1
+{% endfor %}
+  networks:
+    mgmt:
+      cidr: '10.0.1.0/24'
+{% for vnf_num in range(num_vnfs|int) %}
+    uplink_{{ vnf_num }}:
+      cidr: '10.0.{{ (vnf_num * 2) + 2 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+    downlink_{{ vnf_num }}:
+      cidr: '10.0.{{ (vnf_num * 2) + 3 }}.0/24'
+      gateway_ip: 'null'
+      port_security_enabled: False
+      enable_dhcp: 'false'
+{% endfor %}
diff --git a/samples/vnf_samples/nsut/vfw/vfw_tg_topology_scale_out.yaml b/samples/vnf_samples/nsut/vfw/vfw_tg_topology_scale_out.yaml
new file mode 100644 (file)
index 0000000..8bd01b7
--- /dev/null
@@ -0,0 +1,53 @@
+# 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 num_vnfs = get(extra_args, 'num_vnfs', 1) %}
+---
+nsd:nsd-catalog:
+    nsd:
+    -   id: 3tg-topology
+        name: 3tg-topology
+        short-name: 3tg-topology
+        description: 3tg-topology
+        constituent-vnfd:
+{% for vnf_num in range(num_vnfs|int) %}
+        -   member-vnf-index: '{{ (vnf_num * 2) + 1 }}'
+            vnfd-id-ref: tg__{{ vnf_num }}
+            VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml
+        -   member-vnf-index: '{{ (vnf_num * 2) + 2 }}'
+            vnfd-id-ref: vnf__{{ vnf_num }}
+            VNF model: ../../vnf_descriptors/vfw_vnf.yaml
+{% endfor %}
+        vld:
+{% for vnf_num in range(num_vnfs|int) %}
+        -   id: uplink_{{ vnf_num }}
+            name: tg__{{ vnf_num }} to vnf__{{ vnf_num }} link {{ (vnf_num * 2) + 1 }}
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '{{ (vnf_num * 2) + 1 }}'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: tg__{{ vnf_num }}
+            -   member-vnf-index-ref: '{{ (vnf_num * 2) + 2 }}'
+                vnfd-connection-point-ref: xe0
+                vnfd-id-ref: vnf__{{ vnf_num }}
+        -   id: downlink_{{ vnf_num }}
+            name: vnf__{{ vnf_num }} to tg__{{ vnf_num }} link {{ (vnf_num * 2) + 2 }}
+            type: ELAN
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: '{{ (vnf_num * 2) + 2 }}'
+                vnfd-connection-point-ref: xe1
+                vnfd-id-ref: vnf__{{ vnf_num }}
+            -   member-vnf-index-ref: '{{ (vnf_num * 2) + 1 }}'
+                vnfd-connection-point-ref: xe1
+                vnfd-id-ref: tg__{{ vnf_num }}
+{% endfor %}
diff --git a/samples/vnf_samples/traffic_profiles/ipv4_throughput_scale_out.yaml b/samples/vnf_samples/traffic_profiles/ipv4_throughput_scale_out.yaml
new file mode 100644 (file)
index 0000000..71e9e81
--- /dev/null
@@ -0,0 +1,102 @@
+# 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.
+
+# 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.
+#
+{% set num_vnfs = get(extra_args, 'num_vnfs', 1) %}
+---
+schema: "nsb:traffic_profile:0.1"
+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)
+{% for vnf_num in range(num_vnfs|int) %}
+uplink_{{ vnf_num }}:
+      ipv4:
+        id: {{ (vnf_num * 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') }}"
+
+        outer_l3v4:
+            proto: "udp"
+            srcip4: "{{get(flow, 'flow.src_ip_{{ vnf_num }}', '10.0.2.1-10.0.2.255') }}"
+            dstip4: "{{get(flow, 'flow.dst_ip_{{ vnf_num }}', '10.0.3.1-10.0.3.255') }}"
+            count: "{{get(flow, 'flow.count', '1') }}"
+            ttl: 32
+            dscp: 0
+        outer_l4:
+            srcport: "{{get(flow, 'flow.src_port_{{ vnf_num }}', '1234-4321') }}"
+            dstport: "{{get(flow, 'flow.dst_port_{{ vnf_num }}', '2001-4001') }}"
+            count: "{{get(flow, 'flow.count', '1') }}"
+downlink_{{ vnf_num }}:
+      ipv4:
+        id: {{ (vnf_num * 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') }}"
+
+        outer_l3v4:
+            proto: "udp"
+            srcip4: "{{get(flow, 'flow.dst_ip_{{ vnf_num }}', '10.0.3.1-10.0.3.255') }}"
+            dstip4: "{{get(flow, 'flow.src_ip_{{ vnf_num }}', '10.0.2.1-10.0.2.255') }}"
+            count: "{{get(flow, 'flow.count', '1') }}"
+            ttl: 32
+            dscp: 0
+        outer_l4:
+            srcport: "{{get(flow, 'flow.dst_port_{{ vnf_num }}', '1234-4321') }}"
+            dstport: "{{get(flow, 'flow.src_port_{{ vnf_num }}', '2001-4001') }}"
+            count: "{{get(flow, 'flow.count', '1') }}"
+{% endfor %}