summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/yardstick/nodes/pod.yaml.nsb.sample.ixia90
-rw-r--r--requirements.txt176
-rw-r--r--samples/vnf_samples/nsut/acl/acl-tg-topology-3node.yaml53
-rw-r--r--samples/vnf_samples/nsut/acl/acl-tg-topology.yaml50
-rw-r--r--samples/vnf_samples/nsut/acl/acl.cfg55
-rw-r--r--samples/vnf_samples/nsut/acl/acl_1rule.yaml47
-rw-r--r--samples/vnf_samples/nsut/acl/acl_config/acl_config61
-rw-r--r--samples/vnf_samples/nsut/acl/acl_config/acl_script53
-rw-r--r--samples/vnf_samples/nsut/acl/acl_rules.yaml47
-rw-r--r--samples/vnf_samples/nsut/acl/acl_vnf_topology_ixia.yaml50
-rw-r--r--samples/vnf_samples/nsut/acl/acl_vnf_topology_ixload.yaml50
-rw-r--r--samples/vnf_samples/nsut/acl/acl_worstcaserules.yaml47
-rw-r--r--samples/vnf_samples/nsut/acl/ixia_traffic.cfg51
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_http_ixload_1b_Requests-65000_Concurrency.yaml38
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml44
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml42
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex.yaml43
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_corelated_traffic.yaml45
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_scale_up.yaml45
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_worstcaserules_1flow_64B_packetsize.yaml42
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_worstcaserules_1flow_64B_trex.yaml43
-rw-r--r--samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_with_latency_ipv4_1rule_1flow_64B_trex.yaml45
-rw-r--r--samples/vnf_samples/nsut/acl/tc_heat_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml84
-rw-r--r--samples/vnf_samples/nsut/acl/tc_heat_trex_external_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml74
-rw-r--r--samples/vnf_samples/traffic_profiles/acl/HTTP-vACL_IPv4_2Ports.rxf1335
-rw-r--r--samples/vnf_samples/traffic_profiles/acl/acl_ipv4_profile_1flows.ixncfgbin0 -> 93841 bytes
-rw-r--r--samples/vnf_samples/traffic_profiles/ixia_ipv4_latency.yaml121
-rw-r--r--samples/vnf_samples/vnf_descriptors/acl_vnf.yaml84
-rw-r--r--samples/vnf_samples/vnf_descriptors/ixia_rfc2544_tpl.yaml79
-rw-r--r--samples/vnf_samples/vnf_descriptors/tg_ixload.yaml80
-rw-r--r--samples/vnf_samples/vnf_descriptors/tg_ixload_4port.yaml104
-rw-r--r--tests/ci/pip_license.py80
-rw-r--r--tests/unit/common/test_utils.py31
-rw-r--r--tests/unit/network_services/helpers/acl_vnf_topology_ixia.yaml50
-rw-r--r--tests/unit/network_services/libs/__init__.py0
-rw-r--r--tests/unit/network_services/libs/ixia_libs/__init__.py0
-rw-r--r--tests/unit/network_services/libs/ixia_libs/test_IxNet.py882
-rw-r--r--tests/unit/network_services/nfvi/test_resource.py220
-rw-r--r--tests/unit/network_services/traffic_profile/test_http_ixload.py250
-rw-r--r--tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py648
-rw-r--r--tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml47
-rw-r--r--tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py456
-rw-r--r--tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py374
-rw-r--r--tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py405
-rw-r--r--yardstick/common/constants.py26
-rw-r--r--yardstick/common/utils.py40
-rw-r--r--yardstick/network_services/libs/__init__.py0
-rw-r--r--yardstick/network_services/libs/ixia_libs/IxNet/IxNet.py335
-rw-r--r--yardstick/network_services/libs/ixia_libs/IxNet/__init__.py0
-rw-r--r--yardstick/network_services/libs/ixia_libs/__init__.py0
-rw-r--r--yardstick/network_services/nfvi/collectd.conf59
-rwxr-xr-xyardstick/network_services/nfvi/collectd.sh73
-rw-r--r--yardstick/network_services/nfvi/resource.py227
-rw-r--r--yardstick/network_services/traffic_profile/http_ixload.py294
-rw-r--r--yardstick/network_services/traffic_profile/ixia_rfc2544.py155
-rw-r--r--yardstick/network_services/vnf_generic/vnf/acl_vnf.py72
-rw-r--r--yardstick/network_services/vnf_generic/vnf/sample_vnf.py3
-rw-r--r--yardstick/network_services/vnf_generic/vnf/tg_ixload.py176
-rw-r--r--yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py165
59 files changed, 8042 insertions, 204 deletions
diff --git a/etc/yardstick/nodes/pod.yaml.nsb.sample.ixia b/etc/yardstick/nodes/pod.yaml.nsb.sample.ixia
new file mode 100644
index 000000000..57a83058e
--- /dev/null
+++ b/etc/yardstick/nodes/pod.yaml.nsb.sample.ixia
@@ -0,0 +1,90 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nodes:
+-
+ name: trafficgen_1
+ role: IxNet
+ ip: 1.2.1.1 #ixia machine ip
+ user: user
+ password: r00t
+ key_filename: /root/.ssh/id_rsa
+ tg_config:
+ ixchassis: "1.2.1.7" #ixia chassis ip
+ tcl_port: "8009" # tcl server port
+ lib_path: "/opt/ixia/ixos-api/8.01.0.2/lib/ixTcl1.0"
+ root_dir: "/opt/ixia/ixos-api/8.01.0.2/"
+ py_bin_path: "/opt/ixia/ixload/8.01.106.3/bin/"
+ py_lib_path: "/opt/ixia/ixnetwork/8.01.1029.14/lib/PythonApi"
+ dut_result_dir: "/mnt/ixia"
+ version: 8.1
+ interfaces:
+ xe0: # logical name from topology.yaml and vnfd.yaml
+ vpci: "2:5" # Card:port
+ driver: "none"
+ dpdk_port_num: 0
+ local_ip: "152.16.100.20"
+ netmask: "255.255.0.0"
+ local_mac: "00:98:10:64:14:00"
+ xe1: # logical name from topology.yaml and vnfd.yaml
+ vpci: "2:6" # [(Card, port)]
+ driver: "none"
+ dpdk_port_num: 1
+ local_ip: "152.40.40.20"
+ netmask: "255.255.0.0"
+ local_mac: "00:98:28:28:14:00"
+-
+ name: vnf
+ role: VirtualNetworkFunction
+ ip: 192.168.100.101
+ user: root
+ password: r00t
+ host: 192.168.100.101
+ key_filename: /root/.ssh/id_rsa
+ interfaces:
+ xe0: # logical name from topology.yaml and vnfd.yaml
+ vpci: "0000:07:00.2"
+ driver: "i40e"
+ dpdk_port_num: 0
+ local_ip: "152.16.100.10"
+ netmask: "255.255.0.0"
+ local_mac: "00:00:00:00:00:03"
+
+ xe1: # logical name from topology.yaml and vnfd.yaml
+ vpci: "0000:07:00.3"
+ driver: "i40e"
+ dpdk_port_num: 1
+ local_ip: "152.40.40.10"
+ netmask: "255.255.0.0"
+ local_mac: "00:00:00:00:00:04"
+
+ routing_table:
+ - network: "152.16.100.20"
+ netmask: "255.255.0.0"
+ gateway: "152.16.100.20"
+ if: "xe0"
+ - network: "152.40.40.20"
+ netmask: "255.255.0.0"
+ gateway: "152.40.40.20"
+ if: "xe1"
+
+ nd_route_tbl:
+ - network: "0064:ff9b:0:0:0:0:9810:6414"
+ netmask: "112"
+ gateway: "0064:ff9b:0:0:0:0:9810:6414"
+ if: "xe0"
+ - network: "0064:ff9b:0:0:0:0:9828:2814"
+ netmask: "112"
+ gateway: "0064:ff9b:0:0:0:0:9828:2814"
+ if: "xe1"
diff --git a/requirements.txt b/requirements.txt
index d90a9e5e4..d5d079386 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,90 +7,92 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
-Babel==2.3.4
-Jinja2==2.8.1
-MarkupSafe==0.23
-PyYAML==3.12
-SQLAlchemy==1.1.4
-ansible==2.2.2.0
-appdirs==1.4.3
-backport-ipaddress==0.1; python_version <= '2.7'
-chainmap==1.0.2
-cliff==2.4.0
-cmd2==0.6.9
-coverage==4.3.4
-debtcollector==1.11.0
-django==1.8.17
-docker-py==1.10.6
-ecdsa==0.13
-extras==1.0.0
-fixtures==3.0.0
-flake8==2.5.4
-flasgger==0.5.13
-flask-restful-swagger==0.19
-flask-restful==0.3.5
-flask==0.11.1
-funcsigs==1.0.2
-functools32==3.2.3.post2; python_version <= '2.7'
-futures==3.0.5
-influxdb==4.0.0
-iso8601==0.1.11
-jsonpatch==1.15
-jsonpointer==1.10
-jsonschema==2.5.1
-jinja2schema==0.1.4
-keystoneauth1==2.18.0
-kubernetes==3.0.0a1
-linecache2==1.0.0
-lxml==3.7.2
-mccabe==0.4.0
-mock==2.0.0 # upgrade to version 2.0.0 to match python3 unittest.mock features
-monotonic==1.2
-msgpack-python==0.4.8
-netaddr==0.7.19
-netifaces==0.10.5
-nose==1.3.7
-openstacksdk==0.9.13
-os-client-config==1.26.0
-osc-lib==1.3.0
-oslo.config==3.22.0
-oslo.i18n==3.12.0
-oslo.serialization==2.16.0
-oslo.utils==3.22.0
-paramiko==2.1.1
-pbr==1.10.0
-pep8==1.7.0
-pika==0.10.0
-positional==1.1.1
-prettytable==0.7.2
-pycrypto==2.6.1
-pyflakes==1.0.0
-pyparsing==2.1.10
-pyroute2==0.4.12
-pyrsistent==0.11.12
-python-cinderclient==1.11.0
-python-glanceclient==2.6.0
-python-heatclient==1.8.1
-python-keystoneclient==3.10.0
-python-mimeparse==1.6.0
-python-neutronclient==6.1.0
-python-novaclient==7.1.1
-python-openstackclient==3.8.1
-python-subunit==1.2.0
-python-swiftclient==3.3.0
-pytz==2016.10
-pyzmq==14.5.0 # version 14.5.0 for compatibility with trex traffic generator
-requests==2.13.0
-requestsexceptions==1.1.3
-scp==0.10.2
-shade==1.17.0
-simplejson==3.10.0
-six==1.10.0
-stevedore==1.20.0
-testrepository==0.0.20
-testtools==2.2.0
-traceback2==1.4.0
-unicodecsv==0.14.1
-unittest2==1.1.0
-warlock==1.2.0
-wrapt==1.10.8
+Babel==2.3.4 # BSD; OSI Approved BSD License
+Jinja2==2.8.1 # BSD; OSI Approved BSD License
+MarkupSafe==0.23 # BSD; OSI Approved BSD License
+PyYAML==3.12 # MIT; OSI Approved MIT License
+SQLAlchemy==1.1.4 # MIT License; OSI Approved MIT License
+ansible==2.2.2.0 # GPLv3; OSI Approved GNU General Public License v3 or later (GPLv3+)
+appdirs==1.4.3 # MIT; OSI Approved MIT License
+backport-ipaddress==0.1; python_version <= "2.7" # OSI Approved Python Software Foundation License
+chainmap==1.0.2 # Python Software Foundation License; OSI Approved Python Software Foundation License
+cliff==2.4.0 # OSI Approved Apache Software License
+cmd2==0.6.9 # MIT; OSI Approved MIT License
+coverage==4.3.4 # Apache 2.0; OSI Approved Apache Software License; http://www.apache.org/licenses/LICENSE-2.0; http://www.apache.org/licenses/LICENSE-2.0
+debtcollector==1.11.0 # OSI Approved Apache Software License
+django==1.8.17 # BSD; OSI Approved BSD License
+docker-py==1.10.6 # OSI Approved Apache Software License
+ecdsa==0.13 # MIT
+extras==1.0.0 # OSI Approved MIT License
+fixtures==3.0.0 # OSI Approved BSD License; OSI Approved Apache Software License
+flake8==2.5.4 # MIT; OSI Approved MIT License
+flasgger==0.5.13 # MIT
+flask-restful-swagger==0.19 # MIT
+flask-restful==0.3.5 # BSD; OSI Approved BSD License
+flask==0.11.1 # BSD; OSI Approved BSD License
+funcsigs==1.0.2 # ASL; OSI Approved Apache Software License
+functools32==3.2.3.post2; python_version <= "2.7" # PSF license
+futures==3.0.5 # BSD; OSI Approved BSD License
+influxdb==4.0.0 # MIT License; OSI Approved MIT License
+iso8601==0.1.11 # MIT; OSI Approved MIT License
+jsonpatch==1.15 # Modified BSD License; OSI Approved BSD License
+jsonpointer==1.10 # Modified BSD License; OSI Approved BSD License
+jsonschema==2.5.1 # MIT; OSI Approved MIT License
+jinja2schema==0.1.4 # OSI Approved BSD License
+keystoneauth1==2.18.0 # OSI Approved Apache Software License
+kubernetes==3.0.0a1 # OSI Approved Apache Software License
+linecache2==1.0.0 # OSI Approved Python Software Foundation License
+lxml==3.7.2 # OSI Approved BSD License
+mccabe==0.4.0 # Expat license; OSI Approved MIT License
+# upgrade to version 2.0.0 to match python3 unittest.mock features
+mock==2.0.0 # OSI Approved BSD License; `BSD License`_; http://github.com/testing-cabal/mock/blob/master/LICENSE.txt
+monotonic==1.2 # Apache; OSI Approved Apache Software License
+msgpack-python==0.4.8 # OSI Approved Apache Software License
+netaddr==0.7.19 # BSD License; OSI Approved BSD License; OSI Approved MIT License
+netifaces==0.10.5 # MIT License; OSI Approved MIT License
+nose==1.3.7 # GNU LGPL; OSI Approved GNU Library or Lesser General Public License (LGPL)
+openstacksdk==0.9.13 # OSI Approved Apache Software License
+os-client-config==1.26.0 # OSI Approved Apache Software License
+osc-lib==1.3.0 # OSI Approved Apache Software License
+oslo.config==3.22.0 # OSI Approved Apache Software License
+oslo.i18n==3.12.0 # OSI Approved Apache Software License
+oslo.serialization==2.16.0 # OSI Approved Apache Software License
+oslo.utils==3.22.0 # OSI Approved Apache Software License
+paramiko==2.1.1 # LGPL; OSI Approved GNU Library or Lesser General Public License (LGPL)
+pbr==1.10.0 # OSI Approved Apache Software License; Apache License, Version 2.0
+pep8==1.7.0 # Expat license; OSI Approved MIT License
+# version 14.5.0 for compatibility with trex traffic generator
+pika==0.10.0 # BSD; OSI Approved BSD License
+positional==1.1.1 # OSI Approved Apache Software License
+prettytable==0.7.2 # BSD (3 clause); OSI Approved BSD License
+pycrypto==2.6.1 # Public Domain
+pyflakes==1.0.0 # MIT; OSI Approved MIT License
+pyparsing==2.1.10 # MIT License; OSI Approved MIT License
+pyroute2==0.4.12 # dual license GPLv2+ and Apache v2; OSI Approved GNU General Public License v2 or later (GPLv2+); OSI Approved Apache Software License
+pyrsistent==0.11.12 # LICENSE.mit; OSI Approved MIT License
+python-cinderclient==1.11.0 # OSI Approved Apache Software License
+python-glanceclient==2.6.0 # OSI Approved Apache Software License
+python-heatclient==1.8.1 # OSI Approved Apache Software License
+python-keystoneclient==3.10.0 # OSI Approved Apache Software License
+python-mimeparse==1.6.0 # OSI Approved MIT License
+python-neutronclient==6.1.0 # OSI Approved Apache Software License
+python-novaclient==7.1.1 # OSI Approved Apache Software License
+python-openstackclient==3.8.1 # OSI Approved Apache Software License
+python-subunit==1.2.0 # OSI Approved Apache Software License; OSI Approved BSD License
+python-swiftclient==3.3.0 # OSI Approved Apache Software License
+pytz==2016.10 # MIT; OSI Approved MIT License
+pyzmq==14.5.0 # LGPL+BSD; OSI Approved GNU Library or Lesser General Public License (LGPL); OSI Approved BSD License
+requests==2.13.0 # Apache 2.0; OSI Approved Apache Software License
+requestsexceptions==1.1.3 # OSI Approved Apache Software License
+scp==0.10.2 # LGPL
+shade==1.17.0 # OSI Approved Apache Software License
+simplejson==3.10.0 # MIT License; OSI Approved MIT License; OSI Approved Academic Free License (AFL)
+six==1.10.0 # MIT; OSI Approved MIT License
+stevedore==1.20.0 # OSI Approved Apache Software License
+testrepository==0.0.20 # OSI Approved BSD License; OSI Approved Apache Software License
+testtools==2.2.0 # OSI Approved MIT License
+traceback2==1.4.0 # OSI Approved Python Software Foundation License
+unicodecsv==0.14.1 # BSD License; OSI Approved BSD License
+unittest2==1.1.0 # OSI Approved BSD License
+warlock==1.2.0 # OSI Approved Apache Software License
+wrapt==1.10.8 # BSD
diff --git a/samples/vnf_samples/nsut/acl/acl-tg-topology-3node.yaml b/samples/vnf_samples/nsut/acl/acl-tg-topology-3node.yaml
new file mode 100644
index 000000000..f8c01daff
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl-tg-topology-3node.yaml
@@ -0,0 +1,53 @@
+# Copyright (c) 2016 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__1
+ VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #VNF type
+ - member-vnf-index: '2'
+ vnfd-id-ref: vnf__1
+ VNF model: ../../vnf_descriptors/acl_vnf.yaml #VNF type
+ - member-vnf-index: '3'
+ vnfd-id-ref: tg__2
+ VNF model: ../../vnf_descriptors/udp_replay_vnf.yaml #VNF type
+
+ vld:
+ - id: private_1
+ name: tg__1 to vnf__1 link 1
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: tg__1
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: vnf__1
+
+ - id: public_1
+ name: vnf__1 to tg__2 link 2
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: vnf__1
+ - member-vnf-index-ref: '3'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: tg__2
diff --git a/samples/vnf_samples/nsut/acl/acl-tg-topology.yaml b/samples/vnf_samples/nsut/acl/acl-tg-topology.yaml
new file mode 100644
index 000000000..9bc3e8559
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl-tg-topology.yaml
@@ -0,0 +1,50 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nsd:nsd-catalog:
+ nsd:
+ - id: 3tg-topology
+ name: 3tg-topology
+ short-name: 3tg-topology
+ description: 3tg-topology
+ constituent-vnfd:
+ - member-vnf-index: '1'
+ vnfd-id-ref: tg__1
+ VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #VNF type
+ - member-vnf-index: '2'
+ vnfd-id-ref: vnf__1
+ VNF model: ../../vnf_descriptors/acl_vnf.yaml #VNF type
+
+ vld:
+ - id: private_1
+ name: tg__1 to vnf__1 link 1
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: tg__1
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: vnf__1
+
+ - id: public_1
+ name: vnf__1 to tg__1 link 2
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: vnf__1
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: tg__1
diff --git a/samples/vnf_samples/nsut/acl/acl.cfg b/samples/vnf_samples/nsut/acl/acl.cfg
new file mode 100644
index 000000000..fd3c51ee8
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl.cfg
@@ -0,0 +1,55 @@
+# 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.
+
+[PIPELINE0]
+type = MASTER
+core = 0
+[PIPELINE1]
+type = ARPICMP
+core = 1
+pktq_in = SWQ4
+pktq_out = TXQ0.0 TXQ1.0 TXQ2.0 TXQ3.0
+arp_route_tbl = (c0102814,fffff000,1,c0102814) (c0106414,fffff000,0,c0106414)
+nd_route_tbl = (0064:ff9b:0:0:0:0:9810:6414,120,0,0064:ff9b:0:0:0:0:9810:6414)
+pktq_in_prv = RXQ0.0
+prv_to_pub_map = (0,1)
+[PIPELINE2]
+type = TXRX
+core = 2
+pipeline_txrx_type = RXRX
+dest_if_offset = 176
+pktq_in = RXQ0.0 RXQ1.0 RXQ2.0 RXQ3.0
+pktq_out = SWQ0 SWQ1 SWQ2 SWQ3 SWQ4
+[PIPELINE3]
+type = LOADB
+core = 3
+pktq_in = SWQ0 SWQ1 SWQ2 SWQ3
+pktq_out = SWQ4 SWQ5 SWQ6 SWQ7 SWQ8 SWQ9 SWQ10 SWQ11
+outport_offset = 136; 8
+n_vnf_threads = 2
+[PIPELINE4]
+type = ACL
+core = 4
+pktq_in = SWQ2 SWQ3
+pktq_out = SWQ8 SWQ9
+traffic_type = 4
+pkt_type = ipv4
+n_flows = 2000000
+[PIPELINE5]
+type = TXRX
+core = 5
+pipeline_txrx_type = TXTX
+dest_if_offset = 176
+pktq_in = SWQ8 SWQ9 SWQ10 SWQ11 SWQ12 SWQ13
+pktq_out = TXQ0.0 TXQ1.0 TXQ0.1 TXQ1.1 TXQ0.2 TXQ1.2
diff --git a/samples/vnf_samples/nsut/acl/acl_1rule.yaml b/samples/vnf_samples/nsut/acl/acl_1rule.yaml
new file mode 100644
index 000000000..b184a29e2
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl_1rule.yaml
@@ -0,0 +1,47 @@
+# 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.
+
+access-list1:
+ acl:
+ access-list-entries:
+ - ace:
+ ace-oper-data:
+ match-counter: 0
+ actions: drop,count
+ matches:
+ destination-ipv4-network: 152.16.40.20/24
+ destination-port-range:
+ lower-port: 0
+ upper-port: 65535
+ source-ipv4-network: 0.0.0.0/0
+ source-port-range:
+ lower-port: 0
+ upper-port: 65535
+ rule-name: rule1588
+ - ace:
+ ace-oper-data:
+ match-counter: 0
+ actions: drop,count
+ matches:
+ destination-ipv4-network: 0.0.0.0/0
+ destination-port-range:
+ lower-port: 0
+ upper-port: 65535
+ source-ipv4-network: 152.16.100.20/24
+ source-port-range:
+ lower-port: 0
+ upper-port: 65535
+ rule-name: rule1589
+ acl-name: sample-ipv4-acl
+ acl-type: ipv4-acl
diff --git a/samples/vnf_samples/nsut/acl/acl_config/acl_config b/samples/vnf_samples/nsut/acl/acl_config/acl_config
new file mode 100644
index 000000000..52b6a5002
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl_config/acl_config
@@ -0,0 +1,61 @@
+; Copyright (c) 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.
+
+[PIPELINE0]
+type = MASTER
+core = s{socket}c0
+[PIPELINE1]
+type = ARPICMP
+core = s{socket}c1
+pktq_in = SWQ2
+pktq_out = SWQ7
+# debug output
+# ({port1_dst_ip},{port1_netmask},1,{port1_dst_ip}) ({port0_dst_ip},{port0_netmask},0,{port0_dst_ip})
+arp_route_tbl = ({port0_dst_ip_hex},{port0_netmask_hex},0,{port0_dst_ip_hex}) ({port1_dst_ip_hex},{port1_netmask_hex},1,{port1_dst_ip_hex})
+#ports_mac_list = port0_local_mac port1_local_mac
+ports_mac_list = {port0_local_mac} {port1_local_mac}
+pktq_in_prv = RXQ0.0 RXQ1.0
+prv_to_pub_map = (0,1)
+prv_que_handler = (0)
+
+[PIPELINE2]
+type = TXRX
+core = s{socket}c2
+pktq_in = RXQ0.0 RXQ1.0
+pktq_out = SWQ0 SWQ1 SWQ2
+pipeline_txrx_type = RXRX
+dest_if_offset=176
+[PIPELINE3]
+type = LOADB
+core = s{socket}c3
+pktq_in = SWQ0 SWQ1
+pktq_out = SWQ3 SWQ4
+outport_offset = 136
+phyport_offset = 204
+n_vnf_threads = 1
+prv_que_handler = (0)
+[PIPELINE4]
+type = ACL
+core = s{socket}c4
+pktq_in = SWQ3 SWQ4
+pktq_out = SWQ5 SWQ6
+n_flows = 1000000
+pkt_type = ipv4
+traffic_type = 4
+[PIPELINE5]
+type = TXRX
+core = s{socket}c5
+pktq_in = SWQ5 SWQ6 SWQ7
+pktq_out = TXQ0.0 TXQ1.0
+pipeline_txrx_type = TXTX
diff --git a/samples/vnf_samples/nsut/acl/acl_config/acl_script b/samples/vnf_samples/nsut/acl/acl_config/acl_script
new file mode 100644
index 000000000..4d7553609
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl_config/acl_script
@@ -0,0 +1,53 @@
+# Copyright (c) 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.
+
+link 0 down
+link 0 config {port0_local_ip} {port0_prefixlen}
+link 0 up
+link 1 down
+link 1 config {port1_local_ip} {port1_prefixlen}
+link 1 up
+
+p action add 0 accept
+p action add 0 fwd 0
+p action add 0 count
+
+p action add 1 accept
+p action add 1 fwd 1
+p action add 1 count
+
+#p acl add 1 0.0.0.0 0 0.0.0.0 0 0 65535 0 65535 0 0 0
+#p acl add 1 0.0.0.0 0 0.0.0.0 0 0 65535 0 65535 0 0 1
+
+# action rule matches dest port
+p acl add 1 {port1_local_network} {port1_prefix} 0.0.0.0 0 0 65535 0 65535 0 0 0
+p acl add 1 0.0.0.0 0 {port1_local_network} {port1_prefix} 0 65535 0 65535 0 0 1
+
+p acl add 1 {port0_local_network} {port0_prefix} 0.0.0.0 0 0 65535 0 65535 0 0 1
+p acl add 1 0.0.0.0 0 {port0_local_network} {port0_prefix} 0 65535 0 65535 0 0 0
+
+p acl add 1 {port0_local_network} {port0_prefix} {port1_local_network} {port1_prefix} 0 65535 0 65535 0 0 1
+p acl add 1 {port1_local_network} {port1_prefix} {port0_local_network} {port0_prefix} 0 65535 0 65535 0 0 0
+
+# gateway is the remote port
+p 1 arpadd 0 {port0_gateway} {port0_local_mac}
+p 1 arpadd 0 {port0_local_ip} {port0_local_mac}
+p 1 arpadd 0 {port0_dst_ip} {port0_dst_mac}
+p 1 arpadd 1 {port1_gateway} {port1_local_mac}
+p 1 arpadd 1 {port1_local_ip} {port1_local_mac}
+p 1 arpadd 1 {port1_dst_ip} {port1_dst_mac}
+
+p acl applyruleset
+
+#p acl dbg 1
diff --git a/samples/vnf_samples/nsut/acl/acl_rules.yaml b/samples/vnf_samples/nsut/acl/acl_rules.yaml
new file mode 100644
index 000000000..b184a29e2
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl_rules.yaml
@@ -0,0 +1,47 @@
+# 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.
+
+access-list1:
+ acl:
+ access-list-entries:
+ - ace:
+ ace-oper-data:
+ match-counter: 0
+ actions: drop,count
+ matches:
+ destination-ipv4-network: 152.16.40.20/24
+ destination-port-range:
+ lower-port: 0
+ upper-port: 65535
+ source-ipv4-network: 0.0.0.0/0
+ source-port-range:
+ lower-port: 0
+ upper-port: 65535
+ rule-name: rule1588
+ - ace:
+ ace-oper-data:
+ match-counter: 0
+ actions: drop,count
+ matches:
+ destination-ipv4-network: 0.0.0.0/0
+ destination-port-range:
+ lower-port: 0
+ upper-port: 65535
+ source-ipv4-network: 152.16.100.20/24
+ source-port-range:
+ lower-port: 0
+ upper-port: 65535
+ rule-name: rule1589
+ acl-name: sample-ipv4-acl
+ acl-type: ipv4-acl
diff --git a/samples/vnf_samples/nsut/acl/acl_vnf_topology_ixia.yaml b/samples/vnf_samples/nsut/acl/acl_vnf_topology_ixia.yaml
new file mode 100644
index 000000000..606d557e9
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl_vnf_topology_ixia.yaml
@@ -0,0 +1,50 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nsd:nsd-catalog:
+ nsd:
+ - id: VACL
+ name: VACL
+ short-name: VACL
+ description: scenario with VACL,L3fwd and VNF
+ constituent-vnfd:
+ - member-vnf-index: '1'
+ vnfd-id-ref: tg__1
+ VNF model: ../../vnf_descriptors/ixia_rfc2544_tpl.yaml
+ - member-vnf-index: '2'
+ vnfd-id-ref: vnf__1
+ VNF model: ../../vnf_descriptors/acl_vnf.yaml
+
+ vld:
+ - id: private_1
+ name: tg__1 to vnf__1 link 1
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: tg__1 #TREX
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: vnf__1 #VNF
+
+ - id: public_1
+ name: vnf__1 to tg__1 link 2
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: vnf__1 #L3fwd
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: tg__1 #VACL VNF
diff --git a/samples/vnf_samples/nsut/acl/acl_vnf_topology_ixload.yaml b/samples/vnf_samples/nsut/acl/acl_vnf_topology_ixload.yaml
new file mode 100644
index 000000000..2fc173aed
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl_vnf_topology_ixload.yaml
@@ -0,0 +1,50 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nsd:nsd-catalog:
+ nsd:
+ - id: VACL
+ name: VACL
+ short-name: VACL
+ description: scenario with HTTP and vACL VNF
+ constituent-vnfd:
+ - member-vnf-index: '1'
+ vnfd-id-ref: tg__1
+ VNF model: ../../vnf_descriptors/tg_ixload.yaml
+ - member-vnf-index: '2'
+ vnfd-id-ref: vnf__1
+ VNF model: ../../vnf_descriptors/acl_vnf.yaml
+
+ vld:
+ - id: private_1
+ name: tg__1 to vnf__1 link 1
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: tg__1 # HTTP Client
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: vnf__1 # VNF
+
+ - id: public_1
+ name: vnf__1 to tg__1 link 2
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: vnf__1 # HTTP Server
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: tg__1 # VACL VNF
diff --git a/samples/vnf_samples/nsut/acl/acl_worstcaserules.yaml b/samples/vnf_samples/nsut/acl/acl_worstcaserules.yaml
new file mode 100644
index 000000000..b184a29e2
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/acl_worstcaserules.yaml
@@ -0,0 +1,47 @@
+# 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.
+
+access-list1:
+ acl:
+ access-list-entries:
+ - ace:
+ ace-oper-data:
+ match-counter: 0
+ actions: drop,count
+ matches:
+ destination-ipv4-network: 152.16.40.20/24
+ destination-port-range:
+ lower-port: 0
+ upper-port: 65535
+ source-ipv4-network: 0.0.0.0/0
+ source-port-range:
+ lower-port: 0
+ upper-port: 65535
+ rule-name: rule1588
+ - ace:
+ ace-oper-data:
+ match-counter: 0
+ actions: drop,count
+ matches:
+ destination-ipv4-network: 0.0.0.0/0
+ destination-port-range:
+ lower-port: 0
+ upper-port: 65535
+ source-ipv4-network: 152.16.100.20/24
+ source-port-range:
+ lower-port: 0
+ upper-port: 65535
+ rule-name: rule1589
+ acl-name: sample-ipv4-acl
+ acl-type: ipv4-acl
diff --git a/samples/vnf_samples/nsut/acl/ixia_traffic.cfg b/samples/vnf_samples/nsut/acl/ixia_traffic.cfg
new file mode 100644
index 000000000..f749865c5
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/ixia_traffic.cfg
@@ -0,0 +1,51 @@
+{
+ "private_1": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": true,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public_1": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": true,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+}
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_http_ixload_1b_Requests-65000_Concurrency.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_http_ixload_1b_Requests-65000_Concurrency.yaml
new file mode 100644
index 000000000..cf2dbfc33
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_http_ixload_1b_Requests-65000_Concurrency.yaml
@@ -0,0 +1,38 @@
+# 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/http_tests/HTTP_1b-requests_65000_concurrency.yaml"
+ topology: acl_vnf_topology_ixload.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ options:
+ packetsize: 64
+ traffic_type: 4
+ vnf__1:
+ rules: acl_1rule.yaml
+ vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
+ runner:
+ type: Duration
+ duration: 10
+ ixia_profile: ../../traffic_profiles/acl/HTTP-vACL_IPv4_2Ports.rxf # Need vlan update
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml
new file mode 100644
index 000000000..477bd8fbf
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_ixia.yaml
@@ -0,0 +1,44 @@
+# 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/ixia_ipv4_latency.yaml"
+ topology: acl_vnf_topology_ixia.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ options:
+ packetsize: 64
+ traffic_type: 4
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ vnf__1:
+ rules: acl_1rule.yaml
+ vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
+ runner:
+ type: Iteration
+ iterations: 10
+ interval: 35
+ traffic_options:
+ flow: "../../traffic_profiles/ipv4_1flow_Packets.yaml"
+ imix: "../../traffic_profiles/imix_voice.yaml"
+ ixia_profile: ../../traffic_profiles/acl/acl_ipv4_profile_1flows.ixncfg
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml
new file mode 100644
index 000000000..695768194
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml
@@ -0,0 +1,42 @@
+# Copyright (c) 2016 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: acl-tg-topology.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ tc_options:
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ vnf_options:
+ acl:
+ rules: acl_1rule.yaml
+ cfg: acl_config
+ runner:
+ type: Duration
+ duration: 400
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex.yaml
new file mode 100644
index 000000000..8d7fe3cb2
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex.yaml
@@ -0,0 +1,43 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+schema: yardstick:task:0.1
+scenarios:
+- type: NSPerf
+ traffic_profile: ../../traffic_profiles/ipv4_throughput.yaml
+ topology: acl-tg-topology.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ options:
+ packetsize: 64
+ traffic_type: 4
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ vnf__1:
+ rules: acl_1rule.yaml
+ vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
+ runner:
+ type: Iteration
+ iterations: 10
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_corelated_traffic.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_corelated_traffic.yaml
new file mode 100644
index 000000000..6b21ba576
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_corelated_traffic.yaml
@@ -0,0 +1,45 @@
+# Copyright (c) 2016 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: acl-tg-topology-3node.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ tg__2: trafficgen_2.yardstick
+ options:
+ packetsize: 64
+ traffic_type: 4
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ corelated_traffic: true
+ vnf__1:
+ rules: acl_1rule.yaml
+ vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
+ runner:
+ type: Iteration
+ iterations: 10
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod_3node.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_scale_up.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_scale_up.yaml
new file mode 100644
index 000000000..df7a909a1
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_1rule_1flow_64B_trex_scale_up.yaml
@@ -0,0 +1,45 @@
+# 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:
+{% for worker_thread in [1, 2, 3 , 4, 5, 6] %}
+- type: NSPerf
+ traffic_profile: ../../traffic_profiles/ipv4_throughput.yaml
+ topology: acl-tg-topology.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ options:
+ packetsize: 64
+ traffic_type: 4
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ vnf__1:
+ rules: acl_1rule.yaml
+ vnf_config: {lb_config: 'HW', lb_count: 1, worker_config: '1C/1T', worker_threads: {{worker_thread}}}
+ runner:
+ type: Iteration
+ iterations: 10
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+{% endfor %}
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_worstcaserules_1flow_64B_packetsize.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_worstcaserules_1flow_64B_packetsize.yaml
new file mode 100644
index 000000000..96b3f687c
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_worstcaserules_1flow_64B_packetsize.yaml
@@ -0,0 +1,42 @@
+# Copyright (c) 2016 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: acl-tg-topology.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ tc_options:
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ vnf_options:
+ acl:
+ rules: acl_worstcaserules.yaml
+ cfg: acl_config
+ runner:
+ type: Duration
+ duration: 400
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_worstcaserules_1flow_64B_trex.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_worstcaserules_1flow_64B_trex.yaml
new file mode 100644
index 000000000..8d7fe3cb2
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_ipv4_worstcaserules_1flow_64B_trex.yaml
@@ -0,0 +1,43 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+schema: yardstick:task:0.1
+scenarios:
+- type: NSPerf
+ traffic_profile: ../../traffic_profiles/ipv4_throughput.yaml
+ topology: acl-tg-topology.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ options:
+ packetsize: 64
+ traffic_type: 4
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ vnf__1:
+ rules: acl_1rule.yaml
+ vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
+ runner:
+ type: Iteration
+ iterations: 10
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_with_latency_ipv4_1rule_1flow_64B_trex.yaml b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_with_latency_ipv4_1rule_1flow_64B_trex.yaml
new file mode 100644
index 000000000..ab688a23f
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_baremetal_rfc2544_with_latency_ipv4_1rule_1flow_64B_trex.yaml
@@ -0,0 +1,45 @@
+# 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: acl-tg-topology.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ tc_options:
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ latency: true
+ vnf_options:
+ acl:
+ rules: acl_1rule.yaml
+ cfg: acl_config
+ options:
+ packetsize: 64
+ runner:
+ type: Iteration
+ iterations: 28
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+context:
+ type: Node
+ name: yardstick
+ nfvi_type: baremetal
+ file: /etc/yardstick/nodes/pod.yaml
diff --git a/samples/vnf_samples/nsut/acl/tc_heat_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml b/samples/vnf_samples/nsut/acl/tc_heat_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml
new file mode 100644
index 000000000..10eba4c3c
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_heat_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml
@@ -0,0 +1,84 @@
+# Copyright (c) 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: acl-tg-topology.yaml
+ nodes:
+ tg__1: trafficgen_1.yardstick
+ vnf__1: vnf.yardstick
+ options:
+ packetsize: 64
+ traffic_type: 4
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ vnf__1:
+ rules: acl_1rule.yaml
+ vnf_config: {lb_config: 'SW', lb_count: 1, worker_config: '1C/1T', worker_threads: 1}
+ runner:
+ type: Iteration
+ iterations: 10
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+context:
+ # put node context first, so we don't HEAT deploy if node has errors
+ name: yardstick
+ flavor: yardstick-dpdk-flavor
+# flavor:
+# name: yardstick-dpdk-flavor
+# vcpus: 10
+# ram: 20480
+# disk: 4
+# extra_specs:
+# hw:cpu_sockets: 1
+# hw:cpu_cores: 10
+# hw:cpu_threads: 1
+# # hw:mem_page_size: large
+ user: ubuntu
+ placement_groups:
+ pgrp1:
+ policy: "availability"
+ servers:
+ vnf:
+ floating_ip: true
+ placement: "pgrp1"
+ image: yardstick-vnfs
+ trafficgen_1:
+ floating_ip: true
+ placement: "pgrp1"
+ image: yardstick-trex
+ networks:
+ mgmt:
+ cidr: '10.0.1.0/24'
+ external_network: "yardstick-public"
+ xe0:
+ cidr: '10.0.2.0/24'
+ vld_id: public
+# port_security_enabled: False
+ allowed_address_pairs:
+ - ip_address:
+ '0.0.0.0/0'
+ xe1:
+ cidr: '10.0.3.0/24'
+ vld_id: private
+# port_security_enabled: False
+ allowed_address_pairs:
+ - ip_address:
+ '0.0.0.0/0'
+
diff --git a/samples/vnf_samples/nsut/acl/tc_heat_trex_external_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml b/samples/vnf_samples/nsut/acl/tc_heat_trex_external_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml
new file mode 100644
index 000000000..3344a1de1
--- /dev/null
+++ b/samples/vnf_samples/nsut/acl/tc_heat_trex_external_rfc2544_ipv4_1rule_1flow_64B_packetsize.yaml
@@ -0,0 +1,74 @@
+# Copyright (c) 2016 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: acl-tg-topology.yaml
+ nodes:
+ tg__1: trafficgen_1.baremetal
+ vnf__1: vnf.yardstick
+ tc_options:
+ rfc2544:
+ allowed_drop_rate: 0.0001 - 0.0001
+ vnf_options:
+ acl:
+ rules: acl_1rule.yaml
+ cfg: acl_config
+ runner:
+ type: Duration
+ duration: 400
+ interval: 35
+ traffic_options:
+ flow: ../../traffic_profiles/ipv4_1flow_Packets.yaml
+ imix: ../../traffic_profiles/imix_voice.yaml
+contexts:
+ # put node context first, so we don't HEAT deploy if node has errors
+ - name: baremetal
+ type: Node
+ file: trex-baremetal.yml
+ - name: yardstick
+ image: yardstick-acl
+ flavor: yardstick-flavor
+# flavor:
+# # name: yardstick-dpdk-flavor
+# vcpus: 6
+# ram: 20480
+# disk: 4
+# extra_specs:
+# hw:cpu_sockets: 1
+# hw:cpu_cores: 6
+# hw:cpu_threads: 1
+# # hw:mem_page_size: large
+ user: ubuntu
+ placement_groups:
+ pgrp1:
+ policy: "availability"
+ servers:
+ vnf:
+ floating_ip: true
+ placement: "pgrp1"
+ networks:
+ mgmt:
+ cidr: '10.0.1.0/24'
+ external_network: "yardstick-public"
+ xe0:
+ cidr: '10.0.2.0/24'
+ vld_id: public
+ xe1:
+ cidr: '10.0.3.0/24'
+ vld_id: private
+
diff --git a/samples/vnf_samples/traffic_profiles/acl/HTTP-vACL_IPv4_2Ports.rxf b/samples/vnf_samples/traffic_profiles/acl/HTTP-vACL_IPv4_2Ports.rxf
new file mode 100644
index 000000000..9934797f6
--- /dev/null
+++ b/samples/vnf_samples/traffic_profiles/acl/HTTP-vACL_IPv4_2Ports.rxf
@@ -0,0 +1,1335 @@
+<?xml version="1.0" ?>
+<root ver="[21, [1, [0, [0]]]]" type="ixRepository">
+ <_smSessionXml ver="[0, [1, [0, [0]]]]" type="ixSMSessionXML">
+ <xml type="str">&lt;rpf&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.SMSession type=&quot;Ixia.Aptixia.StackManager.SMSession&quot; objectid=&quot;a1e46af9-15aa-4923-8410-c81d0cdf0836&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;doWaitLinkUp type=&quot;Bool&quot;&gt;0&lt;/doWaitLinkUp&gt;&#13;&#10; &lt;doGratArp type=&quot;Bool&quot;&gt;0&lt;/doGratArp&gt;&#13;&#10; &lt;subscribeToGratArpNotifications type=&quot;Bool&quot;&gt;0&lt;/subscribeToGratArpNotifications&gt;&#13;&#10; &lt;doInterfaceCheck type=&quot;Bool&quot;&gt;0&lt;/doInterfaceCheck&gt;&#13;&#10; &lt;rebootPortsBeforeConfigure type=&quot;Bool&quot;&gt;0&lt;/rebootPortsBeforeConfigure&gt;&#13;&#10; &lt;testDuration type=&quot;Int&quot;&gt;10000&lt;/testDuration&gt;&#13;&#10; &lt;checkLinkState type=&quot;Bool&quot;&gt;0&lt;/checkLinkState&gt;&#13;&#10; &lt;portGroupList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;865be042-32d5-426a-9e75-0908c943801f&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;client network&lt;/name&gt;&#13;&#10; &lt;category type=&quot;String&quot; /&gt;&#13;&#10; &lt;stack type=&quot;Ixia.Aptixia.StackManager.L1EthernetPlugin&quot; objectid=&quot;1dcd6e1b-17cd-45a1-875a-cbea40d3468c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;autoNegotiate type=&quot;Bool&quot;&gt;1&lt;/autoNegotiate&gt;&#13;&#10; &lt;speed type=&quot;String&quot;&gt;k100FD&lt;/speed&gt;&#13;&#10; &lt;advertise10Half type=&quot;Bool&quot;&gt;1&lt;/advertise10Half&gt;&#13;&#10; &lt;advertise10Full type=&quot;Bool&quot;&gt;1&lt;/advertise10Full&gt;&#13;&#10; &lt;advertise100Half type=&quot;Bool&quot;&gt;1&lt;/advertise100Half&gt;&#13;&#10; &lt;advertise100Full type=&quot;Bool&quot;&gt;1&lt;/advertise100Full&gt;&#13;&#10; &lt;advertise1000Full type=&quot;Bool&quot;&gt;1&lt;/advertise1000Full&gt;&#13;&#10; &lt;cardDualPhy type=&quot;Ixia.Aptixia.StackManager.DualPhyPlugin&quot; objectid=&quot;b458c333-b4d4-48ef-bd38-3b456f72f8c8&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;medium type=&quot;String&quot;&gt;auto&lt;/medium&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardDualPhy&gt;&#13;&#10; &lt;cardElm type=&quot;Ixia.Aptixia.StackManager.EthernetELMPlugin&quot; objectid=&quot;28c0383a-76a7-4750-8162-2ad946ddac97&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;negotiateMasterSlave type=&quot;Bool&quot;&gt;1&lt;/negotiateMasterSlave&gt;&#13;&#10; &lt;negotiationType type=&quot;String&quot;&gt;master&lt;/negotiationType&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardElm&gt;&#13;&#10; &lt;enableFlowControl type=&quot;Bool&quot;&gt;0&lt;/enableFlowControl&gt;&#13;&#10; &lt;directedAddress type=&quot;String&quot;&gt;01:80:C2:00:00:01&lt;/directedAddress&gt;&#13;&#10; &lt;dataCenter type=&quot;Ixia.Aptixia.StackManager.DataCenterSettings&quot; objectid=&quot;b9a0be2e-3880-4100-9e29-9b474f9301f4&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;dcSupported type=&quot;Bool&quot;&gt;1&lt;/dcSupported&gt;&#13;&#10; &lt;dcEnabled type=&quot;Bool&quot;&gt;0&lt;/dcEnabled&gt;&#13;&#10; &lt;dcFlowControl type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType&quot;&gt;0&lt;/dcFlowControl&gt;&#13;&#10; &lt;dcMode type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode&quot;&gt;2&lt;/dcMode&gt;&#13;&#10; &lt;dcPfcMapping type=&quot;IntList&quot; /&gt;&#13;&#10; &lt;dcPfcPauseEnable type=&quot;Bool&quot;&gt;0&lt;/dcPfcPauseEnable&gt;&#13;&#10; &lt;dcPfcPauseDelay type=&quot;Int&quot;&gt;1&lt;/dcPfcPauseDelay&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/dataCenter&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.L2EthernetPlugin type=&quot;Ixia.Aptixia.StackManager.L2EthernetPlugin&quot; objectid=&quot;e0232591-010e-492c-8a28-75e436f4adb2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;macRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;3011c8a8-a9fd-4b76-a27d-91948113ed4f&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC-R1&lt;/name&gt;&#13;&#10; &lt;mac type=&quot;String&quot;&gt;00:98:10:64:14:00&lt;/mac&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;00:00:00:00:00:01&lt;/incrementBy&gt;&#13;&#10; &lt;mtu type=&quot;Int&quot;&gt;1500&lt;/mtu&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;adb27552-7165-46a3-bc9e-04914adf40ac&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VLAN-R1&lt;/name&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;firstId type=&quot;Int&quot;&gt;1&lt;/firstId&gt;&#13;&#10; &lt;incrementStep type=&quot;Int&quot;&gt;100&lt;/incrementStep&gt;&#13;&#10; &lt;increment type=&quot;Int&quot;&gt;1&lt;/increment&gt;&#13;&#10; &lt;uniqueCount type=&quot;Int&quot;&gt;4094&lt;/uniqueCount&gt;&#13;&#10; &lt;priority type=&quot;Int&quot;&gt;0&lt;/priority&gt;&#13;&#10; &lt;tpid type=&quot;String&quot;&gt;0x8100&lt;/tpid&gt;&#13;&#10; &lt;innerEnable type=&quot;Bool&quot;&gt;0&lt;/innerEnable&gt;&#13;&#10; &lt;innerFirstId type=&quot;Int&quot;&gt;1&lt;/innerFirstId&gt;&#13;&#10; &lt;innerIncrementStep type=&quot;Int&quot;&gt;1&lt;/innerIncrementStep&gt;&#13;&#10; &lt;innerIncrement type=&quot;Int&quot;&gt;1&lt;/innerIncrement&gt;&#13;&#10; &lt;innerUniqueCount type=&quot;Int&quot;&gt;4094&lt;/innerUniqueCount&gt;&#13;&#10; &lt;innerPriority type=&quot;Int&quot;&gt;0&lt;/innerPriority&gt;&#13;&#10; &lt;idIncrMode type=&quot;Int&quot;&gt;1&lt;/idIncrMode&gt;&#13;&#10; &lt;innerTpid type=&quot;String&quot;&gt;0x8100&lt;/innerTpid&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/vlanRange&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacRange&gt;&#13;&#10; &lt;/macRangeList&gt;&#13;&#10; &lt;vlanRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.VlanIdRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;adb27552-7165-46a3-bc9e-04914adf40ac&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/vlanRangeList&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Plugin type=&quot;Ixia.Aptixia.StackManager.IpV4V6Plugin&quot; objectid=&quot;a916ae0f-0731-405d-ad19-eaade6c515f1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;a3559674-8d95-4020-90b3-b42eacaef105&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-R1&lt;/name&gt;&#13;&#10; &lt;ipType type=&quot;String&quot;&gt;IPv4&lt;/ipType&gt;&#13;&#10; &lt;ipAddress type=&quot;String&quot;&gt;152.16.100.20&lt;/ipAddress&gt;&#13;&#10; &lt;prefix type=&quot;Int&quot;&gt;24&lt;/prefix&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;0.0.0.1&lt;/incrementBy&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;autoCountEnabled type=&quot;Bool&quot;&gt;0&lt;/autoCountEnabled&gt;&#13;&#10; &lt;gatewayAddress type=&quot;String&quot;&gt;152.16.100.10&lt;/gatewayAddress&gt;&#13;&#10; &lt;gatewayIncrement type=&quot;String&quot;&gt;0.0.0.0&lt;/gatewayIncrement&gt;&#13;&#10; &lt;gatewayIncrementMode type=&quot;String&quot;&gt;perSubnet&lt;/gatewayIncrementMode&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;generateStatistics type=&quot;Bool&quot;&gt;0&lt;/generateStatistics&gt;&#13;&#10; &lt;mss type=&quot;Int&quot;&gt;1460&lt;/mss&gt;&#13;&#10; &lt;randomizeAddress type=&quot;Bool&quot;&gt;0&lt;/randomizeAddress&gt;&#13;&#10; &lt;randomizeSeed type=&quot;Int&quot;&gt;2596329041&lt;/randomizeSeed&gt;&#13;&#10; &lt;autoMacGeneration type=&quot;Bool&quot;&gt;1&lt;/autoMacGeneration&gt;&#13;&#10; &lt;macRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;3011c8a8-a9fd-4b76-a27d-91948113ed4f&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;adb27552-7165-46a3-bc9e-04914adf40ac&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;atmRange type=&quot;Ixia.Aptixia.StackManager.AtmRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;pvcRange type=&quot;Ixia.Aptixia.StackManager.PvcRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;autoIpTypeEnabled type=&quot;Bool&quot;&gt;0&lt;/autoIpTypeEnabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Range&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;rangeGroups type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.RangeGroup type=&quot;Ixia.Aptixia.StackManager.RangeGroup&quot; objectid=&quot;aa33a76b-9c7f-48d9-a537-8d6eeec03662&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DistGroup1&lt;/name&gt;&#13;&#10; &lt;distribType type=&quot;Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType&quot;&gt;0&lt;/distribType&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;a3559674-8d95-4020-90b3-b42eacaef105&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.RangeGroup&gt;&#13;&#10; &lt;/rangeGroups&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Plugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC/VLAN-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.L2EthernetPlugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Ethernet-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/stack&gt;&#13;&#10; &lt;globalPluginList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type=&quot;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&quot; objectid=&quot;9c6c8594-548e-4ea5-a478-0bfb6252c1ce&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;teardownInterfaceWithUser type=&quot;Bool&quot;&gt;0&lt;/teardownInterfaceWithUser&gt;&#13;&#10; &lt;interfaceBehavior type=&quot;Int&quot;&gt;0&lt;/interfaceBehavior&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Settings-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.DnsPlugin type=&quot;Ixia.Aptixia.StackManager.DnsPlugin&quot; objectid=&quot;693c7b7b-327b-4d59-b187-57d7600308e3&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;domain type=&quot;String&quot; /&gt;&#13;&#10; &lt;timeout type=&quot;Int&quot;&gt;30000&lt;/timeout&gt;&#13;&#10; &lt;nameServerList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;searchList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;hostList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DNS-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.DnsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.FilterPlugin type=&quot;Ixia.Aptixia.StackManager.FilterPlugin&quot; objectid=&quot;0f6ebdb4-7909-447a-b80a-e132dae33a9b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;auto type=&quot;Bool&quot;&gt;1&lt;/auto&gt;&#13;&#10; &lt;all type=&quot;Bool&quot;&gt;0&lt;/all&gt;&#13;&#10; &lt;pppoecontrol type=&quot;Bool&quot;&gt;0&lt;/pppoecontrol&gt;&#13;&#10; &lt;pppoenetwork type=&quot;Bool&quot;&gt;0&lt;/pppoenetwork&gt;&#13;&#10; &lt;isis type=&quot;Bool&quot;&gt;0&lt;/isis&gt;&#13;&#10; &lt;ip type=&quot;String&quot; /&gt;&#13;&#10; &lt;tcp type=&quot;String&quot; /&gt;&#13;&#10; &lt;udp type=&quot;String&quot; /&gt;&#13;&#10; &lt;mac type=&quot;String&quot; /&gt;&#13;&#10; &lt;icmp type=&quot;String&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Filter-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.FilterPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.TCPPlugin type=&quot;Ixia.Aptixia.StackManager.TCPPlugin&quot; objectid=&quot;7a893f25-0ac6-41c7-ab5a-511c2068582a&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;bestPerfSettings type=&quot;Bool&quot;&gt;0&lt;/bestPerfSettings&gt;&#13;&#10; &lt;accept_ra_all type=&quot;Bool&quot;&gt;0&lt;/accept_ra_all&gt;&#13;&#10; &lt;tcp_abort_on_overflow type=&quot;Bool&quot;&gt;0&lt;/tcp_abort_on_overflow&gt;&#13;&#10; &lt;tcp_adv_win_scale type=&quot;Int&quot;&gt;2&lt;/tcp_adv_win_scale&gt;&#13;&#10; &lt;tcp_app_win type=&quot;Int&quot;&gt;31&lt;/tcp_app_win&gt;&#13;&#10; &lt;tcp_bic type=&quot;Int&quot;&gt;0&lt;/tcp_bic&gt;&#13;&#10; &lt;tcp_bic_fast_convergence type=&quot;Int&quot;&gt;1&lt;/tcp_bic_fast_convergence&gt;&#13;&#10; &lt;tcp_bic_low_window type=&quot;Int&quot;&gt;14&lt;/tcp_bic_low_window&gt;&#13;&#10; &lt;tcp_dsack type=&quot;Bool&quot;&gt;1&lt;/tcp_dsack&gt;&#13;&#10; &lt;tcp_ecn type=&quot;Bool&quot;&gt;0&lt;/tcp_ecn&gt;&#13;&#10; &lt;tcp_fack type=&quot;Bool&quot;&gt;1&lt;/tcp_fack&gt;&#13;&#10; &lt;tcp_fin_timeout type=&quot;Int&quot;&gt;60&lt;/tcp_fin_timeout&gt;&#13;&#10; &lt;tcp_frto type=&quot;Int&quot;&gt;0&lt;/tcp_frto&gt;&#13;&#10; &lt;tcp_keepalive_intvl type=&quot;Int&quot;&gt;7200&lt;/tcp_keepalive_intvl&gt;&#13;&#10; &lt;tcp_keepalive_probes type=&quot;Int&quot;&gt;75&lt;/tcp_keepalive_probes&gt;&#13;&#10; &lt;tcp_keepalive_time type=&quot;Int&quot;&gt;9&lt;/tcp_keepalive_time&gt;&#13;&#10; &lt;tcp_low_latency type=&quot;Int&quot;&gt;0&lt;/tcp_low_latency&gt;&#13;&#10; &lt;tcp_max_orphans type=&quot;Int&quot;&gt;8192&lt;/tcp_max_orphans&gt;&#13;&#10; &lt;tcp_max_syn_backlog type=&quot;Int&quot;&gt;1024&lt;/tcp_max_syn_backlog&gt;&#13;&#10; &lt;tcp_max_tw_buckets type=&quot;Int&quot;&gt;180000&lt;/tcp_max_tw_buckets&gt;&#13;&#10; &lt;tcp_mem_low type=&quot;Int&quot;&gt;24576&lt;/tcp_mem_low&gt;&#13;&#10; &lt;tcp_mem_pressure type=&quot;Int&quot;&gt;32768&lt;/tcp_mem_pressure&gt;&#13;&#10; &lt;tcp_mem_high type=&quot;Int&quot;&gt;49152&lt;/tcp_mem_high&gt;&#13;&#10; &lt;tcp_moderate_rcvbuf type=&quot;Int&quot;&gt;0&lt;/tcp_moderate_rcvbuf&gt;&#13;&#10; &lt;tcp_no_metrics_save type=&quot;Bool&quot;&gt;0&lt;/tcp_no_metrics_save&gt;&#13;&#10; &lt;tcp_orphan_retries type=&quot;Int&quot;&gt;0&lt;/tcp_orphan_retries&gt;&#13;&#10; &lt;tcp_reordering type=&quot;Int&quot;&gt;3&lt;/tcp_reordering&gt;&#13;&#10; &lt;tcp_retrans_collapse type=&quot;Bool&quot;&gt;1&lt;/tcp_retrans_collapse&gt;&#13;&#10; &lt;tcp_retries1 type=&quot;Int&quot;&gt;3&lt;/tcp_retries1&gt;&#13;&#10; &lt;tcp_retries2 type=&quot;Int&quot;&gt;15&lt;/tcp_retries2&gt;&#13;&#10; &lt;tcp_rfc1337 type=&quot;Bool&quot;&gt;0&lt;/tcp_rfc1337&gt;&#13;&#10; &lt;tcp_rmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_rmem_min&gt;&#13;&#10; &lt;tcp_rmem_default type=&quot;Int&quot;&gt;1024&lt;/tcp_rmem_default&gt;&#13;&#10; &lt;tcp_rmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_rmem_max&gt;&#13;&#10; &lt;tcp_sack type=&quot;Bool&quot;&gt;1&lt;/tcp_sack&gt;&#13;&#10; &lt;tcp_stdurg type=&quot;Bool&quot;&gt;0&lt;/tcp_stdurg&gt;&#13;&#10; &lt;tcp_synack_retries type=&quot;Int&quot;&gt;5&lt;/tcp_synack_retries&gt;&#13;&#10; &lt;tcp_syn_retries type=&quot;Int&quot;&gt;5&lt;/tcp_syn_retries&gt;&#13;&#10; &lt;tcp_timestamps type=&quot;Bool&quot;&gt;1&lt;/tcp_timestamps&gt;&#13;&#10; &lt;tcp_tw_recycle type=&quot;Bool&quot;&gt;1&lt;/tcp_tw_recycle&gt;&#13;&#10; &lt;tcp_tw_reuse type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_reuse&gt;&#13;&#10; &lt;tcp_vegas_alpha type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_alpha&gt;&#13;&#10; &lt;tcp_vegas_beta type=&quot;Int&quot;&gt;6&lt;/tcp_vegas_beta&gt;&#13;&#10; &lt;tcp_vegas_cong_avoid type=&quot;Int&quot;&gt;0&lt;/tcp_vegas_cong_avoid&gt;&#13;&#10; &lt;tcp_vegas_gamma type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_gamma&gt;&#13;&#10; &lt;tcp_westwood type=&quot;Int&quot;&gt;0&lt;/tcp_westwood&gt;&#13;&#10; &lt;tcp_window_scaling type=&quot;Bool&quot;&gt;0&lt;/tcp_window_scaling&gt;&#13;&#10; &lt;ip_no_pmtu_disc type=&quot;Bool&quot;&gt;1&lt;/ip_no_pmtu_disc&gt;&#13;&#10; &lt;tcp_wmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_wmem_min&gt;&#13;&#10; &lt;tcp_wmem_default type=&quot;Int&quot;&gt;1024&lt;/tcp_wmem_default&gt;&#13;&#10; &lt;tcp_wmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_wmem_max&gt;&#13;&#10; &lt;tcp_ipfrag_time type=&quot;Int&quot;&gt;30&lt;/tcp_ipfrag_time&gt;&#13;&#10; &lt;tcp_port_min type=&quot;Int&quot;&gt;1024&lt;/tcp_port_min&gt;&#13;&#10; &lt;tcp_port_max type=&quot;Int&quot;&gt;65535&lt;/tcp_port_max&gt;&#13;&#10; &lt;tcp_rto_min type=&quot;Int&quot;&gt;1000&lt;/tcp_rto_min&gt;&#13;&#10; &lt;tcp_rto_max type=&quot;Int&quot;&gt;120000&lt;/tcp_rto_max&gt;&#13;&#10; &lt;tcp_tw_rfc1323_strict type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_rfc1323_strict&gt;&#13;&#10; &lt;udp_port_randomization type=&quot;Bool&quot;&gt;0&lt;/udp_port_randomization&gt;&#13;&#10; &lt;disable_min_max_buffer_size type=&quot;Bool&quot;&gt;1&lt;/disable_min_max_buffer_size&gt;&#13;&#10; &lt;llm_hdr_gap type=&quot;Int&quot;&gt;8&lt;/llm_hdr_gap&gt;&#13;&#10; &lt;llm_hdr_gap_ns type=&quot;Int&quot;&gt;10&lt;/llm_hdr_gap_ns&gt;&#13;&#10; &lt;inter_packet_granular_delay type=&quot;Double&quot;&gt;0&lt;/inter_packet_granular_delay&gt;&#13;&#10; &lt;delayed_acks type=&quot;Bool&quot;&gt;1&lt;/delayed_acks&gt;&#13;&#10; &lt;accept_ra_default type=&quot;Bool&quot;&gt;0&lt;/accept_ra_default&gt;&#13;&#10; &lt;rps_needed type=&quot;Bool&quot;&gt;0&lt;/rps_needed&gt;&#13;&#10; &lt;delayed_acks_segments type=&quot;Int&quot;&gt;0&lt;/delayed_acks_segments&gt;&#13;&#10; &lt;delayed_acks_timeout type=&quot;Int&quot;&gt;0&lt;/delayed_acks_timeout&gt;&#13;&#10; &lt;tcp_large_icwnd type=&quot;Int&quot;&gt;0&lt;/tcp_large_icwnd&gt;&#13;&#10; &lt;tcp_mgmt_rmem type=&quot;Int&quot;&gt;87380&lt;/tcp_mgmt_rmem&gt;&#13;&#10; &lt;tcp_mgmt_wmem type=&quot;Int&quot;&gt;32768&lt;/tcp_mgmt_wmem&gt;&#13;&#10; &lt;adjust_tcp_buffers type=&quot;Bool&quot;&gt;1&lt;/adjust_tcp_buffers&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;TCP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.TCPPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.GratArpPlugin type=&quot;Ixia.Aptixia.StackManager.GratArpPlugin&quot; objectid=&quot;fc54eec4-41ef-4b6c-9415-bf639013b52d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;forwardGratArp type=&quot;Bool&quot;&gt;0&lt;/forwardGratArp&gt;&#13;&#10; &lt;rateControlEnabled type=&quot;Bool&quot;&gt;0&lt;/rateControlEnabled&gt;&#13;&#10; &lt;maxFramesPerSecond type=&quot;Int&quot;&gt;0&lt;/maxFramesPerSecond&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;GratARP-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.GratArpPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingPlugin type=&quot;Ixia.Aptixia.StackManager.MeshingPlugin&quot; objectid=&quot;b0ccbeae-9db2-4416-bbed-80dcb2a7a9ed&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;trafficMaps type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingTrafficMap type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMap&quot; objectid=&quot;ea086372-6f3e-4867-932d-bfa5aff92921&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;newClientActivity1!HTTP server_newServerActivity1&lt;/name&gt;&#13;&#10; &lt;configMapFilename type=&quot;String&quot;&gt;newClientActivity1Script.configmap&lt;/configMapFilename&gt;&#13;&#10; &lt;sourceActivityId type=&quot;Int&quot;&gt;0&lt;/sourceActivityId&gt;&#13;&#10; &lt;ipPreference type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eIpPreference&quot;&gt;2&lt;/ipPreference&gt;&#13;&#10; &lt;portRangesString type=&quot;String&quot; /&gt;&#13;&#10; &lt;meshingType type=&quot;Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eMeshingType&quot;&gt;2&lt;/meshingType&gt;&#13;&#10; &lt;destinationActivityId type=&quot;Int&quot;&gt;0&lt;/destinationActivityId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingTrafficMap&gt;&#13;&#10; &lt;/trafficMaps&gt;&#13;&#10; &lt;activityRangeMapInfoList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Meshing-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingPlugin&gt;&#13;&#10; &lt;/globalPluginList&gt;&#13;&#10; &lt;portList type=&quot;StringList&quot;&gt;&#13;&#10; &lt;String&gt;10.223.166.127;2;5&lt;/String&gt;&#13;&#10; &lt;/portList&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecPortGroupData type=&quot;Ixia.Aptixia.StackManager.IPSecPortGroupData&quot; objectid=&quot;df783f7c-615e-47c1-b7f0-1174985ea22e&quot; version=&quot;8.1.7&quot;&gt;&#13;&#10; &lt;role type=&quot;String&quot;&gt;Initiator&lt;/role&gt;&#13;&#10; &lt;associates type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;overrideGlobalOptions type=&quot;Bool&quot;&gt;0&lt;/overrideGlobalOptions&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;enableESPPerStreamStats type=&quot;Bool&quot;&gt;0&lt;/enableESPPerStreamStats&gt;&#13;&#10; &lt;enableESPReplayStats type=&quot;Bool&quot;&gt;0&lt;/enableESPReplayStats&gt;&#13;&#10; &lt;activities type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;pcpuLogLevel type=&quot;String&quot;&gt;0&lt;/pcpuLogLevel&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecPortGroupData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;virtualMode type=&quot;Bool&quot;&gt;0&lt;/virtualMode&gt;&#13;&#10; &lt;allowedVirtualModeTypes type=&quot;StringList&quot; /&gt;&#13;&#10; &lt;doOwnership type=&quot;Bool&quot;&gt;0&lt;/doOwnership&gt;&#13;&#10; &lt;branchToNicMap type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;cpuAggregation type=&quot;Bool&quot;&gt;0&lt;/cpuAggregation&gt;&#13;&#10; &lt;activePort type=&quot;String&quot; /&gt;&#13;&#10; &lt;networkLayersManager type=&quot;Ixia.Aptixia.StackManager.NetworkLayersManager&quot; objectid=&quot;3d3cf9ef-8aab-4388-9252-4baea80122d3&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.PortGroup&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;c4ecfc60-64ac-4dc2-9410-e0f58d84f229&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;server network&lt;/name&gt;&#13;&#10; &lt;category type=&quot;String&quot; /&gt;&#13;&#10; &lt;stack type=&quot;Ixia.Aptixia.StackManager.L1EthernetPlugin&quot; objectid=&quot;1bd9f1bc-9959-464e-b1e8-ddb0bb4d0181&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;autoNegotiate type=&quot;Bool&quot;&gt;1&lt;/autoNegotiate&gt;&#13;&#10; &lt;speed type=&quot;String&quot;&gt;k100FD&lt;/speed&gt;&#13;&#10; &lt;advertise10Half type=&quot;Bool&quot;&gt;1&lt;/advertise10Half&gt;&#13;&#10; &lt;advertise10Full type=&quot;Bool&quot;&gt;1&lt;/advertise10Full&gt;&#13;&#10; &lt;advertise100Half type=&quot;Bool&quot;&gt;1&lt;/advertise100Half&gt;&#13;&#10; &lt;advertise100Full type=&quot;Bool&quot;&gt;1&lt;/advertise100Full&gt;&#13;&#10; &lt;advertise1000Full type=&quot;Bool&quot;&gt;1&lt;/advertise1000Full&gt;&#13;&#10; &lt;cardDualPhy type=&quot;Ixia.Aptixia.StackManager.DualPhyPlugin&quot; objectid=&quot;4fe8412b-7d4c-4ebe-a0d4-480a4401b3d0&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;medium type=&quot;String&quot;&gt;auto&lt;/medium&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardDualPhy&gt;&#13;&#10; &lt;cardElm type=&quot;Ixia.Aptixia.StackManager.EthernetELMPlugin&quot; objectid=&quot;4dfec118-30e8-4494-b7c7-e28518e7848a&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;negotiateMasterSlave type=&quot;Bool&quot;&gt;1&lt;/negotiateMasterSlave&gt;&#13;&#10; &lt;negotiationType type=&quot;String&quot;&gt;master&lt;/negotiationType&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/cardElm&gt;&#13;&#10; &lt;enableFlowControl type=&quot;Bool&quot;&gt;0&lt;/enableFlowControl&gt;&#13;&#10; &lt;directedAddress type=&quot;String&quot;&gt;01:80:C2:00:00:01&lt;/directedAddress&gt;&#13;&#10; &lt;dataCenter type=&quot;Ixia.Aptixia.StackManager.DataCenterSettings&quot; objectid=&quot;123fecc5-cb5e-43e9-92a1-b053dc56d0f3&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;dcSupported type=&quot;Bool&quot;&gt;1&lt;/dcSupported&gt;&#13;&#10; &lt;dcEnabled type=&quot;Bool&quot;&gt;0&lt;/dcEnabled&gt;&#13;&#10; &lt;dcFlowControl type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType&quot;&gt;0&lt;/dcFlowControl&gt;&#13;&#10; &lt;dcMode type=&quot;Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode&quot;&gt;2&lt;/dcMode&gt;&#13;&#10; &lt;dcPfcMapping type=&quot;IntList&quot; /&gt;&#13;&#10; &lt;dcPfcPauseEnable type=&quot;Bool&quot;&gt;0&lt;/dcPfcPauseEnable&gt;&#13;&#10; &lt;dcPfcPauseDelay type=&quot;Int&quot;&gt;1&lt;/dcPfcPauseDelay&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;4&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/dataCenter&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.L2EthernetPlugin type=&quot;Ixia.Aptixia.StackManager.L2EthernetPlugin&quot; objectid=&quot;35ff711b-53f7-4c74-9e8b-98d35adaa6bf&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;macRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;f91c9f52-8150-4d0f-b657-498ed241835c&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC-R2&lt;/name&gt;&#13;&#10; &lt;mac type=&quot;String&quot;&gt;00:98:28:28:14:00&lt;/mac&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;00:00:00:00:00:01&lt;/incrementBy&gt;&#13;&#10; &lt;mtu type=&quot;Int&quot;&gt;1500&lt;/mtu&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;57fa3f41-7695-42d7-ac26-68924bb1e8bb&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;VLAN-R2&lt;/name&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;firstId type=&quot;Int&quot;&gt;1&lt;/firstId&gt;&#13;&#10; &lt;incrementStep type=&quot;Int&quot;&gt;32&lt;/incrementStep&gt;&#13;&#10; &lt;increment type=&quot;Int&quot;&gt;1&lt;/increment&gt;&#13;&#10; &lt;uniqueCount type=&quot;Int&quot;&gt;4094&lt;/uniqueCount&gt;&#13;&#10; &lt;priority type=&quot;Int&quot;&gt;0&lt;/priority&gt;&#13;&#10; &lt;tpid type=&quot;String&quot;&gt;0x8100&lt;/tpid&gt;&#13;&#10; &lt;innerEnable type=&quot;Bool&quot;&gt;0&lt;/innerEnable&gt;&#13;&#10; &lt;innerFirstId type=&quot;Int&quot;&gt;1&lt;/innerFirstId&gt;&#13;&#10; &lt;innerIncrementStep type=&quot;Int&quot;&gt;1&lt;/innerIncrementStep&gt;&#13;&#10; &lt;innerIncrement type=&quot;Int&quot;&gt;1&lt;/innerIncrement&gt;&#13;&#10; &lt;innerUniqueCount type=&quot;Int&quot;&gt;4094&lt;/innerUniqueCount&gt;&#13;&#10; &lt;innerPriority type=&quot;Int&quot;&gt;0&lt;/innerPriority&gt;&#13;&#10; &lt;idIncrMode type=&quot;Int&quot;&gt;1&lt;/idIncrMode&gt;&#13;&#10; &lt;innerTpid type=&quot;String&quot;&gt;0x8100&lt;/innerTpid&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/vlanRange&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacRange&gt;&#13;&#10; &lt;/macRangeList&gt;&#13;&#10; &lt;vlanRangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.VlanIdRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;57fa3f41-7695-42d7-ac26-68924bb1e8bb&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/vlanRangeList&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Plugin type=&quot;Ixia.Aptixia.StackManager.IpV4V6Plugin&quot; objectid=&quot;b85b184d-9bb4-48c2-a029-e633fee7a3c8&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;1d9bf537-0c3d-4fdf-9b85-0a622cc77649&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-R2&lt;/name&gt;&#13;&#10; &lt;ipType type=&quot;String&quot;&gt;IPv4&lt;/ipType&gt;&#13;&#10; &lt;ipAddress type=&quot;String&quot;&gt;152.40.40.20&lt;/ipAddress&gt;&#13;&#10; &lt;prefix type=&quot;Int&quot;&gt;24&lt;/prefix&gt;&#13;&#10; &lt;incrementBy type=&quot;String&quot;&gt;0.0.0.1&lt;/incrementBy&gt;&#13;&#10; &lt;count type=&quot;Int&quot;&gt;1&lt;/count&gt;&#13;&#10; &lt;autoCountEnabled type=&quot;Bool&quot;&gt;0&lt;/autoCountEnabled&gt;&#13;&#10; &lt;gatewayAddress type=&quot;String&quot;&gt;152.40.40.10&lt;/gatewayAddress&gt;&#13;&#10; &lt;gatewayIncrement type=&quot;String&quot;&gt;0.0.0.0&lt;/gatewayIncrement&gt;&#13;&#10; &lt;gatewayIncrementMode type=&quot;String&quot;&gt;perSubnet&lt;/gatewayIncrementMode&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;generateStatistics type=&quot;Bool&quot;&gt;0&lt;/generateStatistics&gt;&#13;&#10; &lt;mss type=&quot;Int&quot;&gt;1460&lt;/mss&gt;&#13;&#10; &lt;randomizeAddress type=&quot;Bool&quot;&gt;0&lt;/randomizeAddress&gt;&#13;&#10; &lt;randomizeSeed type=&quot;Int&quot;&gt;463911585&lt;/randomizeSeed&gt;&#13;&#10; &lt;autoMacGeneration type=&quot;Bool&quot;&gt;1&lt;/autoMacGeneration&gt;&#13;&#10; &lt;macRange type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;f91c9f52-8150-4d0f-b657-498ed241835c&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;vlanRange type=&quot;Ixia.Aptixia.StackManager.VlanIdRange&quot; objectid=&quot;57fa3f41-7695-42d7-ac26-68924bb1e8bb&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;atmRange type=&quot;Ixia.Aptixia.StackManager.AtmRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;pvcRange type=&quot;Ixia.Aptixia.StackManager.PvcRange&quot; objectid=&quot;00000000-0000-0000-0000-000000000000&quot; /&gt;&#13;&#10; &lt;autoIpTypeEnabled type=&quot;Bool&quot;&gt;0&lt;/autoIpTypeEnabled&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Range&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;rangeGroups type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.RangeGroup type=&quot;Ixia.Aptixia.StackManager.RangeGroup&quot; objectid=&quot;b2c21c73-bfe3-4fbc-9804-b5a8b307d893&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DistGroup1&lt;/name&gt;&#13;&#10; &lt;distribType type=&quot;Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType&quot;&gt;0&lt;/distribType&gt;&#13;&#10; &lt;rangeList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpV4V6Range type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;1d9bf537-0c3d-4fdf-9b85-0a622cc77649&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/rangeList&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.RangeGroup&gt;&#13;&#10; &lt;/rangeGroups&gt;&#13;&#10; &lt;childrenList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;IP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpV4V6Plugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;MAC/VLAN-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.L2EthernetPlugin&gt;&#13;&#10; &lt;/childrenList&gt;&#13;&#10; &lt;extensionList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;dscMode type=&quot;Bool&quot;&gt;0&lt;/dscMode&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Ethernet-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/stack&gt;&#13;&#10; &lt;globalPluginList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type=&quot;Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&quot; objectid=&quot;993e33c6-e1f7-4967-982e-82a032f8c61a&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;teardownInterfaceWithUser type=&quot;Bool&quot;&gt;0&lt;/teardownInterfaceWithUser&gt;&#13;&#10; &lt;interfaceBehavior type=&quot;Int&quot;&gt;0&lt;/interfaceBehavior&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Settings-4&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSettingsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.DnsPlugin type=&quot;Ixia.Aptixia.StackManager.DnsPlugin&quot; objectid=&quot;36ca84d7-ff44-45b7-b75d-aec38b753161&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;domain type=&quot;String&quot; /&gt;&#13;&#10; &lt;timeout type=&quot;Int&quot;&gt;30000&lt;/timeout&gt;&#13;&#10; &lt;nameServerList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;searchList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;hostList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DNS-4&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.DnsPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.FilterPlugin type=&quot;Ixia.Aptixia.StackManager.FilterPlugin&quot; objectid=&quot;25c5acdd-9dd3-4802-93b6-b10651820b66&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;auto type=&quot;Bool&quot;&gt;1&lt;/auto&gt;&#13;&#10; &lt;all type=&quot;Bool&quot;&gt;0&lt;/all&gt;&#13;&#10; &lt;pppoecontrol type=&quot;Bool&quot;&gt;0&lt;/pppoecontrol&gt;&#13;&#10; &lt;pppoenetwork type=&quot;Bool&quot;&gt;0&lt;/pppoenetwork&gt;&#13;&#10; &lt;isis type=&quot;Bool&quot;&gt;0&lt;/isis&gt;&#13;&#10; &lt;ip type=&quot;String&quot; /&gt;&#13;&#10; &lt;tcp type=&quot;String&quot; /&gt;&#13;&#10; &lt;udp type=&quot;String&quot; /&gt;&#13;&#10; &lt;mac type=&quot;String&quot; /&gt;&#13;&#10; &lt;icmp type=&quot;String&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Filter-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.FilterPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.TCPPlugin type=&quot;Ixia.Aptixia.StackManager.TCPPlugin&quot; objectid=&quot;6259328b-97c2-4390-8ab1-f16bf3459219&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;bestPerfSettings type=&quot;Bool&quot;&gt;0&lt;/bestPerfSettings&gt;&#13;&#10; &lt;accept_ra_all type=&quot;Bool&quot;&gt;0&lt;/accept_ra_all&gt;&#13;&#10; &lt;tcp_abort_on_overflow type=&quot;Bool&quot;&gt;0&lt;/tcp_abort_on_overflow&gt;&#13;&#10; &lt;tcp_adv_win_scale type=&quot;Int&quot;&gt;2&lt;/tcp_adv_win_scale&gt;&#13;&#10; &lt;tcp_app_win type=&quot;Int&quot;&gt;31&lt;/tcp_app_win&gt;&#13;&#10; &lt;tcp_bic type=&quot;Int&quot;&gt;0&lt;/tcp_bic&gt;&#13;&#10; &lt;tcp_bic_fast_convergence type=&quot;Int&quot;&gt;1&lt;/tcp_bic_fast_convergence&gt;&#13;&#10; &lt;tcp_bic_low_window type=&quot;Int&quot;&gt;14&lt;/tcp_bic_low_window&gt;&#13;&#10; &lt;tcp_dsack type=&quot;Bool&quot;&gt;1&lt;/tcp_dsack&gt;&#13;&#10; &lt;tcp_ecn type=&quot;Bool&quot;&gt;0&lt;/tcp_ecn&gt;&#13;&#10; &lt;tcp_fack type=&quot;Bool&quot;&gt;1&lt;/tcp_fack&gt;&#13;&#10; &lt;tcp_fin_timeout type=&quot;Int&quot;&gt;60&lt;/tcp_fin_timeout&gt;&#13;&#10; &lt;tcp_frto type=&quot;Int&quot;&gt;0&lt;/tcp_frto&gt;&#13;&#10; &lt;tcp_keepalive_intvl type=&quot;Int&quot;&gt;7200&lt;/tcp_keepalive_intvl&gt;&#13;&#10; &lt;tcp_keepalive_probes type=&quot;Int&quot;&gt;75&lt;/tcp_keepalive_probes&gt;&#13;&#10; &lt;tcp_keepalive_time type=&quot;Int&quot;&gt;9&lt;/tcp_keepalive_time&gt;&#13;&#10; &lt;tcp_low_latency type=&quot;Int&quot;&gt;0&lt;/tcp_low_latency&gt;&#13;&#10; &lt;tcp_max_orphans type=&quot;Int&quot;&gt;8192&lt;/tcp_max_orphans&gt;&#13;&#10; &lt;tcp_max_syn_backlog type=&quot;Int&quot;&gt;1024&lt;/tcp_max_syn_backlog&gt;&#13;&#10; &lt;tcp_max_tw_buckets type=&quot;Int&quot;&gt;180000&lt;/tcp_max_tw_buckets&gt;&#13;&#10; &lt;tcp_mem_low type=&quot;Int&quot;&gt;24576&lt;/tcp_mem_low&gt;&#13;&#10; &lt;tcp_mem_pressure type=&quot;Int&quot;&gt;32768&lt;/tcp_mem_pressure&gt;&#13;&#10; &lt;tcp_mem_high type=&quot;Int&quot;&gt;49152&lt;/tcp_mem_high&gt;&#13;&#10; &lt;tcp_moderate_rcvbuf type=&quot;Int&quot;&gt;0&lt;/tcp_moderate_rcvbuf&gt;&#13;&#10; &lt;tcp_no_metrics_save type=&quot;Bool&quot;&gt;0&lt;/tcp_no_metrics_save&gt;&#13;&#10; &lt;tcp_orphan_retries type=&quot;Int&quot;&gt;0&lt;/tcp_orphan_retries&gt;&#13;&#10; &lt;tcp_reordering type=&quot;Int&quot;&gt;3&lt;/tcp_reordering&gt;&#13;&#10; &lt;tcp_retrans_collapse type=&quot;Bool&quot;&gt;1&lt;/tcp_retrans_collapse&gt;&#13;&#10; &lt;tcp_retries1 type=&quot;Int&quot;&gt;3&lt;/tcp_retries1&gt;&#13;&#10; &lt;tcp_retries2 type=&quot;Int&quot;&gt;15&lt;/tcp_retries2&gt;&#13;&#10; &lt;tcp_rfc1337 type=&quot;Bool&quot;&gt;0&lt;/tcp_rfc1337&gt;&#13;&#10; &lt;tcp_rmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_rmem_min&gt;&#13;&#10; &lt;tcp_rmem_default type=&quot;Int&quot;&gt;1024&lt;/tcp_rmem_default&gt;&#13;&#10; &lt;tcp_rmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_rmem_max&gt;&#13;&#10; &lt;tcp_sack type=&quot;Bool&quot;&gt;1&lt;/tcp_sack&gt;&#13;&#10; &lt;tcp_stdurg type=&quot;Bool&quot;&gt;0&lt;/tcp_stdurg&gt;&#13;&#10; &lt;tcp_synack_retries type=&quot;Int&quot;&gt;5&lt;/tcp_synack_retries&gt;&#13;&#10; &lt;tcp_syn_retries type=&quot;Int&quot;&gt;5&lt;/tcp_syn_retries&gt;&#13;&#10; &lt;tcp_timestamps type=&quot;Bool&quot;&gt;1&lt;/tcp_timestamps&gt;&#13;&#10; &lt;tcp_tw_recycle type=&quot;Bool&quot;&gt;1&lt;/tcp_tw_recycle&gt;&#13;&#10; &lt;tcp_tw_reuse type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_reuse&gt;&#13;&#10; &lt;tcp_vegas_alpha type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_alpha&gt;&#13;&#10; &lt;tcp_vegas_beta type=&quot;Int&quot;&gt;6&lt;/tcp_vegas_beta&gt;&#13;&#10; &lt;tcp_vegas_cong_avoid type=&quot;Int&quot;&gt;0&lt;/tcp_vegas_cong_avoid&gt;&#13;&#10; &lt;tcp_vegas_gamma type=&quot;Int&quot;&gt;2&lt;/tcp_vegas_gamma&gt;&#13;&#10; &lt;tcp_westwood type=&quot;Int&quot;&gt;0&lt;/tcp_westwood&gt;&#13;&#10; &lt;tcp_window_scaling type=&quot;Bool&quot;&gt;0&lt;/tcp_window_scaling&gt;&#13;&#10; &lt;ip_no_pmtu_disc type=&quot;Bool&quot;&gt;1&lt;/ip_no_pmtu_disc&gt;&#13;&#10; &lt;tcp_wmem_min type=&quot;Int&quot;&gt;4096&lt;/tcp_wmem_min&gt;&#13;&#10; &lt;tcp_wmem_default type=&quot;Int&quot;&gt;1024&lt;/tcp_wmem_default&gt;&#13;&#10; &lt;tcp_wmem_max type=&quot;Int&quot;&gt;262144&lt;/tcp_wmem_max&gt;&#13;&#10; &lt;tcp_ipfrag_time type=&quot;Int&quot;&gt;30&lt;/tcp_ipfrag_time&gt;&#13;&#10; &lt;tcp_port_min type=&quot;Int&quot;&gt;1024&lt;/tcp_port_min&gt;&#13;&#10; &lt;tcp_port_max type=&quot;Int&quot;&gt;65535&lt;/tcp_port_max&gt;&#13;&#10; &lt;tcp_rto_min type=&quot;Int&quot;&gt;1000&lt;/tcp_rto_min&gt;&#13;&#10; &lt;tcp_rto_max type=&quot;Int&quot;&gt;120000&lt;/tcp_rto_max&gt;&#13;&#10; &lt;tcp_tw_rfc1323_strict type=&quot;Bool&quot;&gt;0&lt;/tcp_tw_rfc1323_strict&gt;&#13;&#10; &lt;udp_port_randomization type=&quot;Bool&quot;&gt;0&lt;/udp_port_randomization&gt;&#13;&#10; &lt;disable_min_max_buffer_size type=&quot;Bool&quot;&gt;1&lt;/disable_min_max_buffer_size&gt;&#13;&#10; &lt;llm_hdr_gap type=&quot;Int&quot;&gt;8&lt;/llm_hdr_gap&gt;&#13;&#10; &lt;llm_hdr_gap_ns type=&quot;Int&quot;&gt;10&lt;/llm_hdr_gap_ns&gt;&#13;&#10; &lt;inter_packet_granular_delay type=&quot;Double&quot;&gt;0&lt;/inter_packet_granular_delay&gt;&#13;&#10; &lt;delayed_acks type=&quot;Bool&quot;&gt;1&lt;/delayed_acks&gt;&#13;&#10; &lt;accept_ra_default type=&quot;Bool&quot;&gt;0&lt;/accept_ra_default&gt;&#13;&#10; &lt;rps_needed type=&quot;Bool&quot;&gt;0&lt;/rps_needed&gt;&#13;&#10; &lt;delayed_acks_segments type=&quot;Int&quot;&gt;0&lt;/delayed_acks_segments&gt;&#13;&#10; &lt;delayed_acks_timeout type=&quot;Int&quot;&gt;0&lt;/delayed_acks_timeout&gt;&#13;&#10; &lt;tcp_large_icwnd type=&quot;Int&quot;&gt;0&lt;/tcp_large_icwnd&gt;&#13;&#10; &lt;tcp_mgmt_rmem type=&quot;Int&quot;&gt;87380&lt;/tcp_mgmt_rmem&gt;&#13;&#10; &lt;tcp_mgmt_wmem type=&quot;Int&quot;&gt;32768&lt;/tcp_mgmt_wmem&gt;&#13;&#10; &lt;adjust_tcp_buffers type=&quot;Bool&quot;&gt;1&lt;/adjust_tcp_buffers&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;TCP-4&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.TCPPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.GratArpPlugin type=&quot;Ixia.Aptixia.StackManager.GratArpPlugin&quot; objectid=&quot;3eedf749-efa4-43a0-87ae-e110a77c88d4&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;forwardGratArp type=&quot;Bool&quot;&gt;0&lt;/forwardGratArp&gt;&#13;&#10; &lt;rateControlEnabled type=&quot;Bool&quot;&gt;0&lt;/rateControlEnabled&gt;&#13;&#10; &lt;maxFramesPerSecond type=&quot;Int&quot;&gt;0&lt;/maxFramesPerSecond&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;GratARP-2&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.GratArpPlugin&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MeshingPlugin type=&quot;Ixia.Aptixia.StackManager.MeshingPlugin&quot; objectid=&quot;284f9992-65d8-4027-a155-709f1965f892&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;trafficMaps type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;activityRangeMapInfoList type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;Meshing-1&lt;/name&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MeshingPlugin&gt;&#13;&#10; &lt;/globalPluginList&gt;&#13;&#10; &lt;portList type=&quot;StringList&quot;&gt;&#13;&#10; &lt;String&gt;10.223.166.127;2;6&lt;/String&gt;&#13;&#10; &lt;/portList&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecPortGroupData type=&quot;Ixia.Aptixia.StackManager.IPSecPortGroupData&quot; objectid=&quot;f65f12f2-018c-46f5-a9c5-a1f6f7151909&quot; version=&quot;8.1.7&quot;&gt;&#13;&#10; &lt;role type=&quot;String&quot;&gt;Initiator&lt;/role&gt;&#13;&#10; &lt;associates type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;overrideGlobalOptions type=&quot;Bool&quot;&gt;0&lt;/overrideGlobalOptions&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;enableESPPerStreamStats type=&quot;Bool&quot;&gt;0&lt;/enableESPPerStreamStats&gt;&#13;&#10; &lt;enableESPReplayStats type=&quot;Bool&quot;&gt;0&lt;/enableESPReplayStats&gt;&#13;&#10; &lt;activities type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;pcpuLogLevel type=&quot;String&quot;&gt;0&lt;/pcpuLogLevel&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecPortGroupData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;virtualMode type=&quot;Bool&quot;&gt;0&lt;/virtualMode&gt;&#13;&#10; &lt;allowedVirtualModeTypes type=&quot;StringList&quot; /&gt;&#13;&#10; &lt;doOwnership type=&quot;Bool&quot;&gt;0&lt;/doOwnership&gt;&#13;&#10; &lt;branchToNicMap type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;cpuAggregation type=&quot;Bool&quot;&gt;0&lt;/cpuAggregation&gt;&#13;&#10; &lt;activePort type=&quot;String&quot; /&gt;&#13;&#10; &lt;networkLayersManager type=&quot;Ixia.Aptixia.StackManager.NetworkLayersManager&quot; objectid=&quot;60b1273d-78d3-4813-8cea-ec9a7101b8a3&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.PortGroup&gt;&#13;&#10; &lt;/portGroupList&gt;&#13;&#10; &lt;externalProperties type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyManager&quot; objectid=&quot;1f2452bf-e52a-4db2-ba47-e5cc8bf61b5e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;properties type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;145671ff-93a5-4ecc-8c83-59b2c3c67be9&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatLTEUEUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;9f07a941-ad2f-46b0-8c75-911862a21039&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;SixRdRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;a221ab5c-faae-4940-bfad-5d41d44f1427&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;L2tpRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;d811442b-bfb8-42f0-bbf8-6bdb6fc9b66b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DHCPServerRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;f252cff3-b919-4e74-9f62-9e9c5ab5d324&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MobileSubscribersRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;493ce043-b982-4a43-a2d4-619e51fbc5a6&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IPSecRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;500dfc8b-2e6a-401f-84c0-f6907f60c00e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPSgsnS3RangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;693cb176-f3d8-4073-8a02-fabdc0bdd3fb&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPRange_SGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;ec983bf9-07f0-46b2-99a0-354114f42501&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EmulatedRouterRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;5d0f0eb8-40af-4292-8ff2-a57e7903601d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;PppoxRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;653fae09-ba19-443c-8f8b-9483c0b86b9a&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPNGAPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;c886be8c-c207-4bb4-90d5-17be54556d58&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatRNCIuPSUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;00e75214-5166-406b-90e5-2b83567ae5cf&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPNGUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;50d10ee7-45ce-46d2-ae8d-ecd3b1806067&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange_S5S8_SGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;c2f310a4-6ea4-4459-be3b-f3b3365c590a&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPGRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;7e458bed-5e36-42d6-812d-3794be52766e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPPcrfRange_S5S8_PGW&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;7d225fda-6432-4de3-9750-c19bbc957703&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DSLiteRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;e25dd669-ffc5-493d-a2b5-fd5627bf2ee8&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPSGSNRangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;7ac0b7d4-6df9-4e1f-86d2-f0a494b3f20b&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;SlaacRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;25699a2c-ab22-417b-9072-894523e98008&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;05f1053a-5774-409f-b07e-add07df64338&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;PSTNDigitalRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;482a10c3-0ac7-44d9-9fa9-b43ba3a9901d&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DHCPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;a0f03753-923d-4421-8c4f-0ed78f00fc44&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;AtmRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;fb5cd68e-b4b0-4fd4-ae18-4100c0035642&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatMMEApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;62677b6a-080e-4cc3-919b-71fa90ae410f&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatENodeBUuApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;2e0fd6e3-470e-48df-ab8d-cc21b9d80393&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;GTPSUERange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;175f3104-0d2a-44f9-b712-fed3b170f8cb&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IpV4V6Range&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;d1f37e1e-db44-4bac-acb8-b242dee8e371&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MacRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;61ccdebc-84e6-464d-be14-2b3ddedab9d2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;DualStackIPRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;d0678cd8-998e-42ab-8f0d-bfcb5370eac2&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPUERange_S2a_TWAN&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;d8350364-51c6-4a1b-af9f-72c9c235a636&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatSGSNIuPSApnRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;613d02a1-db1e-415d-b4bb-8b73b4477cf4&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;IxCatENodeBSimUeRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;9a41f718-b55e-44c7-a0cc-b1fcf8204c20&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;S6dRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;4c26fe62-a63d-4c40-8e15-c58ad8fba8d0&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;UERangeBase&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;5c2ca63f-3335-4ab7-963e-440817448538&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;EGTPMmeS10RangeUe&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;51a5eccc-a68d-4730-8a48-32019c547c28&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;S6aRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;3010c4ad-f31e-4676-9e61-bb25cf9c1bbb&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;BmScRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;ef1677e4-f390-4a78-b61a-f7650cf5faea&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;MBmsGwRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalPropertyInfo type=&quot;Ixia.Aptixia.StackManager.ExternalPropertyInfo&quot; objectid=&quot;24322b98-7a2a-4d2d-a4ee-4cde0f0e8b64&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;targetType type=&quot;String&quot;&gt;PptpRange&lt;/targetType&gt;&#13;&#10; &lt;valueType type=&quot;String&quot;&gt;ExternalValueBoolean&lt;/valueType&gt;&#13;&#10; &lt;description type=&quot;String&quot;&gt;Enable collection of interface statistics on this range&lt;/description&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalPropertyInfo&gt;&#13;&#10; &lt;/properties&gt;&#13;&#10; &lt;values type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;6804ae67-3bd7-471b-8796-ee1e4773c2f1&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;a3559674-8d95-4020-90b3-b42eacaef105&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;7efcd429-2c48-41bd-bdc5-489dbfcfc49a&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;a63d8276-65bc-4bc2-8202-6461c6399ef9&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.IpV4V6Range&quot; objectid=&quot;1d9bf537-0c3d-4fdf-9b85-0a622cc77649&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;09d7b134-2921-4759-bbdb-ff3a5a1966d7&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;1&lt;/enabled&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;0cd9f099-242e-4b03-965f-d343c60181e6&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;3011c8a8-a9fd-4b76-a27d-91948113ed4f&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;503aa008-2481-419f-a223-c90b2c25c17e&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ExternalProperty type=&quot;Ixia.Aptixia.StackManager.ExternalProperty&quot; objectid=&quot;0b8d2c01-19ac-4f28-924e-660676d978da&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;propertyName type=&quot;String&quot;&gt;Publish Statistics&lt;/propertyName&gt;&#13;&#10; &lt;target type=&quot;Ixia.Aptixia.StackManager.MacRange&quot; objectid=&quot;f91c9f52-8150-4d0f-b657-498ed241835c&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;value type=&quot;Ixia.Aptixia.StackManager.ExternalValueBoolean&quot; objectid=&quot;41c694b3-bb55-48fe-9604-8b003540242f&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;value type=&quot;Bool&quot;&gt;0&lt;/value&gt;&#13;&#10; &lt;/value&gt;&#13;&#10; &lt;enabled type=&quot;Bool&quot;&gt;0&lt;/enabled&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ExternalProperty&gt;&#13;&#10; &lt;/values&gt;&#13;&#10; &lt;/externalProperties&gt;&#13;&#10; &lt;availableNetworkTimelines type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;typeSpecificData type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.MacSessionData type=&quot;Ixia.Aptixia.StackManager.MacSessionData&quot; objectid=&quot;a9c7aa59-e015-4ffd-bb82-5d877ae9c1a8&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;duplicateCheckingScope type=&quot;Ixia.Aptixia.StackManager.MacSessionDataSkeleton+eMacValidationOptions&quot;&gt;2&lt;/duplicateCheckingScope&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.MacSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IpSessionData type=&quot;Ixia.Aptixia.StackManager.IpSessionData&quot; objectid=&quot;34a78d72-1fc5-4875-9fe1-b4db66b1b4c4&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;duplicateCheckingScope type=&quot;Ixia.Aptixia.StackManager.IpSessionDataSkeleton+eIpValidationOptions&quot;&gt;2&lt;/duplicateCheckingScope&gt;&#13;&#10; &lt;enableGatewayArp type=&quot;Bool&quot;&gt;0&lt;/enableGatewayArp&gt;&#13;&#10; &lt;gatewayArpRequestRate type=&quot;Int&quot;&gt;300&lt;/gatewayArpRequestRate&gt;&#13;&#10; &lt;maxOutstandingGatewayArpRequests type=&quot;Int&quot;&gt;300&lt;/maxOutstandingGatewayArpRequests&gt;&#13;&#10; &lt;ignoreUnresolvedIPs type=&quot;Bool&quot;&gt;0&lt;/ignoreUnresolvedIPs&gt;&#13;&#10; &lt;sendAllRequests type=&quot;Bool&quot;&gt;0&lt;/sendAllRequests&gt;&#13;&#10; &lt;individualARPTimeOut type=&quot;Int&quot;&gt;500&lt;/individualARPTimeOut&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;2&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IpSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IxLoadSessionData type=&quot;Ixia.Aptixia.StackManager.IxLoadSessionData&quot; objectid=&quot;1e24447f-69f1-4030-8b2d-25a18c7160ca&quot; version=&quot;1.0.0&quot;&gt;&#13;&#10; &lt;portGroupList type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;865be042-32d5-426a-9e75-0908c943801f&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.PortGroup type=&quot;Ixia.Aptixia.StackManager.PortGroup&quot; objectid=&quot;c4ecfc60-64ac-4dc2-9410-e0f58d84f229&quot; version=&quot;6.70.420&quot; /&gt;&#13;&#10; &lt;/portGroupList&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IxLoadSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ImpairSessionData type=&quot;Ixia.Aptixia.StackManager.ImpairSessionData&quot; objectid=&quot;94b53c2c-0747-41c2-838d-0e0e15f31766&quot; version=&quot;6.70.13&quot;&gt;&#13;&#10; &lt;profiles type=&quot;ListNode&quot;&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.ImpairProfile type=&quot;Ixia.Aptixia.StackManager.ImpairProfile&quot; objectid=&quot;90dd3511-93c1-49fa-8e38-db774db9fe17&quot; version=&quot;6.70.13&quot;&gt;&#13;&#10; &lt;name type=&quot;String&quot;&gt;DefaultProfile&lt;/name&gt;&#13;&#10; &lt;defaultp type=&quot;Bool&quot;&gt;1&lt;/defaultp&gt;&#13;&#10; &lt;seed type=&quot;Int&quot;&gt;0&lt;/seed&gt;&#13;&#10; &lt;addDelay type=&quot;Bool&quot;&gt;1&lt;/addDelay&gt;&#13;&#10; &lt;delay type=&quot;Int&quot;&gt;20&lt;/delay&gt;&#13;&#10; &lt;jitter type=&quot;Int&quot;&gt;0&lt;/jitter&gt;&#13;&#10; &lt;addDrop type=&quot;Bool&quot;&gt;0&lt;/addDrop&gt;&#13;&#10; &lt;drop type=&quot;Double&quot;&gt;10&lt;/drop&gt;&#13;&#10; &lt;addDropSequence type=&quot;Bool&quot;&gt;0&lt;/addDropSequence&gt;&#13;&#10; &lt;dropSequenceSkip type=&quot;Int&quot;&gt;10&lt;/dropSequenceSkip&gt;&#13;&#10; &lt;dropSequenceLength type=&quot;Int&quot;&gt;1&lt;/dropSequenceLength&gt;&#13;&#10; &lt;addReorder type=&quot;Bool&quot;&gt;0&lt;/addReorder&gt;&#13;&#10; &lt;gap type=&quot;Int&quot;&gt;10&lt;/gap&gt;&#13;&#10; &lt;reorder type=&quot;Int&quot;&gt;20&lt;/reorder&gt;&#13;&#10; &lt;reorderLength type=&quot;Int&quot;&gt;1&lt;/reorderLength&gt;&#13;&#10; &lt;addReorderPI type=&quot;Bool&quot;&gt;0&lt;/addReorderPI&gt;&#13;&#10; &lt;reorderPISkip type=&quot;Int&quot;&gt;10&lt;/reorderPISkip&gt;&#13;&#10; &lt;reorderPILength type=&quot;Int&quot;&gt;1&lt;/reorderPILength&gt;&#13;&#10; &lt;reorderPIInterval type=&quot;Int&quot;&gt;1&lt;/reorderPIInterval&gt;&#13;&#10; &lt;reorderPITimeout type=&quot;Int&quot;&gt;1000&lt;/reorderPITimeout&gt;&#13;&#10; &lt;addDuplicate type=&quot;Bool&quot;&gt;0&lt;/addDuplicate&gt;&#13;&#10; &lt;duplicate type=&quot;Double&quot;&gt;10&lt;/duplicate&gt;&#13;&#10; &lt;addFragment type=&quot;Bool&quot;&gt;0&lt;/addFragment&gt;&#13;&#10; &lt;fragment type=&quot;Double&quot;&gt;10&lt;/fragment&gt;&#13;&#10; &lt;mtu type=&quot;Int&quot;&gt;1000&lt;/mtu&gt;&#13;&#10; &lt;addFragmentSequence type=&quot;Bool&quot;&gt;0&lt;/addFragmentSequence&gt;&#13;&#10; &lt;fragmentSequenceSkip type=&quot;Int&quot;&gt;10&lt;/fragmentSequenceSkip&gt;&#13;&#10; &lt;fragmentSequenceLength type=&quot;Int&quot;&gt;1&lt;/fragmentSequenceLength&gt;&#13;&#10; &lt;mtuSequence type=&quot;Int&quot;&gt;1000&lt;/mtuSequence&gt;&#13;&#10; &lt;sendFragmentsInReverseOrder type=&quot;Bool&quot;&gt;0&lt;/sendFragmentsInReverseOrder&gt;&#13;&#10; &lt;sendFirstFragmentOnly type=&quot;Bool&quot;&gt;0&lt;/sendFirstFragmentOnly&gt;&#13;&#10; &lt;sendOverlappingFragments type=&quot;Bool&quot;&gt;0&lt;/sendOverlappingFragments&gt;&#13;&#10; &lt;addBandwidth type=&quot;Bool&quot;&gt;0&lt;/addBandwidth&gt;&#13;&#10; &lt;bandwidth type=&quot;Double&quot;&gt;1&lt;/bandwidth&gt;&#13;&#10; &lt;bandwidthUnits type=&quot;String&quot;&gt;mbps&lt;/bandwidthUnits&gt;&#13;&#10; &lt;addBandwidthIn type=&quot;Bool&quot;&gt;0&lt;/addBandwidthIn&gt;&#13;&#10; &lt;bandwidthIn type=&quot;Double&quot;&gt;1&lt;/bandwidthIn&gt;&#13;&#10; &lt;bandwidthUnitsIn type=&quot;String&quot;&gt;mbps&lt;/bandwidthUnitsIn&gt;&#13;&#10; &lt;destinationIp type=&quot;String&quot;&gt;any&lt;/destinationIp&gt;&#13;&#10; &lt;sourceIp type=&quot;String&quot;&gt;any&lt;/sourceIp&gt;&#13;&#10; &lt;sourcePort type=&quot;Int&quot;&gt;0&lt;/sourcePort&gt;&#13;&#10; &lt;destinationPort type=&quot;Int&quot;&gt;0&lt;/destinationPort&gt;&#13;&#10; &lt;protocol type=&quot;String&quot;&gt;any&lt;/protocol&gt;&#13;&#10; &lt;typeOfService type=&quot;String&quot;&gt;any&lt;/typeOfService&gt;&#13;&#10; &lt;addTcpFlagsFilter type=&quot;Bool&quot;&gt;0&lt;/addTcpFlagsFilter&gt;&#13;&#10; &lt;selectTcpFlags type=&quot;String&quot;&gt;SYN;RST;ACK&lt;/selectTcpFlags&gt;&#13;&#10; &lt;expectTcpFlags type=&quot;String&quot;&gt;SYN&lt;/expectTcpFlags&gt;&#13;&#10; &lt;impairOrder type=&quot;String&quot;&gt;Delay;Drop;DropSeq;Reorder;ReorderPI;Duplicate;Fragment;FragmentSeq;Bandwidth&lt;/impairOrder&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ImpairProfile&gt;&#13;&#10; &lt;/profiles&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.ImpairSessionData&gt;&#13;&#10; &lt;Ixia.Aptixia.StackManager.IPSecSessionData type=&quot;Ixia.Aptixia.StackManager.IPSecSessionData&quot; objectid=&quot;bd2f0ea4-4278-49c8-9600-18cd2c8ed639&quot; version=&quot;8.1.7&quot;&gt;&#13;&#10; &lt;ipsecTunnelSetup type=&quot;Ixia.Aptixia.StackManager.IPSecTunnelSetup&quot; objectid=&quot;1bacc8a0-dda0-4e0c-b013-4d8618dc80b6&quot; version=&quot;8.1.7&quot;&gt;&#13;&#10; &lt;tunnelSetupTimeout type=&quot;Int&quot;&gt;30&lt;/tunnelSetupTimeout&gt;&#13;&#10; &lt;tunnelRetransmissionTimeout type=&quot;Int&quot;&gt;30&lt;/tunnelRetransmissionTimeout&gt;&#13;&#10; &lt;numRetries type=&quot;Int&quot;&gt;0&lt;/numRetries&gt;&#13;&#10; &lt;retryInterval type=&quot;Int&quot;&gt;10&lt;/retryInterval&gt;&#13;&#10; &lt;retryDelay type=&quot;Int&quot;&gt;10&lt;/retryDelay&gt;&#13;&#10; &lt;testType type=&quot;String&quot;&gt;P2D&lt;/testType&gt;&#13;&#10; &lt;sendCiscoVid type=&quot;Bool&quot;&gt;0&lt;/sendCiscoVid&gt;&#13;&#10; &lt;useMaxInitiationRate type=&quot;Bool&quot;&gt;0&lt;/useMaxInitiationRate&gt;&#13;&#10; &lt;useMaxPendingTunnels type=&quot;Bool&quot;&gt;0&lt;/useMaxPendingTunnels&gt;&#13;&#10; &lt;enableRekey type=&quot;Bool&quot;&gt;1&lt;/enableRekey&gt;&#13;&#10; &lt;rekeyRetries type=&quot;Int&quot;&gt;3&lt;/rekeyRetries&gt;&#13;&#10; &lt;rekeyFuzzPercentage type=&quot;Int&quot;&gt;0&lt;/rekeyFuzzPercentage&gt;&#13;&#10; &lt;rekeyMargin type=&quot;Int&quot;&gt;10&lt;/rekeyMargin&gt;&#13;&#10; &lt;/ipsecTunnelSetup&gt;&#13;&#10; &lt;ipsecCertificates type=&quot;Ixia.Aptixia.StackManager.IPSecCertificates&quot; objectid=&quot;2e324324-bf74-4ad3-afbb-62e44f01c31a&quot; version=&quot;8.1.7&quot;&gt;&#13;&#10; &lt;uniqueCert type=&quot;Bool&quot;&gt;0&lt;/uniqueCert&gt;&#13;&#10; &lt;certSource type=&quot;String&quot;&gt;kNewCert&lt;/certSource&gt;&#13;&#10; &lt;caURL type=&quot;String&quot; /&gt;&#13;&#10; &lt;caDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;certSubjectDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;certSubjectAltDN type=&quot;String&quot; /&gt;&#13;&#10; &lt;remoteIkeId type=&quot;String&quot; /&gt;&#13;&#10; &lt;bitSize type=&quot;String&quot;&gt;k512&lt;/bitSize&gt;&#13;&#10; &lt;saveCert type=&quot;Bool&quot;&gt;1&lt;/saveCert&gt;&#13;&#10; &lt;cacheCertFolder type=&quot;String&quot;&gt;C:\Program Files\Ixia\CachedCerts&lt;/cacheCertFolder&gt;&#13;&#10; &lt;certParentFolder type=&quot;String&quot;&gt;C:\Program Files\Ixia\CachedCerts&lt;/certParentFolder&gt;&#13;&#10; &lt;certNumber type=&quot;String&quot; /&gt;&#13;&#10; &lt;caCertNumber type=&quot;String&quot; /&gt;&#13;&#10; &lt;earlyExpDate type=&quot;String&quot; /&gt;&#13;&#10; &lt;lateExpDate type=&quot;String&quot; /&gt;&#13;&#10; &lt;usePerRangeCertNameExp type=&quot;Bool&quot;&gt;0&lt;/usePerRangeCertNameExp&gt;&#13;&#10; &lt;checkCrl type=&quot;Bool&quot;&gt;0&lt;/checkCrl&gt;&#13;&#10; &lt;crlOverrideEnable type=&quot;Bool&quot;&gt;0&lt;/crlOverrideEnable&gt;&#13;&#10; &lt;crlOverrideUrl type=&quot;String&quot; /&gt;&#13;&#10; &lt;checkOcsp type=&quot;Bool&quot;&gt;0&lt;/checkOcsp&gt;&#13;&#10; &lt;ocspOverrideEnable type=&quot;Bool&quot;&gt;0&lt;/ocspOverrideEnable&gt;&#13;&#10; &lt;ocspOverrideUrl type=&quot;String&quot; /&gt;&#13;&#10; &lt;unknownIsRevoked type=&quot;Bool&quot;&gt;0&lt;/unknownIsRevoked&gt;&#13;&#10; &lt;certProto type=&quot;String&quot;&gt;kSCEP&lt;/certProto&gt;&#13;&#10; &lt;/ipsecCertificates&gt;&#13;&#10; &lt;ipsecCertManager type=&quot;Ixia.Aptixia.StackManager.IPSecCertManager&quot; objectid=&quot;f3dc4ef0-e9a1-48a2-b69f-c5d2b485e897&quot; version=&quot;8.1.7&quot;&gt;&#13;&#10; &lt;caURL type=&quot;String&quot; /&gt;&#13;&#10; &lt;caDN type=&quot;String&quot;&gt;CN=RootCA,C=RO,L=Bucharest,O=Ixia,OU=IxLoad,IP:201.121.87.2,email:ixia@ixiacom.com&lt;/caDN&gt;&#13;&#10; &lt;certSubjectDN type=&quot;String&quot;&gt;CN=IxiaVPN,C=RO,L=Bucharest,O=Ixia&lt;/certSubjectDN&gt;&#13;&#10; &lt;keyGenAlgo type=&quot;String&quot;&gt;kRSA_512&lt;/keyGenAlgo&gt;&#13;&#10; &lt;cacheCertFolder type=&quot;String&quot;&gt;C:\Program Files\Ixia\CachedCerts&lt;/cacheCertFolder&gt;&#13;&#10; &lt;caKeyFile type=&quot;String&quot;&gt;C:\Program Files\Ixia\ca-priv.key&lt;/caKeyFile&gt;&#13;&#10; &lt;caCrtFile type=&quot;String&quot;&gt;C:\Program Files\Ixia\ca-cert.crt&lt;/caCrtFile&gt;&#13;&#10; &lt;certNumber type=&quot;Int&quot;&gt;1&lt;/certNumber&gt;&#13;&#10; &lt;certProto type=&quot;String&quot;&gt;kSCEP&lt;/certProto&gt;&#13;&#10; &lt;createRootCA type=&quot;Bool&quot;&gt;0&lt;/createRootCA&gt;&#13;&#10; &lt;uniqueCert type=&quot;Bool&quot;&gt;0&lt;/uniqueCert&gt;&#13;&#10; &lt;descFilePath type=&quot;String&quot;&gt;C:\Program Files\Ixia\CachedCerts\sample.desc&lt;/descFilePath&gt;&#13;&#10; &lt;useDescFile type=&quot;Bool&quot;&gt;0&lt;/useDescFile&gt;&#13;&#10; &lt;/ipsecCertManager&gt;&#13;&#10; &lt;eapSimTuples type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;eapAkaTuples type=&quot;ListNode&quot; /&gt;&#13;&#10; &lt;maxInitiationRate type=&quot;Int&quot;&gt;50&lt;/maxInitiationRate&gt;&#13;&#10; &lt;maxPendingTunnels type=&quot;Int&quot;&gt;50&lt;/maxPendingTunnels&gt;&#13;&#10; &lt;negotiationStartDelay type=&quot;Int&quot;&gt;0&lt;/negotiationStartDelay&gt;&#13;&#10; &lt;teardownRate type=&quot;Int&quot;&gt;10&lt;/teardownRate&gt;&#13;&#10; &lt;burstInitiation type=&quot;Bool&quot;&gt;0&lt;/burstInitiation&gt;&#13;&#10; &lt;parallelInitiation type=&quot;Bool&quot;&gt;0&lt;/parallelInitiation&gt;&#13;&#10; &lt;enableExtraPortLogging type=&quot;Bool&quot;&gt;0&lt;/enableExtraPortLogging&gt;&#13;&#10; &lt;enableWildcardTsi type=&quot;Bool&quot;&gt;0&lt;/enableWildcardTsi&gt;&#13;&#10; &lt;enableWildcardTsr type=&quot;Bool&quot;&gt;0&lt;/enableWildcardTsr&gt;&#13;&#10; &lt;enablePlutoWildcardTsi type=&quot;Bool&quot;&gt;0&lt;/enablePlutoWildcardTsi&gt;&#13;&#10; &lt;enablePlutoModeCfgWildcardTsr type=&quot;Bool&quot;&gt;1&lt;/enablePlutoModeCfgWildcardTsr&gt;&#13;&#10; &lt;enablePlutoS2SWildcardTsr type=&quot;Bool&quot;&gt;0&lt;/enablePlutoS2SWildcardTsr&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.IPSecSessionData&gt;&#13;&#10; &lt;/typeSpecificData&gt;&#13;&#10; &lt;statViewManager type=&quot;Ixia.Aptixia.StackManager.StatViewManager&quot; objectid=&quot;7256ce27-286c-475d-b198-09b4ae306f73&quot; version=&quot;6.70.420&quot;&gt;&#13;&#10; &lt;enableStats type=&quot;Bool&quot;&gt;1&lt;/enableStats&gt;&#13;&#10; &lt;enableOverviewStats type=&quot;Bool&quot;&gt;1&lt;/enableOverviewStats&gt;&#13;&#10; &lt;enablePerSessionStats type=&quot;Bool&quot;&gt;1&lt;/enablePerSessionStats&gt;&#13;&#10; &lt;/statViewManager&gt;&#13;&#10; &lt;waitForLinkUp type=&quot;Bool&quot;&gt;0&lt;/waitForLinkUp&gt;&#13;&#10; &lt;overloadProtection type=&quot;Bool&quot;&gt;1&lt;/overloadProtection&gt;&#13;&#10; &lt;ixLoadRestObjectId type=&quot;Int&quot;&gt;1&lt;/ixLoadRestObjectId&gt;&#13;&#10; &lt;/Ixia.Aptixia.StackManager.SMSession&gt;&#13;&#10;&lt;/rpf&gt;</xml>
+ </_smSessionXml>
+ <_composerConfig ver="[0, [1, [0, [0]]]]" type="ixComposerConfig">
+ <xml type="str"></xml>
+ </_composerConfig>
+ <_quickTestConfig ver="[0, [1, [0, [0]]]]" type="ixQuickTestConfig">
+ <xml type="str">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&#13;&#10;&lt;Config&gt;&#13;&#10; &lt;configs Version=&quot;5.0&quot; /&gt;&#13;&#10;&lt;/Config&gt;</xml>
+ </_quickTestConfig>
+ <lastApiUniqueId type="int">15481</lastApiUniqueId>
+ <version type="str">8.01.106.3</version>
+ <name type="str">HTTP-vACL_IPv4_2Ports.rxf</name>
+ <comment type="str"></comment>
+ <path type="str">C:\Users\ds1\Desktop\yardstick</path>
+ <last type="str">HTTP-vCGNAPT_IPv4_2Ports.rxf</last>
+ <activeTest type="str">Test1</activeTest>
+ <chassisChain ver="[2, [1, [0, [0]]]]" oid="3" type="ixChassisChain">
+ <chassisList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixChassisSequenceContainer" itemtype="ixChassis">
+ <item ver="[1, [1, [0, [0]]]]" oid="0" type="ixChassis">
+ <name type="str">10.223.166.127</name>
+ <id type="int">1</id>
+ <hiddenCards type="NoneType">None</hiddenCards>
+ </item>
+ </chassisList>
+ <_apiUniqueId type="int">12991</_apiUniqueId>
+ <chassisMap type="dict">
+ <item>
+ <key type="int">1</key>
+ <value ref="0"/>
+ </item>
+ </chassisMap>
+ <hiddenChassis type="NoneType">None</hiddenChassis>
+ </chassisChain>
+ <AfmPortPacketRewriteConfigList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixAfmPortPacketRewriteConfigList" itemtype="ixAfmPortPacketRewriteConfig"/>
+ <networkList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixRepositoryNetworkList" itemtype="ixNullNetwork"/>
+ <dutList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixDutList" itemtype="ixDut"/>
+ <trafficList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixTrafficList" itemtype="ixActivityModel"/>
+ <testList ver="[0, [0, [1, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixTestList" itemtype="ixTestEnvelope">
+ <item ver="[18, [1, [0, [0]]]]" type="ixTestEnvelope">
+ <name type="str">Test1</name>
+ <comment type="str"></comment>
+ <enableForceOwnership type="bool">False</enableForceOwnership>
+ <enableResetPorts type="bool">False</enableResetPorts>
+ <statsRequired type="int">1</statsRequired>
+ <enableConditionalView type="bool">False</enableConditionalView>
+ <conditionalViewType type="int">0</conditionalViewType>
+ <conditionalViewList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixConditionalViewList" itemtype="ixConditionalView"/>
+ <enableReleaseConfigAfterRun type="int">0</enableReleaseConfigAfterRun>
+ <csvInterval type="int">4</csvInterval>
+ <networkFailureThreshold type="int">0</networkFailureThreshold>
+ <captureViewOptions ver="[1, [1, [0, [0]]]]" oid="9" type="ixViewOptions">
+ <runMode type="int">1</runMode>
+ <collectScheme type="int">0</collectScheme>
+ <allocatedBufferMemoryPercentage type="long">30</allocatedBufferMemoryPercentage>
+ <captureRunAfter type="int">0</captureRunAfter>
+ <captureRunDuration type="int">0</captureRunDuration>
+ <_apiUniqueId type="int">12941</_apiUniqueId>
+ </captureViewOptions>
+ <scenarioList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioList" itemtype="ixScenario">
+ <item ver="[3, [1, [0, [0]]]]" type="ixScenario">
+ <name type="str">TrafficFlow1</name>
+ <columnList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixTrafficColumnList" itemtype="ixTrafficColumn">
+ <item ver="[0, [1, [0, [0]]]]" type="ixTrafficColumn">
+ <name type="str">Client</name>
+ <elementList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioElementList" itemtype="ixScenarioElement">
+ <item ver="[1, [22, [0, [1, [0, [0]]]]]]" oid="1" type="ixNetTraffic">
+ <name type="str">HTTP client@client network</name>
+ <column type="NoneType">None</column>
+ <scenarioElementType type="str">netTraffic</scenarioElementType>
+ <enable type="int">1</enable>
+ <role type="str">Client</role>
+ <networkType type="str">ethernet</networkType>
+ <activityFunction type="str">ipTrafficAgent</activityFunction>
+ <activeRole type="str">Client</activeRole>
+ <networkActivityList ver="[0, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkActivityList" itemtype="ixNetworkActivity"/>
+ <activityGroupList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityGroupList" itemtype="ixActivityGroup"/>
+ <traffic ver="[0, [6, [1, [0, [0]]]]]" type="ixTraffic">
+ <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp>
+ <name type="str">HTTP client</name>
+ <role type="str">Client</role>
+ <activityFunction type="str">ipTrafficAgent</activityFunction>
+ <payload type="NoneType">None</payload>
+ <agentList ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="_agentListSequenceContainer" itemtype="ixAgent">
+ <item ver="[33, [0, [0, [0, [5, [1, [0, [0]]]]], [0, [0]]]], [5, [0, [0, [5, [1, [0, [0]]]]], [0, [0]]]]]" oid="15" type="HTTP_Client_plugin">
+ <enable type="int">1</enable>
+ <name type="str">newClientActivity1</name>
+ <activityFunction type="str">ipTrafficAgent</activityFunction>
+ <needToRefreshStatViews type="bool">False</needToRefreshStatViews>
+ <activeRole type="NoneType">None</activeRole>
+ <cmdListLoops type="int">0</cmdListLoops>
+ <cmdPercentagePool ver="[0, [1, [0, [0]]]]" type="ixCommandPercentagePool">
+ <seed type="int">1</seed>
+ <percentageCommandList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandPercentageInfoList" itemtype="ixCommandPercentageInfo"/>
+ <_apiUniqueId type="int">12943</_apiUniqueId>
+ </cmdPercentagePool>
+ <sources ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixSourceList" itemtype="ixSource"/>
+ <destinations ver="[1, [3, [0, [0, [0], [0]], [0]]]]" type="ixDestinationList" itemtype="ixDestination">
+ <item ver="[0, [3, [1, [0, [0]]]]]" type="ixAgentDestination">
+ <name type="str">HTTP server_newServerActivity1</name>
+ <portMapPolicy type="str">portPairs</portMapPolicy>
+ <sameAs type="str"></sameAs>
+ <validPortMapPolicies type="list">
+ <item type="str">portPairs</item>
+ <item type="str">portMesh</item>
+ <item type="str">customMesh</item>
+ </validPortMapPolicies>
+ <inUse type="bool">True</inUse>
+ <customPortMap type="NoneType">None</customPortMap>
+ <sourceCommunity ref="1"/>
+ <destinationCommunity ver="[1, [22, [0, [1, [0, [0]]]]]]" oid="18" type="ixNetTraffic">
+ <name type="str">HTTP server@server network</name>
+ <column type="NoneType">None</column>
+ <scenarioElementType type="str">netTraffic</scenarioElementType>
+ <enable type="int">1</enable>
+ <role type="str">Server</role>
+ <networkType type="str">ethernet</networkType>
+ <activityFunction type="str">ipTrafficAgent</activityFunction>
+ <activeRole type="str">Server</activeRole>
+ <networkActivityList ver="[0, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkActivityList" itemtype="ixNetworkActivity"/>
+ <activityGroupList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityGroupList" itemtype="ixActivityGroup"/>
+ <traffic ver="[0, [6, [1, [0, [0]]]]]" type="ixTraffic">
+ <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp>
+ <name type="str">HTTP server</name>
+ <role type="str">Server</role>
+ <activityFunction type="str">ipTrafficAgent</activityFunction>
+ <payload type="NoneType">None</payload>
+ <agentList ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="_agentListSequenceContainer" itemtype="ixAgent">
+ <item ver="[17, [0, [0, [0, [5, [1, [0, [0]]]], [0]], [0, [0]]]], [2, [0, [0, [5, [1, [0, [0]]]], [0]], [0, [0]]]]]" oid="7" type="HTTP_Server_plugin">
+ <enable type="int">1</enable>
+ <name type="str">newServerActivity1</name>
+ <activityFunction type="str">ipTrafficAgent</activityFunction>
+ <needToRefreshStatViews type="bool">False</needToRefreshStatViews>
+ <activeRole type="NoneType">None</activeRole>
+ <loopValue type="int">1</loopValue>
+ <cmdListLoops type="int">0</cmdListLoops>
+ <cmdPercentagePool type="NoneType">None</cmdPercentagePool>
+ <sources ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixSourceList" itemtype="ixSource"/>
+ <destinations ver="[1, [3, [0, [0, [0], [0]], [0]]]]" type="ixDestinationList" itemtype="ixDestination"/>
+ <flowPercentage type="float">100.0</flowPercentage>
+ <httpPort type="str">80</httpPort>
+ <httpsPort type="str">443</httpsPort>
+ <requestTimeout type="int">300</requestTimeout>
+ <minResponseDelay type="int">0</minResponseDelay>
+ <maxResponseDelay type="int">0</maxResponseDelay>
+ <acceptSslConnections type="int">0</acceptSslConnections>
+ <enablesslRecordSize type="int">0</enablesslRecordSize>
+ <validateCertificate type="int">0</validateCertificate>
+ <sslRecordSize type="str">16384</sslRecordSize>
+ <urlStatsCount type="int">10</urlStatsCount>
+ <rstTimeout type="int">100</rstTimeout>
+ <enableEsm type="int">0</enableEsm>
+ <esm type="int">1460</esm>
+ <enableTos type="bool">False</enableTos>
+ <enableVlanPriority type="int">0</enableVlanPriority>
+ <vlanPriority type="int">0</vlanPriority>
+ <enableIntegrityCheck type="int">0</enableIntegrityCheck>
+ <tos type="int">0</tos>
+ <precedenceTOS type="int">0</precedenceTOS>
+ <delayTOS type="int">0</delayTOS>
+ <throughputTOS type="int">0</throughputTOS>
+ <reliabilityTOS type="int">0</reliabilityTOS>
+ <enablePerServerPerURLstat type="int">0</enablePerServerPerURLstat>
+ <responseHeaderList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixResponseHeaderList" itemtype="ixResponseHeader">
+ <item ver="[0, [1, [0, [0]]]]" type="ixResponseHeader">
+ <name type="str">200_OK</name>
+ <description type="str">OK</description>
+ <code type="str">200</code>
+ <mimeType type="str">text/plain</mimeType>
+ <dateMode type="int">2</dateMode>
+ <dateTimeValue type="str">2014/11/22 07:27:01</dateTimeValue>
+ <dateIncrementEnable type="bool">False</dateIncrementEnable>
+ <dateIncrementBy type="int">5</dateIncrementBy>
+ <dateIncrementFor type="int">1</dateIncrementFor>
+ <dateZone type="str">GMT</dateZone>
+ <expirationMode type="int">0</expirationMode>
+ <expirationDateTimeValue type="str">2005/03/04 21:55:04</expirationDateTimeValue>
+ <expirationAfterRequestValue type="int">3600</expirationAfterRequestValue>
+ <expirationAfterLastModifiedValue type="int">3600</expirationAfterLastModifiedValue>
+ <lastModifiedMode type="int">1</lastModifiedMode>
+ <lastModifiedDateTimeValue type="str">2005/02/02 21:55:04</lastModifiedDateTimeValue>
+ <lastModifiedIncrementEnable type="bool">False</lastModifiedIncrementEnable>
+ <lastModifiedIncrementBy type="int">5</lastModifiedIncrementBy>
+ <lastModifiedIncrementFor type="int">1</lastModifiedIncrementFor>
+ <responseList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixwebHttpResponseList" itemtype="_httpResponseString"/>
+ <readOnly type="bool">True</readOnly>
+ <enableCustomPutResponse type="bool">False</enableCustomPutResponse>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12972</_apiUniqueId>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixResponseHeader">
+ <name type="str">404_PageNotFound</name>
+ <description type="str">Page not found</description>
+ <code type="str">404</code>
+ <mimeType type="str">text/plain</mimeType>
+ <dateMode type="int">2</dateMode>
+ <dateTimeValue type="str">2014/11/22 07:27:01</dateTimeValue>
+ <dateIncrementEnable type="bool">False</dateIncrementEnable>
+ <dateIncrementBy type="int">5</dateIncrementBy>
+ <dateIncrementFor type="int">1</dateIncrementFor>
+ <dateZone type="str">GMT</dateZone>
+ <expirationMode type="int">0</expirationMode>
+ <expirationDateTimeValue type="str">2005/03/04 21:55:04</expirationDateTimeValue>
+ <expirationAfterRequestValue type="int">3600</expirationAfterRequestValue>
+ <expirationAfterLastModifiedValue type="int">3600</expirationAfterLastModifiedValue>
+ <lastModifiedMode type="int">1</lastModifiedMode>
+ <lastModifiedDateTimeValue type="str">2005/02/02 21:55:04</lastModifiedDateTimeValue>
+ <lastModifiedIncrementEnable type="bool">False</lastModifiedIncrementEnable>
+ <lastModifiedIncrementBy type="int">5</lastModifiedIncrementBy>
+ <lastModifiedIncrementFor type="int">1</lastModifiedIncrementFor>
+ <responseList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixwebHttpResponseList" itemtype="_httpResponseString"/>
+ <readOnly type="bool">True</readOnly>
+ <enableCustomPutResponse type="bool">False</enableCustomPutResponse>
+ <objectID type="int">1</objectID>
+ <_apiUniqueId type="int">12973</_apiUniqueId>
+ </item>
+ </responseHeaderList>
+ <cookieList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixCookieList" itemtype="ixCookieObject">
+ <item ver="[0, [1, [0, [0]]]]" type="ixCookieObject">
+ <name type="str">UserCookie</name>
+ <description type="str">Name of User</description>
+ <type type="int">2</type>
+ <mode type="int">3</mode>
+ <cookieContentList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixCookieContentList" itemtype="ixCookieContent">
+ <item ver="[0, [1, [0, [0]]]]" type="ixCookieContent">
+ <name type="str">firstName</name>
+ <value type="str">Joe</value>
+ <path type="str"></path>
+ <maxAge type="str"></maxAge>
+ <domain type="str"></domain>
+ <other type="str"></other>
+ <objectID type="int">0</objectID>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixCookieContent">
+ <name type="str">lastName</name>
+ <value type="str">Smith</value>
+ <path type="str"></path>
+ <maxAge type="str"></maxAge>
+ <domain type="str"></domain>
+ <other type="str"></other>
+ <objectID type="int">1</objectID>
+ </item>
+ </cookieContentList>
+ <readOnly type="bool">True</readOnly>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12987</_apiUniqueId>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixCookieObject">
+ <name type="str">LoginCookie</name>
+ <description type="str">Login name and password</description>
+ <type type="int">2</type>
+ <mode type="int">2</mode>
+ <cookieContentList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixCookieContentList" itemtype="ixCookieContent">
+ <item ver="[0, [1, [0, [0]]]]" type="ixCookieContent">
+ <name type="str">name</name>
+ <value type="str">joesmith</value>
+ <path type="str"></path>
+ <maxAge type="str"></maxAge>
+ <domain type="str"></domain>
+ <other type="str"></other>
+ <objectID type="int">0</objectID>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixCookieContent">
+ <name type="str">password</name>
+ <value type="str">foobar</value>
+ <path type="str"></path>
+ <maxAge type="str"></maxAge>
+ <domain type="str"></domain>
+ <other type="str"></other>
+ <objectID type="int">1</objectID>
+ </item>
+ </cookieContentList>
+ <readOnly type="bool">True</readOnly>
+ <objectID type="int">1</objectID>
+ <_apiUniqueId type="int">12988</_apiUniqueId>
+ </item>
+ </cookieList>
+ <webPageList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWebPageList" itemtype="ixWebPageObject">
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/1b.html</page>
+ <response ver="[0, [1, [0, [0]]]]" oid="2" type="ixResponseHeader">
+ <name type="str">200_OK</name>
+ <description type="str">OK</description>
+ <code type="str">200</code>
+ <mimeType type="str">text/plain</mimeType>
+ <dateMode type="int">2</dateMode>
+ <dateTimeValue type="str">2014/11/22 07:27:01</dateTimeValue>
+ <dateIncrementEnable type="bool">False</dateIncrementEnable>
+ <dateIncrementBy type="int">5</dateIncrementBy>
+ <dateIncrementFor type="int">1</dateIncrementFor>
+ <dateZone type="str">GMT</dateZone>
+ <expirationMode type="int">0</expirationMode>
+ <expirationDateTimeValue type="str">2005/03/04 21:55:04</expirationDateTimeValue>
+ <expirationAfterRequestValue type="int">3600</expirationAfterRequestValue>
+ <expirationAfterLastModifiedValue type="int">3600</expirationAfterLastModifiedValue>
+ <lastModifiedMode type="int">1</lastModifiedMode>
+ <lastModifiedDateTimeValue type="str">2005/02/02 21:55:04</lastModifiedDateTimeValue>
+ <lastModifiedIncrementEnable type="bool">False</lastModifiedIncrementEnable>
+ <lastModifiedIncrementBy type="int">5</lastModifiedIncrementBy>
+ <lastModifiedIncrementFor type="int">1</lastModifiedIncrementFor>
+ <responseList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixwebHttpResponseList" itemtype="_httpResponseString"/>
+ <readOnly type="bool">True</readOnly>
+ <enableCustomPutResponse type="bool">False</enableCustomPutResponse>
+ <_apiUniqueId type="int">12984</_apiUniqueId>
+ </response>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">1-1</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12974</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/4k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">4096-4096</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">1</objectID>
+ <_apiUniqueId type="int">12975</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/8k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">8192-8192</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">2</objectID>
+ <_apiUniqueId type="int">12976</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/16k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">16536-16536</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">3</objectID>
+ <_apiUniqueId type="int">12977</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/32k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">32768</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">4</objectID>
+ <_apiUniqueId type="int">12978</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/64k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">65536</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">5</objectID>
+ <_apiUniqueId type="int">12979</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/128k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">131072</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">6</objectID>
+ <_apiUniqueId type="int">12980</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/256k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">262144</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">7</objectID>
+ <_apiUniqueId type="int">12981</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/512k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">524288</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">8</objectID>
+ <_apiUniqueId type="int">12982</_apiUniqueId>
+ </item>
+ <item ver="[1, [1, [0, [0]]]]" type="ixWebPageObject">
+ <page type="str">/1024k.html</page>
+ <response ref="2"/>
+ <payloadType type="str">range</payloadType>
+ <payloadSize type="str">1048576</payloadSize>
+ <payloadFile type="str">&lt;specify file&gt;</payloadFile>
+ <cookie type="NoneType">None</cookie>
+ <customPayloadId type="int">-1</customPayloadId>
+ <Md5Option type="int">3</Md5Option>
+ <chunkSize type="str">512-1024</chunkSize>
+ <objectID type="int">9</objectID>
+ <_apiUniqueId type="int">12983</_apiUniqueId>
+ </item>
+ </webPageList>
+ <ServerCiphers type="str">DEFAULT</ServerCiphers>
+ <privateKeyPassword type="str"></privateKeyPassword>
+ <privateKey type="str"></privateKey>
+ <certificate type="str"></certificate>
+ <caCert type="str"></caCert>
+ <enableDHsupport type="int">0</enableDHsupport>
+ <enableSslSendCloseNotify type="int">0</enableSslSendCloseNotify>
+ <dhParams type="str"></dhParams>
+ <tcpCloseOption type="int">0</tcpCloseOption>
+ <docrootfile type="str"></docrootfile>
+ <customPayloadList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixCustomPayloadList" itemtype="ixCustomPayloadObject">
+ <item ver="[0, [1, [0, [0]]]]" type="ixCustomPayloadObject">
+ <id type="int">0</id>
+ <name type="str">AsciiCustomPayload</name>
+ <payloadPosition type="str">Start With</payloadPosition>
+ <payloadmode type="int">0</payloadmode>
+ <asciiPayloadValue type="str">Ixia-Ixload-Http-Server-Custom-Payload</asciiPayloadValue>
+ <hexPayloadValue type="str"></hexPayloadValue>
+ <repeat type="int">0</repeat>
+ <offset type="int">1</offset>
+ <readOnly type="bool">True</readOnly>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12985</_apiUniqueId>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixCustomPayloadObject">
+ <id type="int">1</id>
+ <name type="str">HexCustomPayload</name>
+ <payloadPosition type="str">Start With</payloadPosition>
+ <payloadmode type="int">1</payloadmode>
+ <asciiPayloadValue type="str"></asciiPayloadValue>
+ <hexPayloadValue type="str">49 78 69 61 2d 49 78 6c 6f 61 64 2d 48 74 74 70 2d 53 65 72 76 65 72 2d 43 75 73 74 6f 6d 2d 50 61 79 6c 6f 61 64</hexPayloadValue>
+ <repeat type="int">0</repeat>
+ <offset type="int">1</offset>
+ <readOnly type="bool">True</readOnly>
+ <objectID type="int">1</objectID>
+ <_apiUniqueId type="int">12986</_apiUniqueId>
+ </item>
+ </customPayloadList>
+ <enableMD5Checksum type="bool">False</enableMD5Checksum>
+ <integrityCheckOption type="str">Custom MD5</integrityCheckOption>
+ <uniqueID type="int">2</uniqueID>
+ <enableChunkEncoding type="bool">False</enableChunkEncoding>
+ <docrootChunkSize type="str">512-1024</docrootChunkSize>
+ <urlPageSize type="int">1024</urlPageSize>
+ <enableChunkedRequest type="bool">False</enableChunkedRequest>
+ <enableNewSslSupport type="bool">False</enableNewSslSupport>
+ <enableHTTP2 type="bool">False</enableHTTP2>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12971</_apiUniqueId>
+ <commandIdCounter type="int">0</commandIdCounter>
+ <networkPluginSettings ver="[0]" type="ixNetworkActivityPluginSupport">
+ <serializedNetworkSettingsMap ver="[0, [0, [0]]]" type="ixOrderedDict">
+ <_dict type="list"/>
+ </serializedNetworkSettingsMap>
+ <protocolName type="str">HTTP</protocolName>
+ </networkPluginSettings>
+ </item>
+ </agentList>
+ </traffic>
+ <network ver="[17, [1, [6, [1, [0, [0]]]]]]" type="ixNetworkGroup">
+ <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp>
+ <name type="str">server network</name>
+ <role type="str">Server</role>
+ <networkType type="str">none</networkType>
+ <aggregation type="int">0</aggregation>
+ <lineSpeed type="str">Default</lineSpeed>
+ <cpuAggregation type="bool">False</cpuAggregation>
+ <chassisChain ref="3"/>
+ <cardType type="str">FLEXAP1040SQ</cardType>
+ <activePortList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig"/>
+ <portList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" oid="10" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig">
+ <item ver="[3, [1, [1, [0, [0]]]]]" type="ixPort">
+ <chassisId type="int">1</chassisId>
+ <cardId type="int">2</cardId>
+ <portId type="int">6</portId>
+ <enableCapture type="bool">False</enableCapture>
+ <cardType type="str">FLEXAP10G16S</cardType>
+ <portPersistentSetting ver="[0, [1, [0, [0]]]]" type="ixPortPersistentSetting">
+ <viewFilter ver="[0, [0, [1, [0, [0]]]]]" type="ixViewProtocolFilter">
+ <agentProtoFilterMap type="dict">
+ <item>
+ <key type="str">newServerActivity1</key>
+ <value type="tuple">
+ <item type="str">HTTP</item>
+ <item type="str">tcp port 80</item>
+ </value>
+ </item>
+ </agentProtoFilterMap>
+ <filterString type="str"></filterString>
+ </viewFilter>
+ <_apiUniqueId type="int">15432</_apiUniqueId>
+ </portPersistentSetting>
+ <analyzerPartialCapture type="str">False;8191</analyzerPartialCapture>
+ <name type="str"></name>
+ <_apiUniqueId type="int">15431</_apiUniqueId>
+ <afmPort type="NoneType">None</afmPort>
+ </item>
+ </portList>
+ <comment type="str"></comment>
+ <networkRangeList ver="[0, [2, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkRangeListSequenceContainer" itemtype="ixNetworkRange">
+ <item ver="[13, [1, [1, [1, [0, [0]]]]]]" oid="4" type="ixNetworkRange">
+ <_smRangeObjectId type="str">1d9bf537-0c3d-4fdf-9b85-0a622cc77649</_smRangeObjectId>
+ <name type="str">Network Range IP-R2 in server network (152.40.40.20+1)</name>
+ <rangeGroup ver="[3, [0, [1, [0, [0]]]]]" oid="5" type="ixIpDistributionGroup">
+ <name type="str">DistGroup1</name>
+ <ipDistributionMethod type="str">consecutiveIps</ipDistributionMethod>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12961</_apiUniqueId>
+ <_networkRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWeakrefSequenceContainer" itemtype="ixBasicNetworkRange">
+ <item ref="4"/>
+ </_networkRangeList>
+ <_rangeGroupObjectId type="str">b2c21c73-bfe3-4fbc-9804-b5a8b307d893</_rangeGroupObjectId>
+ <_smPluginObjectId type="str">b85b184d-9bb4-48c2-a029-e633fee7a3c8</_smPluginObjectId>
+ </rangeGroup>
+ <enableStats type="bool">False</enableStats>
+ </item>
+ </networkRangeList>
+ <layerPlugins type="NoneType">None</layerPlugins>
+ <stack type="NoneType">None</stack>
+ <rangeGroupList ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixIpDistributionGroupList" itemtype="ixIpDistributionGroup">
+ <item ref="5"/>
+ </rangeGroupList>
+ <dynamicControlPlaneSetting type="int">0</dynamicControlPlaneSetting>
+ <linkLayerOptions type="int">0</linkLayerOptions>
+ <ipSourcePortFrom type="int">1024</ipSourcePortFrom>
+ <ipSourcePortTo type="int">65535</ipSourcePortTo>
+ <emulatedRouterGateway type="str">0.0.0.0</emulatedRouterGateway>
+ <emulatedRouterSubnet type="str">255.255.255.0</emulatedRouterSubnet>
+ <emulatedRouterGatewayIPv6 type="str">::</emulatedRouterGatewayIPv6>
+ <emulatedRouterSubnetIPv6 type="str">FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::0</emulatedRouterSubnetIPv6>
+ <emulatedRouterIpAddressPool ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="ixEmulatedRouterIpAddressRange"/>
+ <macMappingMode type="int">0</macMappingMode>
+ <arpSettings ver="[0, [1, [0, [0]]]]" type="ixArpSettings">
+ <gratuitousArp type="bool">True</gratuitousArp>
+ <processGratArp type="bool">False</processGratArp>
+ </arpSettings>
+ <dnsParameters ver="[1, [1, [0, [0]]]]" type="ixDns">
+ <enable type="int">0</enable>
+ <cacheTimeout type="int">30000</cacheTimeout>
+ <serverList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsServerItem"/>
+ <suffixList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsSuffixItem"/>
+ </dnsParameters>
+ <tcpParameters ver="[0, [1, [0, [0]]]]" type="ixTcpParameters">
+ <tcpParametersFull ver="[4, [1, [0, [0]]]]" oid="6" type="ixTcpParametersFull">
+ <enableCongestionNotification type="bool">False</enableCongestionNotification>
+ <enableTimeStamp type="bool">True</enableTimeStamp>
+ <timeWaitRecycle type="bool">True</timeWaitRecycle>
+ <timeWaitReuse type="bool">False</timeWaitReuse>
+ <enableTxBwLimit type="bool">False</enableTxBwLimit>
+ <txBwLimitUnit type="int">0</txBwLimitUnit>
+ <txBwLimit type="int">1024</txBwLimit>
+ <enableRxBwLimit type="bool">False</enableRxBwLimit>
+ <rxBwLimitUnit type="int">0</rxBwLimitUnit>
+ <rxBwLimit type="int">1024</rxBwLimit>
+ <finTimeout type="int">60</finTimeout>
+ <keepAliveInterval type="int">7200</keepAliveInterval>
+ <keepAliveProbes type="int">75</keepAliveProbes>
+ <keepAliveTime type="int">9</keepAliveTime>
+ <synRetries type="int">5</synRetries>
+ <synAckRetries type="int">5</synAckRetries>
+ <retransmitRetries type="int">15</retransmitRetries>
+ <transmitBuffer type="int">1024</transmitBuffer>
+ <receiveBuffer type="int">1024</receiveBuffer>
+ <tcpSack type="bool">True</tcpSack>
+ <windowScaling type="bool">False</windowScaling>
+ <rtoMin type="int">1000</rtoMin>
+ <rtoMax type="int">120000</rtoMax>
+ </tcpParametersFull>
+ <tcpParametersFull ref="6"/>
+ </tcpParameters>
+ <impairment ver="[5, [1, [0, [0]]]]" type="ixImpairment">
+ <enable type="bool">False</enable>
+ <addDelay type="bool">True</addDelay>
+ <addReorder type="bool">False</addReorder>
+ <addDrop type="bool">False</addDrop>
+ <addDuplicate type="bool">False</addDuplicate>
+ <randomizeSeed type="bool">False</randomizeSeed>
+ <delay type="int">1</delay>
+ <reorder type="int">1</reorder>
+ <reorderLength type="int">1</reorderLength>
+ <sourcePort type="int">0</sourcePort>
+ <destinationPort type="int">0</destinationPort>
+ <drop type="int">1</drop>
+ <duplicate type="int">1</duplicate>
+ <jitter type="int">0</jitter>
+ <gap type="int">1</gap>
+ <destinationIp type="str">any</destinationIp>
+ <typeOfService type="str">any</typeOfService>
+ <protocol type="str">any</protocol>
+ <addFragmentation type="bool">False</addFragmentation>
+ <fragmentationType type="str">FragmentationPercent</fragmentationType>
+ <fragmentPercent type="int">50</fragmentPercent>
+ <mtu type="int">1000</mtu>
+ <fragmentSequenceSkip type="int">1</fragmentSequenceSkip>
+ <fragmentSequenceLength type="int">1</fragmentSequenceLength>
+ <_seed type="int">1</_seed>
+ </impairment>
+ <_portGroupId type="str">c4ecfc60-64ac-4dc2-9410-e0f58d84f229</_portGroupId>
+ <_smExternalLinks ver="[0, [1, [0, [0]]]]" type="_smExternalLinkersMap">
+ <externalLinks type="dict"/>
+ </_smExternalLinks>
+ <smVersion type="int">1</smVersion>
+ </network>
+ <activityParameters ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixActivityParametersList" itemtype="ixActivityParameters">
+ <item ver="[0, [19, [1, [1, [0, [0]]]]]]" type="ixActivity">
+ <agent ref="7"/>
+ <protocolAndType type="str">HTTP Server</protocolAndType>
+ <name type="str">newServerActivity1</name>
+ <enable type="bool">True</enable>
+ <timeline ver="[0, [2, [2, [1, [1, [0, [0]]]]]]]" oid="8" type="ixMatchLongestTimeline"/>
+ <customParameters type="NoneType">None</customParameters>
+ <role type="str">Server</role>
+ <activeRole type="str">Server</activeRole>
+ <objectivePercent type="float">100.0</objectivePercent>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12989</_apiUniqueId>
+ <_objectiveValue type="int">100</_objectiveValue>
+ <timelineScale type="float">1.0</timelineScale>
+ </item>
+ </activityParameters>
+ <timeline ref="8"/>
+ <communityCapture ver="[0, [1, [0, [0]]]]" type="ixViewCommunityCapture">
+ <captureViewOptions ref="9"/>
+ <filter ver="[0, [1, [0, [0]]]]" type="ixViewFilter">
+ <filterString type="str"></filterString>
+ </filter>
+ <portList ref="10"/>
+ <enable type="bool">True</enable>
+ <_apiUniqueId type="int">12970</_apiUniqueId>
+ </communityCapture>
+ <payload type="NoneType">None</payload>
+ <activityIpWiring ver="[0, [1, [0, [0]]]]" oid="11" type="ixRangeAgentEndpointWiring">
+ <rangeAgentConnections type="list"/>
+ <_apiUniqueId type="int">12956</_apiUniqueId>
+ <rangeAgentDict ver="[0, [0, [0]]]" type="ixOrderedDict">
+ <_dict type="list">
+ <item type="tuple">
+ <item ref="4"/>
+ <item ver="[0, [1, [0, [0]]]]" type="ixRangeAgentWiring">
+ <range ref="4"/>
+ <agentEndpointConnections type="list"/>
+ <agentConnectionsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
+ <_dict type="list">
+ <item type="tuple">
+ <item ref="7"/>
+ <item ver="[0, [1, [0, [0]]]]" type="ixAgentEndpointWiring">
+ <agent ref="7"/>
+ <endpoints type="list"/>
+ <endpointsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
+ <_dict type="list">
+ <item type="tuple">
+ <item type="str">HTTP Server</item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
+ <endpointName type="str">HTTP Server</endpointName>
+ <isAvailable type="bool">True</isAvailable>
+ </item>
+ </item>
+ </_dict>
+ </endpointsDict>
+ </item>
+ </item>
+ </_dict>
+ </agentConnectionsDict>
+ </item>
+ </item>
+ </_dict>
+ </rangeAgentDict>
+ </activityIpWiring>
+ <tcpAccelerationAllowedFlag type="bool">True</tcpAccelerationAllowedFlag>
+ <iterations type="int">1</iterations>
+ <standbyTime type="int">0</standbyTime>
+ <offlineTime type="int">0</offlineTime>
+ <sustainTime type="int">83</sustainTime>
+ <iterationTime type="int">83</iterationTime>
+ <totalTime type="int">83</totalTime>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12955</_apiUniqueId>
+ <isVisible type="bool">True</isVisible>
+ <activityIpWiring ref="11"/>
+ <_portOperationModesAllowed type="dict">
+ <item>
+ <key type="int">0</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">1</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">2</key>
+ <value type="bool">False</value>
+ </item>
+ <item>
+ <key type="int">3</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">4</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">8</key>
+ <value type="bool">True</value>
+ </item>
+ </_portOperationModesAllowed>
+ <_tcpAccelerationAllowed type="dict">
+ <item>
+ <key type="int">0</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">1</key>
+ <value type="bool">False</value>
+ </item>
+ </_tcpAccelerationAllowed>
+ </destinationCommunity>
+ <destinationAgentName type="str">newServerActivity1</destinationAgentName>
+ <portRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixIntRangeList" itemtype="ixIntRange">
+ <item ver="[1, [1, [0, [0]]]]" type="ixIntRange">
+ <intRange type="str">80</intRange>
+ <objectID type="int">0</objectID>
+ <iStartingValue type="int">80</iStartingValue>
+ <iCount type="int">1</iCount>
+ </item>
+ </portRangeList>
+ <count type="int">1</count>
+ </item>
+ </destinations>
+ <flowPercentage type="float">100.0</flowPercentage>
+ <maxSessions type="int">1</maxSessions>
+ <maxStreams type="int">1</maxStreams>
+ <httpVersion type="int">1</httpVersion>
+ <keepAlive type="bool">False</keepAlive>
+ <maxPersistentRequests type="int">0</maxPersistentRequests>
+ <followHttpRedirects type="int">0</followHttpRedirects>
+ <enableCookieSupport type="int">0</enableCookieSupport>
+ <maxPipeline type="int">1</maxPipeline>
+ <urlStatsCount type="int">10</urlStatsCount>
+ <enableHttpProxy type="int">0</enableHttpProxy>
+ <httpProxy type="str">:80</httpProxy>
+ <enableHttpsProxy type="int">0</enableHttpsProxy>
+ <httpsProxy type="str">:443</httpsProxy>
+ <browserEmulation type="int">1</browserEmulation>
+ <browserEmulationName type="str">Custom1</browserEmulationName>
+ <enableSsl type="int">0</enableSsl>
+ <sslVersion type="int">3</sslVersion>
+ <sslReuseMethod type="int">0</sslReuseMethod>
+ <sequentialSessionReuse type="int">0</sequentialSessionReuse>
+ <enablesslRecordSize type="int">0</enablesslRecordSize>
+ <validateCertificate type="int">0</validateCertificate>
+ <sslRecordSize type="str">16384</sslRecordSize>
+ <enableSslSendCloseNotify type="int">0</enableSslSendCloseNotify>
+ <enableUnidirectionalClose type="int">0</enableUnidirectionalClose>
+ <privateKeyPassword type="str"></privateKeyPassword>
+ <privateKey type="str"></privateKey>
+ <certificate type="str"></certificate>
+ <caCert type="str"></caCert>
+ <clientCiphers type="str">DEFAULT</clientCiphers>
+ <enableEsm type="int">0</enableEsm>
+ <enablePerConnCookieSupport type="int">0</enablePerConnCookieSupport>
+ <perHeaderPercentDist type="int">0</perHeaderPercentDist>
+ <enablemetaRedirectSupport type="int">0</enablemetaRedirectSupport>
+ <esm type="int">1460</esm>
+ <enableVlanPriority type="int">0</enableVlanPriority>
+ <vlanPriority type="int">0</vlanPriority>
+ <enableTos type="bool">False</enableTos>
+ <tos type="int">0</tos>
+ <precedenceTOS type="int">0</precedenceTOS>
+ <delayTOS type="int">0</delayTOS>
+ <throughputTOS type="int">0</throughputTOS>
+ <reliabilityTOS type="int">0</reliabilityTOS>
+ <commandTimeout type="int">600</commandTimeout>
+ <commandTimeout_ms type="int">0</commandTimeout_ms>
+ <enableConsecutiveIpsPerSession type="int">0</enableConsecutiveIpsPerSession>
+ <enableAchieveCCFirst type="int">0</enableAchieveCCFirst>
+ <enableTrafficDistributionForCC type="int">0</enableTrafficDistributionForCC>
+ <contentLengthDeviationTolerance type="int">0</contentLengthDeviationTolerance>
+ <actionList ver="[1, [1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]]" type="ixHttpCommandList" itemtype="ixConfig">
+ <item ver="[0, [0, [0, [0, [1, [0, [0]]]]]]]" type="ixStartCommand">
+ <commandId type="int">-2</commandId>
+ <commandType type="str">START</commandType>
+ <cmdName type="str">Start</cmdName>
+ <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
+ <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
+ <name type="str">Output1</name>
+ <outputType type="int">0</outputType>
+ <destCmdId type="int">1</destCmdId>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12948</_apiUniqueId>
+ <destinationCommandIdx type="int">1</destinationCommandIdx>
+ </item>
+ </outputList>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12945</_apiUniqueId>
+ </item>
+ <item ver="[0, [0, [2, [1, [0, [0]]]]], [0, [0, [1, [0, [0]]]]]]" type="ixHttpCommand">
+ <commandId type="int">1</commandId>
+ <commandType type="str">GET</commandType>
+ <cmdName type="str">Get 1</cmdName>
+ <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput">
+ <item ver="[1, [1, [0, [0]]]]" type="ixCommandOutput">
+ <name type="str">Output1</name>
+ <outputType type="int">0</outputType>
+ <destCmdId type="int">-3</destCmdId>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12949</_apiUniqueId>
+ <destinationCommandIdx type="int">2</destinationCommandIdx>
+ </item>
+ </outputList>
+ <destination type="str">HTTP server_newServerActivity1:80</destination>
+ <pageObject type="str">/1b.html</pageObject>
+ <abort type="str">None</abort>
+ <arguments type="str"></arguments>
+ <namevalueargs type="str"></namevalueargs>
+ <profile type="int">-1</profile>
+ <enableDi type="int">0</enableDi>
+ <sendMD5ChkSumHeader type="int">0</sendMD5ChkSumHeader>
+ <sendingChunkSize type="str">None</sendingChunkSize>
+ <sslProfile type="int">-1</sslProfile>
+ <method type="int">-1</method>
+ <useSsl type="bool">False</useSsl>
+ <windowSize type="str">65536</windowSize>
+ <streamIden type="int">3</streamIden>
+ <pingFreq type="int">10</pingFreq>
+ <objectID type="int">1</objectID>
+ <_apiUniqueId type="int">12946</_apiUniqueId>
+ </item>
+ <item ver="[0, [0, [0, [0, [1, [0, [0]]]]]]]" type="ixStopCommand">
+ <commandId type="int">-3</commandId>
+ <commandType type="str">STOP</commandType>
+ <cmdName type="str">Stop</cmdName>
+ <outputList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixCommandOutputList" itemtype="ixCommandOutput"/>
+ <objectID type="int">2</objectID>
+ <_apiUniqueId type="int">12947</_apiUniqueId>
+ </item>
+ </actionList>
+ <headerList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixwebHttpHeaderList" itemtype="_httpHeaderString">
+ <item ver="[1, [0, [0, [0], [0], [0]]], [1, [0, [0]]]]" type="_httpHeaderString">
+ <data type="str">Accept: */*</data>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12950</_apiUniqueId>
+ </item>
+ <item ver="[1, [0, [0, [0], [0], [0]]], [1, [0, [0]]]]" type="_httpHeaderString">
+ <data type="str">Accept-Language: en-us</data>
+ <objectID type="int">1</objectID>
+ <_apiUniqueId type="int">12951</_apiUniqueId>
+ </item>
+ <item ver="[1, [0, [0, [0], [0], [0]]], [1, [0, [0]]]]" type="_httpHeaderString">
+ <data type="str">Accept-Encoding: gzip, deflate</data>
+ <objectID type="int">2</objectID>
+ <_apiUniqueId type="int">12952</_apiUniqueId>
+ </item>
+ <item ver="[1, [0, [0, [0], [0], [0]]], [1, [0, [0]]]]" type="_httpHeaderString">
+ <data type="str">User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)</data>
+ <objectID type="int">3</objectID>
+ <_apiUniqueId type="int">12953</_apiUniqueId>
+ </item>
+ </headerList>
+ <profileList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixHttpCommandProfileList" itemtype="ixHttpCommandProfile"/>
+ <sslProfileList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixHttpCommandSSLProfileList" itemtype="ixHttpCommandSSLProfile"/>
+ <cookieJarSize type="int">10</cookieJarSize>
+ <cookieRejectProbability type="float">0.0</cookieRejectProbability>
+ <ipPreference type="int">2</ipPreference>
+ <tcpCloseOption type="int">0</tcpCloseOption>
+ <piggybackAck type="int">1</piggybackAck>
+ <enableLargeHeader type="int">0</enableLargeHeader>
+ <maxHeaderLen type="int">1024</maxHeaderLen>
+ <useAllIPs type="int">0</useAllIPs>
+ <enableDecompressSupport type="int">0</enableDecompressSupport>
+ <enableIntegrityCheckSupport type="int">0</enableIntegrityCheckSupport>
+ <enableCRCCheckSupport type="int">0</enableCRCCheckSupport>
+ <uniqueID type="int">1</uniqueID>
+ <disableDnsResolutionCache type="int">0</disableDnsResolutionCache>
+ <methodProfileList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixMethodProfileList" itemtype="ixMethodProfile"/>
+ <httpsTunnel type="str">0.0.0.0</httpsTunnel>
+ <enableHttpsTunnel type="int">0</enableHttpsTunnel>
+ <exactTransactions type="int">0</exactTransactions>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12942</_apiUniqueId>
+ <uniqueID type="int">1</uniqueID>
+ <commandIdCounter type="int">1</commandIdCounter>
+ <networkPluginSettings ver="[0]" type="ixNetworkActivityPluginSupport">
+ <serializedNetworkSettingsMap ver="[0, [0, [0]]]" type="ixOrderedDict">
+ <_dict type="list"/>
+ </serializedNetworkSettingsMap>
+ <protocolName type="str">HTTP</protocolName>
+ </networkPluginSettings>
+ </item>
+ </agentList>
+ </traffic>
+ <network ver="[17, [1, [6, [1, [0, [0]]]]]]" type="ixNetworkGroup">
+ <resourceSyncTimeStamp type="NoneType">None</resourceSyncTimeStamp>
+ <name type="str">client network</name>
+ <role type="str">Client</role>
+ <networkType type="str">none</networkType>
+ <aggregation type="int">0</aggregation>
+ <lineSpeed type="str">Default</lineSpeed>
+ <cpuAggregation type="bool">False</cpuAggregation>
+ <chassisChain ref="3"/>
+ <cardType type="str">FLEXAP1040SQ</cardType>
+ <activePortList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig"/>
+ <portList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixNetworkPortListSequenceContainer" itemtype="ixConfig">
+ <item ver="[3, [1, [1, [0, [0]]]]]" type="ixPort">
+ <chassisId type="int">1</chassisId>
+ <cardId type="int">2</cardId>
+ <portId type="int">5</portId>
+ <enableCapture type="bool">False</enableCapture>
+ <cardType type="str">FLEXAP10G16S</cardType>
+ <portPersistentSetting ver="[0, [1, [0, [0]]]]" type="ixPortPersistentSetting">
+ <viewFilter type="NoneType">None</viewFilter>
+ <_apiUniqueId type="int">15428</_apiUniqueId>
+ </portPersistentSetting>
+ <analyzerPartialCapture type="str">False;8191</analyzerPartialCapture>
+ <name type="str"></name>
+ <_apiUniqueId type="int">15427</_apiUniqueId>
+ <afmPort type="NoneType">None</afmPort>
+ </item>
+ </portList>
+ <comment type="str"></comment>
+ <networkRangeList ver="[0, [2, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixNetworkRangeListSequenceContainer" itemtype="ixNetworkRange">
+ <item ver="[13, [1, [1, [1, [0, [0]]]]]]" oid="12" type="ixNetworkRange">
+ <_smRangeObjectId type="str">a3559674-8d95-4020-90b3-b42eacaef105</_smRangeObjectId>
+ <name type="str">Network Range IP-R1 in client network (152.16.100.20+1)</name>
+ <rangeGroup ver="[3, [0, [1, [0, [0]]]]]" oid="13" type="ixIpDistributionGroup">
+ <name type="str">DistGroup1</name>
+ <ipDistributionMethod type="str">consecutiveIps</ipDistributionMethod>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12931</_apiUniqueId>
+ <_networkRangeList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixWeakrefSequenceContainer" itemtype="ixBasicNetworkRange">
+ <item ref="12"/>
+ </_networkRangeList>
+ <_rangeGroupObjectId type="str">aa33a76b-9c7f-48d9-a537-8d6eeec03662</_rangeGroupObjectId>
+ <_smPluginObjectId type="str">a916ae0f-0731-405d-ad19-eaade6c515f1</_smPluginObjectId>
+ </rangeGroup>
+ <enableStats type="bool">False</enableStats>
+ </item>
+ </networkRangeList>
+ <layerPlugins type="NoneType">None</layerPlugins>
+ <stack type="NoneType">None</stack>
+ <rangeGroupList ver="[1, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixIpDistributionGroupList" itemtype="ixIpDistributionGroup">
+ <item ref="13"/>
+ </rangeGroupList>
+ <dynamicControlPlaneSetting type="int">0</dynamicControlPlaneSetting>
+ <linkLayerOptions type="int">0</linkLayerOptions>
+ <ipSourcePortFrom type="int">1024</ipSourcePortFrom>
+ <ipSourcePortTo type="int">65535</ipSourcePortTo>
+ <emulatedRouterGateway type="str">0.0.0.0</emulatedRouterGateway>
+ <emulatedRouterSubnet type="str">255.255.255.0</emulatedRouterSubnet>
+ <emulatedRouterGatewayIPv6 type="str">::</emulatedRouterGatewayIPv6>
+ <emulatedRouterSubnetIPv6 type="str">FFFF:FFFF:FFFF:FFFF:FFFF:FFFF::0</emulatedRouterSubnetIPv6>
+ <emulatedRouterIpAddressPool ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="ixEmulatedRouterIpAddressRange"/>
+ <macMappingMode type="int">0</macMappingMode>
+ <arpSettings ver="[0, [1, [0, [0]]]]" type="ixArpSettings">
+ <gratuitousArp type="bool">True</gratuitousArp>
+ <processGratArp type="bool">False</processGratArp>
+ </arpSettings>
+ <dnsParameters ver="[1, [1, [0, [0]]]]" type="ixDns">
+ <enable type="int">0</enable>
+ <cacheTimeout type="int">30000</cacheTimeout>
+ <serverList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsServerItem"/>
+ <suffixList ver="[3, [0, [0, [0], [0]], [0]]]" type="ixConfigSequenceContainer" itemtype="_ixDnsSuffixItem"/>
+ </dnsParameters>
+ <tcpParameters ver="[0, [1, [0, [0]]]]" type="ixTcpParameters">
+ <tcpParametersFull ver="[4, [1, [0, [0]]]]" oid="14" type="ixTcpParametersFull">
+ <enableCongestionNotification type="bool">False</enableCongestionNotification>
+ <enableTimeStamp type="bool">True</enableTimeStamp>
+ <timeWaitRecycle type="bool">True</timeWaitRecycle>
+ <timeWaitReuse type="bool">False</timeWaitReuse>
+ <enableTxBwLimit type="bool">False</enableTxBwLimit>
+ <txBwLimitUnit type="int">0</txBwLimitUnit>
+ <txBwLimit type="int">1024</txBwLimit>
+ <enableRxBwLimit type="bool">False</enableRxBwLimit>
+ <rxBwLimitUnit type="int">0</rxBwLimitUnit>
+ <rxBwLimit type="int">1024</rxBwLimit>
+ <finTimeout type="int">60</finTimeout>
+ <keepAliveInterval type="int">7200</keepAliveInterval>
+ <keepAliveProbes type="int">75</keepAliveProbes>
+ <keepAliveTime type="int">9</keepAliveTime>
+ <synRetries type="int">5</synRetries>
+ <synAckRetries type="int">5</synAckRetries>
+ <retransmitRetries type="int">15</retransmitRetries>
+ <transmitBuffer type="int">1024</transmitBuffer>
+ <receiveBuffer type="int">1024</receiveBuffer>
+ <tcpSack type="bool">True</tcpSack>
+ <windowScaling type="bool">False</windowScaling>
+ <rtoMin type="int">1000</rtoMin>
+ <rtoMax type="int">120000</rtoMax>
+ </tcpParametersFull>
+ <tcpParametersFull ref="14"/>
+ </tcpParameters>
+ <impairment ver="[5, [1, [0, [0]]]]" type="ixImpairment">
+ <enable type="bool">False</enable>
+ <addDelay type="bool">True</addDelay>
+ <addReorder type="bool">False</addReorder>
+ <addDrop type="bool">False</addDrop>
+ <addDuplicate type="bool">False</addDuplicate>
+ <randomizeSeed type="bool">False</randomizeSeed>
+ <delay type="int">1</delay>
+ <reorder type="int">1</reorder>
+ <reorderLength type="int">1</reorderLength>
+ <sourcePort type="int">0</sourcePort>
+ <destinationPort type="int">0</destinationPort>
+ <drop type="int">1</drop>
+ <duplicate type="int">1</duplicate>
+ <jitter type="int">0</jitter>
+ <gap type="int">1</gap>
+ <destinationIp type="str">any</destinationIp>
+ <typeOfService type="str">any</typeOfService>
+ <protocol type="str">any</protocol>
+ <addFragmentation type="bool">False</addFragmentation>
+ <fragmentationType type="str">FragmentationPercent</fragmentationType>
+ <fragmentPercent type="int">50</fragmentPercent>
+ <mtu type="int">1000</mtu>
+ <fragmentSequenceSkip type="int">1</fragmentSequenceSkip>
+ <fragmentSequenceLength type="int">1</fragmentSequenceLength>
+ <_seed type="int">1</_seed>
+ </impairment>
+ <_portGroupId type="str">865be042-32d5-426a-9e75-0908c943801f</_portGroupId>
+ <_smExternalLinks ver="[0, [1, [0, [0]]]]" type="_smExternalLinkersMap">
+ <externalLinks type="dict"/>
+ </_smExternalLinks>
+ <smVersion type="int">1</smVersion>
+ </network>
+ <activityParameters ver="[2, [0, [0, [3, [0, [0, [0], [0]], [0]]]]]]" type="ixActivityParametersList" itemtype="ixActivityParameters">
+ <item ver="[0, [19, [1, [1, [0, [0]]]]]]" type="ixActivity">
+ <agent ref="15"/>
+ <protocolAndType type="str">HTTP Client</protocolAndType>
+ <name type="str">newClientActivity1</name>
+ <enable type="bool">True</enable>
+ <timeline ver="[2, [1, [1, [0, [0]]]]]" oid="16" type="ixTimeline">
+ <name type="str">Timeline1</name>
+ <iterationTime type="int">83</iterationTime>
+ <totalTime type="int">83</totalTime>
+ <iterations type="int">1</iterations>
+ <standbyTime type="int">0</standbyTime>
+ <offlineTime type="int">0</offlineTime>
+ <sustainTime type="int">60</sustainTime>
+ <rampUpType type="int">0</rampUpType>
+ <rampUpValue type="int">30000</rampUpValue>
+ <rampUpInterval type="int">1</rampUpInterval>
+ <rampUpTime type="int">3</rampUpTime>
+ <rampDownTime type="int">20</rampDownTime>
+ <rampDownValue type="int">32000</rampDownValue>
+ <timelineType type="int">0</timelineType>
+ <objectID type="int">0</objectID>
+ </timeline>
+ <customParameters type="NoneType">None</customParameters>
+ <role type="str">Client</role>
+ <activeRole type="str">Client</activeRole>
+ <objectivePercent type="float">100.0</objectivePercent>
+ <objectiveType type="str">simulatedUsers</objectiveType>
+ <objectiveValue type="int">64000</objectiveValue>
+ <userObjectiveType type="str">simulatedUsers</userObjectiveType>
+ <userObjectiveValue type="long">64000</userObjectiveValue>
+ <constraintType type="str">ConnectionRateConstraint</constraintType>
+ <constraintValue type="int">100</constraintValue>
+ <timerGranularity type="int">100</timerGranularity>
+ <enableConstraint type="bool">False</enableConstraint>
+ <secondaryConstraintType type="str">SimulatedUserConstraint</secondaryConstraintType>
+ <secondaryConstraintValue type="int">100</secondaryConstraintValue>
+ <secondaryEnableConstraint type="bool">False</secondaryEnableConstraint>
+ <portMapPolicy type="str">portMesh</portMapPolicy>
+ <concurrentObjectiveBehavior type="int">1</concurrentObjectiveBehavior>
+ <cpsObjectiveBehavior type="int">0</cpsObjectiveBehavior>
+ <userIpMapping type="str">1:1</userIpMapping>
+ <destinationIpMapping type="str">Consecutive</destinationIpMapping>
+ <playlists ver="[1, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixPlaylistList" itemtype="ixPlaylist"/>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12954</_apiUniqueId>
+ <_objectiveValue type="int">64000</_objectiveValue>
+ <timelineScale type="float">1.0</timelineScale>
+ </item>
+ </activityParameters>
+ <timeline ref="16"/>
+ <communityCapture ver="[0, [1, [0, [0]]]]" type="ixViewCommunityCapture">
+ <captureViewOptions ref="9"/>
+ <filter ver="[0, [1, [0, [0]]]]" type="ixViewFilter">
+ <filterString type="str"></filterString>
+ </filter>
+ <portList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="_portListSequenceContainer" itemtype="ixConfig"/>
+ <enable type="bool">False</enable>
+ <_apiUniqueId type="int">12940</_apiUniqueId>
+ </communityCapture>
+ <payload type="NoneType">None</payload>
+ <activityIpWiring ver="[0, [1, [0, [0]]]]" oid="17" type="ixRangeAgentEndpointWiring">
+ <rangeAgentConnections type="list"/>
+ <_apiUniqueId type="int">12926</_apiUniqueId>
+ <rangeAgentDict ver="[0, [0, [0]]]" type="ixOrderedDict">
+ <_dict type="list">
+ <item type="tuple">
+ <item ref="12"/>
+ <item ver="[0, [1, [0, [0]]]]" type="ixRangeAgentWiring">
+ <range ref="12"/>
+ <agentEndpointConnections type="list"/>
+ <agentConnectionsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
+ <_dict type="list">
+ <item type="tuple">
+ <item ref="15"/>
+ <item ver="[0, [1, [0, [0]]]]" type="ixAgentEndpointWiring">
+ <agent ref="15"/>
+ <endpoints type="list"/>
+ <endpointsDict ver="[0, [0, [0]]]" type="ixOrderedDict">
+ <_dict type="list">
+ <item type="tuple">
+ <item type="str">HTTP Client</item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixEndpoint">
+ <endpointName type="str">HTTP Client</endpointName>
+ <isAvailable type="bool">True</isAvailable>
+ </item>
+ </item>
+ </_dict>
+ </endpointsDict>
+ </item>
+ </item>
+ </_dict>
+ </agentConnectionsDict>
+ </item>
+ </item>
+ </_dict>
+ </rangeAgentDict>
+ </activityIpWiring>
+ <tcpAccelerationAllowedFlag type="bool">True</tcpAccelerationAllowedFlag>
+ <iterations type="int">1</iterations>
+ <standbyTime type="int">0</standbyTime>
+ <offlineTime type="int">0</offlineTime>
+ <sustainTime type="int">60</sustainTime>
+ <iterationTime type="int">83</iterationTime>
+ <totalTime type="int">83</totalTime>
+ <portMapPolicy type="str">portPairs</portMapPolicy>
+ <objectiveType type="str">simulatedUsers</objectiveType>
+ <objectiveValue type="int">64000</objectiveValue>
+ <rampUpType type="int">0</rampUpType>
+ <rampUpValue type="int">30000</rampUpValue>
+ <rampUpInterval type="int">1</rampUpInterval>
+ <rampUpTime type="int">3</rampUpTime>
+ <rampDownTime type="int">20</rampDownTime>
+ <userObjectiveType type="str">simulatedUsers</userObjectiveType>
+ <userObjectiveValue type="long">64000</userObjectiveValue>
+ <totalUserObjectiveValue type="long">64000</totalUserObjectiveValue>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12925</_apiUniqueId>
+ <isVisible type="bool">True</isVisible>
+ <activityIpWiring ref="17"/>
+ <_portOperationModesAllowed type="dict">
+ <item>
+ <key type="int">0</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">1</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">2</key>
+ <value type="bool">False</value>
+ </item>
+ <item>
+ <key type="int">3</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">4</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">8</key>
+ <value type="bool">True</value>
+ </item>
+ </_portOperationModesAllowed>
+ <_tcpAccelerationAllowed type="dict">
+ <item>
+ <key type="int">0</key>
+ <value type="bool">True</value>
+ </item>
+ <item>
+ <key type="int">1</key>
+ <value type="bool">False</value>
+ </item>
+ </_tcpAccelerationAllowed>
+ </item>
+ </elementList>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12922</_apiUniqueId>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixTrafficColumn">
+ <name type="str">DUT</name>
+ <elementList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioElementList" itemtype="ixScenarioElement"/>
+ <objectID type="int">1</objectID>
+ <_apiUniqueId type="int">12923</_apiUniqueId>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixTrafficColumn">
+ <name type="str">Server</name>
+ <elementList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixScenarioElementList" itemtype="ixScenarioElement">
+ <item ref="18"/>
+ </elementList>
+ <objectID type="int">2</objectID>
+ <_apiUniqueId type="int">12924</_apiUniqueId>
+ </item>
+ </columnList>
+ <links ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixActivityLinkList" itemtype="ixActivityLink"/>
+ <appMixList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixAppMixList" itemtype="ixAppMix"/>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12921</_apiUniqueId>
+ </item>
+ </scenarioList>
+ <currentUniqueIDForAgent type="int">2</currentUniqueIDForAgent>
+ <enableNetworkDiagnostics type="bool">True</enableNetworkDiagnostics>
+ <showNetworkDiagnosticsFromApplyConfig type="bool">False</showNetworkDiagnosticsFromApplyConfig>
+ <showNetworkDiagnosticsAfterRunStops type="bool">False</showNetworkDiagnosticsAfterRunStops>
+ <resetNetworkDiagnosticsAtStartRun type="bool">False</resetNetworkDiagnosticsAtStartRun>
+ <enableNetworkDiagnosticsLogging type="bool">False</enableNetworkDiagnosticsLogging>
+ <enableTcpAdvancedStats type="bool">False</enableTcpAdvancedStats>
+ <enableFrameSizeDistributionStats type="bool">False</enableFrameSizeDistributionStats>
+ <isFrameSizeDistributionViewSupported type="bool">False</isFrameSizeDistributionViewSupported>
+ <statViewThroughputUnits type="str">Kbps</statViewThroughputUnits>
+ <totalUserObjectiveInfoList ver="[0, [3, [0, [0, [0], [0]], [0]]]]" type="ixTotalUserObjectiveInfoList" itemtype="ixTotalUserObjectiveInfo"/>
+ <activitiesGroupedByObjective type="bool">False</activitiesGroupedByObjective>
+ <eventHandlerSettings ver="[0, [1, [0, [0]]]]" type="ixEventHandlerSettings">
+ <disabledEventClasses type="str"></disabledEventClasses>
+ <disabledPorts type="str"></disabledPorts>
+ <_apiUniqueId type="int">12990</_apiUniqueId>
+ </eventHandlerSettings>
+ <allowMixedObjectiveTypes type="bool">False</allowMixedObjectiveTypes>
+ <networkProtocolOptions type="NoneType">None</networkProtocolOptions>
+ <seedForRandomBehavior type="int">0</seedForRandomBehavior>
+ <csvThroughputScalingFactor type="int">0</csvThroughputScalingFactor>
+ <reporterThroughputScalingFactor type="int">0</reporterThroughputScalingFactor>
+ <profileDirectory ver="[2, [1, [0, [0]]]]" type="ixProfileDirectory">
+ <categoryList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileCategoryList" itemtype="ixProfileCategory">
+ <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory">
+ <name type="str">Playlist</name>
+ <categoryId type="str">playlist</categoryId>
+ <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
+ <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.profile.Playlist.ixPropertyMap_PlaylistCategory$ixPropertyMap_PlaylistCategory"/>
+ <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
+ <objectID type="int">0</objectID>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory">
+ <name type="str">Random Data</name>
+ <categoryId type="str">rdge</categoryId>
+ <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
+ <pm ver="[0, [1, [0.1, [1, [0, [0]]]]]]" type="#Plugins.profile.RandomData.ixPropertyMap_RandomDataCategory$ixPropertyMap_RandomDataCategory">
+ <startcore type="int">0</startcore>
+ <totalcores type="int">1</totalcores>
+ </pm>
+ <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
+ <objectID type="int">1</objectID>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory">
+ <name type="str">Real File</name>
+ <categoryId type="str">realfile</categoryId>
+ <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
+ <pm type="NoneType">None</pm>
+ <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
+ <objectID type="int">2</objectID>
+ </item>
+ <item ver="[0, [1, [0, [0]]]]" type="ixProfileCategory">
+ <name type="str">Unified File System</name>
+ <categoryId type="str">ufs</categoryId>
+ <profileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
+ <pm type="NoneType">None</pm>
+ <temporaryProfileList ver="[0, [0, [3, [0, [0, [0], [0]], [0]]]]]" type="ixProfileList" itemtype="ixProfile"/>
+ <objectID type="int">3</objectID>
+ </item>
+ </categoryList>
+ <_profileMru type="str"></_profileMru>
+ </profileDirectory>
+ <communityList type="NoneType">None</communityList>
+ <autoUpdateAppFlowsToLatest type="bool">True</autoUpdateAppFlowsToLatest>
+ <downgradeAppLibFlowsToLatestValidVersion type="bool">True</downgradeAppLibFlowsToLatestValidVersion>
+ <objectID type="int">0</objectID>
+ <_apiUniqueId type="int">12920</_apiUniqueId>
+ <lastStatViewerConfiguration type="str"></lastStatViewerConfiguration>
+ <statManagerOptions ver="[1, [1, [0, [0]]]]" type="ixStatManagerOptions">
+ <pollingInterval type="int">2</pollingInterval>
+ <allowCsvLogging type="bool">False</allowCsvLogging>
+ <enableDataStore type="bool">False</enableDataStore>
+ <svConfiguration type="str">begin 666 &lt;data&gt;&#10;M&gt;)SMG7MOVS@2P+^*D&lt;,5&gt;[BE+8J41*6/19ND;;!I$\1I=X'KH2&quot;I4:*K(WDE&#10;M.8\[W'&lt;_4I)MV9:=[.U672SFC]:2.#-\B#,_CBPSSWZXNYX,;B ODBQ]OD&gt;'&#10;MSMX/+YZ-2UE^3. 6\F61/_2=H3-TF;MG!*&quot;P5T^2HAS\&quot;/?/]^2T3.X2.2QN&#10;MAE.K4920:ABVY'[*Y=04&amp;&gt;6#T_&lt;71^\O!J,7S\[.C\;F\.7%\&gt;G[]?//1X?'&#10;M%R]?G1S9@H/3=Z^.WQ\=+JHN%D&gt;/:&lt;!&amp;Y2^&gt;O&lt;[AEYF1N1_&lt;R,D,GN^Y&gt;U5%&#10;MQ&lt;U)=GF9I)?SZZ_EI(&quot;J[&quot;*YAO%]JE_!E;Q)LGPNX2Q*BU)&gt;3\]RT$G5LJ:&lt;&#10;M5&gt;5'E[EIC!W6B_LIS,MH579JAGF2R&gt;@LSTK094OW(I_!6L/&gt;)E$$J354;+;Q&#10;M*)5J H&gt;RE.,RRV%3X&amp;PY.NUV\&quot;[MG369!IW.RNFL7(SDN]FD3*:3];Y50H?C&#10;M!\3&gt;R3L[[0K3OH-946;7;\P]NUK(^/,Z7R&lt;3.)/EHN1@_].'PO3I4U303X&gt;9&#10;MGEU#6A:?CLUD,/^=F$'])(8.'5+''[)/YU&quot;8VHM/;R\NSLC-ZY\^'Y_=\,_N&#10;M69:7Q6?7H8'C.&gt;%GZKB&quot;U?/AY01,T?QS8+PE+?;OBN3YWE593O='H]O;V^$M&#10;M&amp;V;YY&lt;AU'#KZ^=W)6%_!M21):J:#&amp;&gt;:]A5;TL%95Z6A&gt;ZR'$TK2WN@,[SE[8&#10;M]@\.SCX,[!&quot;:NYOHXMFH+; B?&gt;(25DD6@]C,XH-)8H9L4(W!X[7&amp;D)M)^SBM&#10;MBZL\FUU&gt;F6E0&amp;UB3'ZUV;.WT(,\:M\D!3.G:^;F,DNR-L3]=*TC2\H7[;&amp;0_&#10;MGHVV2M6=?YWEU[.)'$-9&amp;@=;3/;_//G+W&gt;%3\]_+IT]^F67ETX]U-*Q/]NL/&#10;M.O3J@^\WI&amp;T'&amp;ME_+ O_N3S\[_*PCB$F@IS/TO5V/)F43U&lt;&quot;];QFISX8&amp;+?*&#10;M(J/1%,S*F%&quot;_/O[AR67YM-4R8ZJIY3B-,W,7$SE)_BUMS'DE+UL3O%9_]&quot;QO&#10;M6K*&lt;ZH_3KZ56VS@8V%9&gt;?RZ;T;!S6IO0.&quot;W6Y6I)VY_W\AILJ3VF]N*H?;5;&#10;MYT&quot;6&lt;)GE]U;&quot;QKR1C0H+W7;IIOY!?#F/1%9@-0I!\:7,II_N91Y97_S2&amp;6Z&amp;&#10;M^5U&lt;5;9FJKNMD,_[8FI8M'%Y=5/K&lt;%9U?S#:6OSVMIG/.V3&amp;#\G89IRJ?UEJ&#10;MW4&quot;Q2^IM&lt;GDU,?_*K5(+-I7'ACME$B&gt;06TE%E1(TC(DO&amp;&quot;&lt;\9(I(JB2!V('(&#10;M =\13EB-R38#FU69&gt;=6&gt;,N:44J\VTBK:U+-W&gt;7Q\: O'A!*/N)0PQAGS/1ZX&#10;MQ VH\&quot;@/'$%$R'P6^AZA9L)7AENZG0TR$STO(3I-K82%$7$\XH07U-EWQ3X+&#10;MAIY/.67B[XZWSYQY6U&gt;TMMC-S.K'2 R,7^^GR:3QS=*L+1JWW7)#ZNCX3NJK&#10;M)(7YH!R;%=0).3NH)V^7Q .&amp;7D:170I926I6E&quot;X;4M\?FHXM]6(0SOZ^$J':&#10;M=YGF^^ &amp;&lt;C]R]%^IMQK+1MLL;[;A^.X]E+=9_F4&gt;Q8W4&lt;FE0&amp;&gt;L2V6'H'&quot;8@&#10;MBWI0JJ7&amp;P*Z2!T&lt;O5XVUQ'88:X42$^LN&lt;WD]L&amp;&amp;A&amp;'QW)_R_;2QHR)NU6K;'&#10;MC^.[&lt;YB:D -YJUNL7L_38-[S#IEN/_[P;JSE!.K;YSB+8-2ZOJDXOFD5_ZA,&#10;M*+=J*U&lt;[YVYW@/T]EWES/^H:OZKL,2!J :NN^G1JB;IE)AYDDXD)F';]7;$'&#10;M2FGN=%3/Y]6RK&lt;HG(/,4(@MQ*Q?;=7G;P%KY5CNO)]EMM3 J.LVL%F^U8@*O&#10;ME:Q6=U:P&quot;BTM,^OENPPU.=LN6^LBV\V9A&quot;K3V&gt;0X-3,[EAJZ+79*;35ZGLU*&#10;M.)?I9;&gt;UM&gt;(N,]=3&amp;Z8N%M-E?&gt;B[RK?-RYWSK9Z7T7UJ9ZU)E#O0NR+RT2XX&#10;M-X06+KYEU6BEZ\1ED5[_'YE]L]ZW'W5.WY'5M#-X&amp;P^ZD^HZ(6\6]&gt;:NS*[M&#10;M\X+5\ZJYZR)O\B0ZR-(XN32#$1N?-#(=UVQ]/U]/3.'B:/.YP2)SMTO+PJ;3&#10;M=78=;4O:H\V&lt;/TOM6J99U&lt;BUE/U+&lt;_TXK1863&lt;ZP6N69F9+F:I-R)Y&quot;O)MVF&#10;MU0](C%,Y+:ZRTDC.:_C9)B++Q&quot;2?QEU3RD;FX&lt;OFJ&lt;SR@=*PP^&quot;@-+UJUB2_&#10;M0JU9NF3UXG.&gt;&lt;&quot;CJQD&quot;E1W3D,\(]&quot;41%'B,NL(!YH1=S=YXUK693]0.N[GRD&#10;M[M*L@#&gt;33,E)5\-?9=EDJ5PO^#84NNT6\[[5MWMU/-)R:;5F[;IXMU%M)Z2N&#10;M/+1M;USFIB%+D_-Q'1R,/U;66WI;#5=YQ0ZC'8X[M[U]B6@*+^!Z.C%IUV,:&#10;M/#&lt;XU]EJU&quot;ZBWD *N;2WX%T6P0/CVZG3;3Z;0FIF9/.L]('9L&quot;*\TU[7C5NU&#10;MZ+0M[KY?R65J H'ID6&amp;;#4\/V%P3WS*L,GTYG4[NCQ]KNQZ!+6J==/LU@6 3&#10;M5DU06@UAXX^-QA@LIR&amp;JGV8UL:R2?0^W1NS&lt;/JDT:6UZD667DXZ'J$;&amp;3I'4&#10;M^D%;O&gt;I=_?#N(CLR&quot;6@.Y]GMIOYOX&amp;2E7C\W6Y)RQQ,])&quot;82&lt;S&lt;Q&amp;:&lt;.59R1&#10;M@$N7&lt;.V'1*A($AEZU(E\CVE-D9A?EY@['!C)B&gt;1$&lt;O9$SO:W6DA.).=N&lt;OJN&#10;MXP2&lt;&gt;&lt;0/G(!P#B$)(T9)+%U'.V'@J&lt;!#&lt;O9*SK8#(SF1G$C.KTK.]3&lt;[?@LS&#10;MD9!_/D(R3S#&amp;8TY\CU/&quot;%?A$N2;!U%H&amp;H:L&quot;H9B/A.R!D.N.BFQ$-B(;OQ8;&#10;M[7L'\X&lt;X9+!\/&gt;H/B\?E4&quot; ?^^2C&amp;W#/I0XCD2&lt;DX4)%1 DPN:3K1U10+5V.&#10;MSUZ_,A^W.2LB$A&amp;)B.P'D:WEZ&lt;(!$98(RQ58:E_$D@E!=,P] TNFB @T)8$*&#10;MN:&quot;1$!!RA&amp;6?L.QR6\0F8A.QV1,V&lt;YD6LO[!Z+EQ#4PPD9EK7U$J;= (/@D]&#10;MSS!34D44&quot;SAQ-*6N4DR)&amp;)&quot;9O3)SW6&lt;1F A,!&amp;;OP$16(BM761F'3L!BSR24&#10;M3(2$^V#R2]=C) QDX )W7?#QIR/?BI6(2&lt;0D8K(G3)Y(NT%0@ODD,G*-D=)W&#10;ME)(B)J$K L*%9$1*CY-(:ZI\JAP5,61DGXQ&lt;^&quot;H&quot;$@&amp;)@.P'D/3N[ON!&gt;W&lt;W&#10;MD&amp;DT8.;S'(JI6:0B,9&amp;8:\2,0L4A=!T2!X$VQ(P&quot;HGQSZH7,&quot;6+F:^V'2,P^&#10;MB;G=&gt;1&amp;AB%!$:#\(K&lt;Y&gt;RV0RRY&amp;:2,TU:HK(H^ &amp;#J$T&lt; EW7$U&quot;#@%A6CDR&#10;M#$ +A=3LE9HK_HJ@1% B*/L!Y&lt;'5+/TR.&amp;JV&gt;!Y\-U^M_@VAB=!&lt;@:;#:,2%&#10;M%Q+A:X_PB$8D9&amp;%(/.5)Z2HMW3! :/8)S:V^BP!%@&quot;) OQ5 J^X@/Y&amp;?J_P$&#10;M'V0@78-. &quot;#&lt;CR,B0^81%H344T' HF[%7QE?E9.S!&quot;/B$?$8T_OQ!Z8DRQ-&#10;M 5^+12IV994BH(I1(#2FW%!1*!)R 212+&amp;1.&amp;+INA%EEKUGEFL&lt;B+!&amp;6&quot;,O^&#10;M8(E?6B(IMY&quot;2ASX(36C@*[N;CTO&quot;, 82A$+;%!*8'R,I^R8E?F&gt;)F$1,]HM)&#10;M@X?!A_.3/RPA&lt;3O8;P)(C]L_BLHH &gt;F'A(&lt;Z($I[,8EE0+4((59&lt;(R#[!&amp;3C&#10;MJ,A&amp;9&quot;.R\:NRL?G+!+AI#V+R04QZL&gt;&lt;Z4A!?:TVX#( H&lt;!GQI&gt;?Y@8I=C^++&#10;MKWU@&lt;KO/(C 1F C,WH&amp;)K$16KOU0A-) @=B&lt;DM!&gt;* C(@1P(@%\Y0;4BP W&#10;M[?E6K$1,(B81DSUATD( $TJ$9 &lt;D.0T#1SN&lt;F+P2&quot;(\%(\*CE%&quot;/.8%R0D]0&#10;MW#F]5T@NG141B8A$1/:#R,5&amp;'^926B(F$9,KF*21)[60F@@:^X0KZA&amp;E)&quot;6&quot;&#10;M&quot;\^3@9*1PLW2&gt;\7DJL,B*A&amp;5B,I^4(F[#B U'T=-ES,E0D\3J3V37-JM[D(M&#10;M8A*X3FS_R+.G-&quot;:7O5(3=QU @&quot;) _W Q5T'D)\=_ 2F :0(B2\I)9P% 0D5&#10;M:,*\4 BJ(]_1&quot;OGY=?E9.3%%/&quot;(&gt;$8_]X!&amp;W?T4F[F B=5@4 A&quot;IPHAP&quot;#A1&#10;M'%Q&quot;(53:&quot;V-&amp;8\PI&gt;\TI&lt;?M7!&quot;6&quot;\EN\_8K;\R J=Z R5+'G P\,*A4CW#/I&#10;MHY2A) [X+C@Q,-=W$95]HA*WYT%8(BR_&amp;2PQJ412=I*2&lt;1$SFT7&amp;+BC&quot;8QT1&#10;MZ2F?&quot;&quot;5B;FD9&lt;TPJ&gt;R&lt;EYI2(2&lt;1DOYC\';;G63VOZL0-&gt;_YTR(P#[OL0!T2[&#10;MD4&lt;X4Y0(%SS&quot;5&quot; &lt;&amp;L2*&gt;_C=9*_(Q U[D)9(RUYI&gt;7IFM&lt;&gt;#=U!&gt;91&amp;FE&lt;C(&#10;MU5^-!$&quot;CT%5$R# TC/0%44H 850Y0L6&amp;DK@#02_O[R 3D8G(Q-^7B=5'4&lt;7M&#10;MTW1R7YU16WZ2I%\@JLZ;VFI=&lt;S@V/#1397E4=):?&amp;))8 F:SZ&lt;#V\OE&gt;96UO&#10;M$24-$%;+#V8&amp;,==[@RR/(*]X(;4VQD[@!B;/]]RJWVV%0XBEP4RQ4''65-9K&#10;ML.#?(5SUM))??H[3ZVF]:I#-3&quot;INAM,:E&amp; .K0&quot;+:&quot;VUP^VJ$;]+*^]L86Y&#10;MPA1J4UA-O&gt;;\1N9U2YO 92XU:+$;KMS,KY&gt;&amp;Y\WU&quot; J=)]-RB9T6&lt;*R;7263&#10;E*(=T,)I?&amp;345M&gt;N-X.8!A9;$J-WRWV4NVG[:CX6+OO@?3*V*E@ &#10; &#10;end&#10;</svConfiguration>
+ <svRestConfiguration type="str"></svRestConfiguration>
+ </statManagerOptions>
+ <currentUniqueIDForAgent type="int">2</currentUniqueIDForAgent>
+ <_scenarioElementFactory ver="[0, [1, [0, [0]]]]" type="ixScenarioElementFactory">
+ <singletonDict type="dict"/>
+ <referenceCountDict type="dict">
+ <item>
+ <key type="str">qovCoprocessor</key>
+ <value type="int">0</value>
+ </item>
+ <item>
+ <key type="str">Impairment</key>
+ <value type="int">0</value>
+ </item>
+ <item>
+ <key type="str">asrCoprocessor</key>
+ <value type="int">0</value>
+ </item>
+ </referenceCountDict>
+ </_scenarioElementFactory>
+ </item>
+ </testList>
+</root>
diff --git a/samples/vnf_samples/traffic_profiles/acl/acl_ipv4_profile_1flows.ixncfg b/samples/vnf_samples/traffic_profiles/acl/acl_ipv4_profile_1flows.ixncfg
new file mode 100644
index 000000000..01269bee2
--- /dev/null
+++ b/samples/vnf_samples/traffic_profiles/acl/acl_ipv4_profile_1flows.ixncfg
Binary files differ
diff --git a/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency.yaml b/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency.yaml
new file mode 100644
index 000000000..ccd40c33b
--- /dev/null
+++ b/samples/vnf_samples/traffic_profiles/ixia_ipv4_latency.yaml
@@ -0,0 +1,121 @@
+# flow definition for ACL tests - 1K flows - ipv4 only
+#
+# the number of flows defines the widest range of parameters
+# for example if srcip_range=1.0.0.1-1.0.0.255 and dst_ip_range=10.0.0.1-10.0.1.255
+# and it should define only 16 flows
+#
+#there is assumption that packets generated will have a random sequences of following addresses pairs
+# in the packets
+# 1. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512)
+# 2. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512)
+# ...
+# 512. src=1.x.x.x(x.x.x =random from 1..255) dst=10.x.x.x (random from 1..512)
+#
+# not all combination should be filled
+# Any other field with random range will be added to flow definition
+#
+# the example.yaml provides all possibilities for traffic generation
+#
+# the profile defines a public and private side to make limited traffic correlation
+# between private and public side same way as it is made by IXIA solution.
+#
+schema: "isb:traffic_profile:0.1"
+
+# This file is a template, it will be filled with values from tc.yaml before passing to the traffic generator
+
+name: rfc2544
+description: Traffic profile to run RFC2544 latency
+traffic_profile:
+ traffic_type : IXIARFC2544Profile # defines traffic behavior - constant or look for highest possible throughput
+ frame_rate : 100 # pc of linerate
+ # that specifies a range (e.g. ipv4 address, port)
+
+
+private_1:
+ ipv4:
+ outer_l2:
+ framesize:
+ 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}"
+ 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}"
+ 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}"
+ 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}"
+ 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}"
+ 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}"
+ 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}"
+
+ outer_l3v4:
+ proto: "udp"
+ srcip4: "{{get(flow, 'flow.srcip4_range', '1.1.1.1-1.15.255.255') }}"
+ dstip4: "{{get(flow, 'flow.dstip4_range', '90.90.1.1-90.105.255.255') }}"
+ count: "{{get(flow, 'flow.count', '1') }}"
+ ttl: 32
+ dscp: 0
+ outer_l4:
+ srcport: "{{get(flow, 'flow.srcport_range', '1234') }}"
+ dstport: "{{get(flow, 'flow.dstport_range', '2001') }}"
+public_1:
+ ipv4:
+ outer_l2:
+ framesize:
+ 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}"
+ 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}"
+ 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}"
+ 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}"
+ 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}"
+ 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}"
+ 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}"
+
+ outer_l3v4:
+ proto: "udp"
+ srcip4: "{{get(flow, 'flow.dstip4_range', '1.1.1.1-1.15.255.255') }}"
+ dstip4: "{{get(flow, 'flow.srcip4_range', '90.90.1.1-90.105.255.255') }}"
+ count: "{{get(flow, 'flow.count', '1') }}"
+ ttl: 32
+ dscp: 0
+ outer_l4:
+ srcport: "{{get(flow, 'flow.srcport_range', '1234') }}"
+ dstport: "{{get(flow, 'flow.dstport_range', '2001') }}"
+private_2:
+ ipv4:
+ outer_l2:
+ framesize:
+ 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}"
+ 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}"
+ 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}"
+ 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}"
+ 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}"
+ 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}"
+ 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}"
+
+ outer_l3v4:
+ proto: "udp"
+ srcip4: "{{get(flow, 'flow.srcip4_range', '1.1.1.1-1.15.255.255') }}"
+ dstip4: "{{get(flow, 'flow.dstip4_range', '90.90.1.1-90.105.255.255') }}"
+ count: "{{get(flow, 'flow.count', '1') }}"
+ ttl: 32
+ dscp: 0
+ outer_l4:
+ srcport: "{{get(flow, 'flow.srcport_range', '1234') }}"
+ dstport: "{{get(flow, 'flow.dstport_range', '2001') }}"
+public_2:
+ ipv4:
+ outer_l2:
+ framesize:
+ 64B: "{{ get(imix, 'imix.private.imix_small', '0') }}"
+ 128B: "{{ get(imix, 'imix.private.imix_128B', '0') }}"
+ 256B: "{{ get(imix, 'imix.private.imix_256B', '0') }}"
+ 373b: "{{ get(imix, 'imix.private.imix_373B', '0') }}"
+ 570B: "{{get(imix, 'imix.private.imix_570B', '0') }}"
+ 1400B: "{{get(imix, 'imix.private.imix_1400B', '0') }}"
+ 1518B: "{{get(imix, 'imix.private.imix_1500B', '0') }}"
+
+ outer_l3v4:
+ proto: "udp"
+ srcip4: "{{get(flow, 'flow.dstip4_range', '1.1.1.1-1.15.255.255') }}"
+ dstip4: "{{get(flow, 'flow.srcip4_range', '90.90.1.1-90.105.255.255') }}"
+ count: "{{get(flow, 'flow.count', '1') }}"
+ ttl: 32
+ dscp: 0
+ outer_l4:
+ srcport: "{{get(flow, 'flow.srcport_range', '1234') }}"
+ dstport: "{{get(flow, 'flow.dstport_range', '2001') }}"
diff --git a/samples/vnf_samples/vnf_descriptors/acl_vnf.yaml b/samples/vnf_samples/vnf_descriptors/acl_vnf.yaml
new file mode 100644
index 000000000..b38e6b8ae
--- /dev/null
+++ b/samples/vnf_samples/vnf_descriptors/acl_vnf.yaml
@@ -0,0 +1,84 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+vnfd:vnfd-catalog:
+ vnfd:
+ - id: AclApproxVnf
+ name: AclVnfSshIntel
+ short-name: AclVnf
+ description: ACL approximation using DPDK
+ mgmt-interface:
+ vdu-id: aclvnf-baremetal
+ {% if user is defined %}
+ user: '{{user}}' # Value filled by vnfdgen
+ {% endif %}
+ {% if password is defined %}
+ password: '{{password}}' # Value filled by vnfdgen
+ {% endif %}
+ {% if ip is defined %}
+ ip: '{{ip}}' # Value filled by vnfdgen
+ {% endif %}
+ {% if key_filename is defined %}
+ key_filename: '{{key_filename}}' # Value filled by vnfdgen
+ {% endif %}
+ connection-point:
+ - name: xe0
+ type: VPORT
+ - name: xe1
+ type: VPORT
+ vdu:
+ - id: aclvnf-baremetal
+ name: aclvnf-baremetal
+ description: ACL approximation using DPDK
+ vm-flavor:
+ vcpu-count: '4'
+ memory-mb: '4096'
+ external-interface:
+ - name: xe0
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ # Substitution variables MUST be quoted. Otherwise Python can misinterpet them.
+ vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen
+ dpdk_port_num: '{{ interfaces.xe0.dpdk_port_num }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen
+ driver: '{{ interfaces.xe0.driver}}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen
+ netmask: '{{ interfaces.xe0.netmask }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen
+ vld_id: '{{ interfaces.xe0.vld_id }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe0
+ - name: xe1
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ # Substitution variables MUST be quoted. Otherwise Python can misinterpet them.
+ vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen
+ dpdk_port_num: '{{ interfaces.xe1.dpdk_port_num }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen
+ driver: '{{ interfaces.xe1.driver}}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen
+ netmask: '{{ interfaces.xe1.netmask }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen
+ vld_id: '{{ interfaces.xe1.vld_id }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe1
+ routing_table: {{ routing_table }}
+ nd_route_tbl: {{ nd_route_tbl }}
+ benchmark:
+ kpi:
+ - packets_in
+ - packets_fwd
+ - packets_dropped
diff --git a/samples/vnf_samples/vnf_descriptors/ixia_rfc2544_tpl.yaml b/samples/vnf_samples/vnf_descriptors/ixia_rfc2544_tpl.yaml
new file mode 100644
index 000000000..4b520f61b
--- /dev/null
+++ b/samples/vnf_samples/vnf_descriptors/ixia_rfc2544_tpl.yaml
@@ -0,0 +1,79 @@
+#
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+vnfd:vnfd-catalog:
+ vnfd:
+ - id: IXIATrafficGen # ISB class mapping
+ name: IXIAtrafficgen
+ short-name: ixia
+ description: IXIA stateless traffic verifier
+ mgmt-interface:
+ vdu-id: trexgen-baremetal
+ user: '{{user}}' # Value filled by vnfdgen
+ password: '{{password}}' # Value filled by vnfdgen
+ ip: '{{ip}}' # Value filled by vnfdgen
+ tg-config:
+ ixchassis: '{{tg_config.ixchassis}}' #ixia chassis ip
+ tcl_port: '{{tg_config.tcl_port}}' # tcl server port
+ lib_path: '{{tg_config.lib_path}}'
+ root_dir: '{{tg_config.root_dir}}'
+ py_lib_path: '{{tg_config.py_lib_path}}'
+ py_bin_path: '{{tg_config.py_bin_path}}'
+ dut_result_dir: '{{tg_config.dut_result_dir}}'
+ version: '{{tg_config.version}}'
+ connection-point:
+ - name: xe0
+ type: VPORT
+ - name: xe1
+ type: VPORT
+ vdu:
+ - id: trexgen-baremetal
+ name: trexgen-baremetal
+ description: IXIAstateless traffic verifier
+ external-interface:
+ - name: xe0
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ # Substitution variables MUST be quoted. Otherwise Python can misinterpet them.
+ vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen
+ local_iface_name: '{{ interfaces.xe0.local_iface_name }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen
+ driver: '{{ interfaces.xe0.driver}}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe0
+ - name: xe1
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen
+ local_iface_name: '{{ interfaces.xe1.local_iface_name }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen
+ driver: '{{ interfaces.xe1.driver}}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe1
+
+ benchmark:
+ kpi:
+ - rx_throughput_fps
+ - tx_throughput_fps
+ - tx_throughput_mbps
+ - rx_throughput_mbps
+ - in_packets
+ - out_packets
diff --git a/samples/vnf_samples/vnf_descriptors/tg_ixload.yaml b/samples/vnf_samples/vnf_descriptors/tg_ixload.yaml
new file mode 100644
index 000000000..b430d35bd
--- /dev/null
+++ b/samples/vnf_samples/vnf_descriptors/tg_ixload.yaml
@@ -0,0 +1,80 @@
+#
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+vnfd:vnfd-catalog:
+ vnfd:
+ - id: IxLoadTrafficGen
+ name: IxLoadTrafficGenVnfSshIntel
+ short-name: IxLoadTrafficGenVnf
+ description: IxLoad client/server connection details
+ mgmt-interface:
+ user: '{{user}}' # Value filled by vnfdgen
+ password: '{{password}}' # Value filled by vnfdgen
+ ip: '{{ip}}' # Value filled by vnfdgen
+ tg-config:
+ ixchassis: '{{tg_config.ixchassis}}' #ixia chassis ip
+ tcl_port: '{{tg_config.tcl_port}}' # tcl server port
+ lib_path: '{{tg_config.lib_path}}'
+ root_dir: '{{tg_config.root_dir}}'
+ py_lib_path: '{{tg_config.py_lib_path}}'
+ py_bin_path: '{{tg_config.py_bin_path}}'
+ dut_result_dir: '{{tg_config.dut_result_dir}}'
+ version: '{{tg_config.version}}'
+ vdu:
+ - id: abclient-baremetal
+ name: abclient-baremetal
+ description: AB client interface details
+ external-interface:
+ - name: xe0
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen
+ local_iface_name: '{{ interfaces.xe0.local_iface_name }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen
+ netmask: '{{ interfaces.xe0.netmask }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe0
+ - name: xe1
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen
+ local_iface_name: '{{ interfaces.xe1.local_iface_name }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen
+ netmask: '{{ interfaces.xe1.netmask }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe1
+ benchmark:
+ kpi:
+ - complete_requests
+ - failed_requests
+ - time_taken_for_tests [seconds]
+ - requests_per_second [#/sec] (mean)
+ - time_per_request [ms] (mean, across all concurrent requests)
+ - transfer_rate [Kbytes/sec] received
+ - requests_served_50% (ms)
+ - requests_served_66% (ms)
+ - requests_served_75% (ms)
+ - requests_served_80% (ms)
+ - requests_served_90% (ms)
+ - requests_served_95% (ms)
+ - requests_served_98% (ms)
+ - requests_served_99% (ms)
+ - requests_served_100% (ms) \ No newline at end of file
diff --git a/samples/vnf_samples/vnf_descriptors/tg_ixload_4port.yaml b/samples/vnf_samples/vnf_descriptors/tg_ixload_4port.yaml
new file mode 100644
index 000000000..ffbfbdec0
--- /dev/null
+++ b/samples/vnf_samples/vnf_descriptors/tg_ixload_4port.yaml
@@ -0,0 +1,104 @@
+#
+# Copyright 2016 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+vnfd:vnfd-catalog:
+ vnfd:
+ - id: IxLoadTrafficGen
+ name: IxLoadTrafficGenVnfSshIntel
+ short-name: IxLoadTrafficGenVnf
+ description: IxLoad client/server connection details
+ mgmt-interface:
+ user: '{{user}}' # Value filled by vnfdgen
+ password: '{{password}}' # Value filled by vnfdgen
+ ip: '{{ip}}' # Value filled by vnfdgen
+ tg-config:
+ ixchassis: '{{tg_config.ixchassis}}' #ixia chassis ip
+ tcl_port: '{{tg_config.tcl_port}}' # tcl server port
+ lib_path: '{{tg_config.lib_path}}'
+ root_dir: '{{tg_config.root_dir}}'
+ py_lib_path: '{{tg_config.py_lib_path}}'
+ dut_result_dir: '{{tg_config.dut_result_dir}}'
+ version: '{{tg_config.version}}'
+ vdu:
+ - id: abclient-baremetal
+ name: abclient-baremetal
+ description: AB client interface details
+ external-interface:
+ - name: xe0
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ vpci: '{{ interfaces.xe0.vpci }}' # Value filled by vnfdgen
+ local_iface_name: '{{ interfaces.xe0.local_iface_name }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe0.local_ip }}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe0.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe0.local_mac }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe0.dst_mac }}' # Value filled by vnfdgen
+ netmask: '{{ interfaces.xe0.netmask }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe0
+ - name: xe1
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ vpci: '{{ interfaces.xe1.vpci }}' # Value filled by vnfdgen
+ local_iface_name: '{{ interfaces.xe1.local_iface_name }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe1.local_ip }}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe1.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe1.local_mac }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe1.dst_mac }}' # Value filled by vnfdgen
+ netmask: '{{ interfaces.xe1.netmask }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe1
+ - name: xe2
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ vpci: '{{ interfaces.xe2.vpci }}' # Value filled by vnfdgen
+ local_iface_name: '{{ interfaces.xe2.local_iface_name }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe2.local_ip }}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe2.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe2.local_mac }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe2.dst_mac }}' # Value filled by vnfdgen
+ netmask: '{{ interfaces.xe2.netmask }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe2
+ - name: xe3
+ virtual-interface:
+ type: PCI-PASSTHROUGH
+ vpci: '{{ interfaces.xe3.vpci }}' # Value filled by vnfdgen
+ local_iface_name: '{{ interfaces.xe3.local_iface_name }}' # Value filled by vnfdgen
+ local_ip: '{{ interfaces.xe3.local_ip }}' # Value filled by vnfdgen
+ dst_ip: '{{ interfaces.xe3.dst_ip }}' # Value filled by vnfdgen
+ local_mac: '{{ interfaces.xe3.local_mac }}' # Value filled by vnfdgen
+ dst_mac: '{{ interfaces.xe3.dst_mac }}' # Value filled by vnfdgen
+ netmask: '{{ interfaces.xe3.netmask }}' # Value filled by vnfdgen
+ bandwidth: 10 Gbps
+ vnfd-connection-point-ref: xe3
+
+ benchmark:
+ kpi:
+ - complete_requests
+ - failed_requests
+ - time_taken_for_tests [seconds]
+ - requests_per_second [#/sec] (mean)
+ - time_per_request [ms] (mean, across all concurrent requests)
+ - transfer_rate [Kbytes/sec] received
+ - requests_served_50% (ms)
+ - requests_served_66% (ms)
+ - requests_served_75% (ms)
+ - requests_served_80% (ms)
+ - requests_served_90% (ms)
+ - requests_served_95% (ms)
+ - requests_served_98% (ms)
+ - requests_served_99% (ms)
+ - requests_served_100% (ms)
diff --git a/tests/ci/pip_license.py b/tests/ci/pip_license.py
new file mode 100644
index 000000000..e512db7ee
--- /dev/null
+++ b/tests/ci/pip_license.py
@@ -0,0 +1,80 @@
+# Copyright (c) 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.
+
+import pkg_resources
+import pip.req
+import sys
+
+
+def get_pkg_license(pkg):
+ """
+ Given a package reference (as from requirements.txt),
+ return license listed in package metadata.
+ NOTE: This function does no error checking and is for
+ demonstration purposes only.
+
+ can-pip-or-setuptools-distribute-etc-list-the-license-used-by-each-install
+ https://stackoverflow.com/a/19086260
+ https://stackoverflow.com/users/308066/dkamins
+ """
+ try:
+ pkgs = pkg_resources.working_set.resolve(pkg, replace_conflicting=True)
+ # pkgs = pkg_resources.require(pkg)
+ except pkg_resources.DistributionNotFound as e:
+ sys.stderr.write("%s\n" % e)
+ return None
+ pkg = pkgs[0]
+ try:
+ info = pkg.get_metadata_lines('METADATA')
+ except IOError:
+ try:
+ info = pkg.get_metadata_lines('PKG-INFO')
+ except IOError:
+ info = []
+ licenses = []
+ for line in info:
+ if "License:" in line:
+ lic = line.split(': ', 1)[1]
+ if "UNKNOWN" not in lic:
+ # try this type first
+ licenses.append(lic)
+ # break
+ elif "License ::" in line:
+ licenses.append(" ".join(line.split(':: ')[1:3]))
+ return "; ".join(licenses)
+
+# quick and dirty hack
+
+
+def main():
+
+ reqs = list(pip.req.parse_requirements("../../requirements.txt", session='hack'))
+ lines = []
+ for req in reqs:
+ pkg = pkg_resources.parse_requirements([req.name])
+ lic = get_pkg_license(pkg)
+ markers = req.markers
+ if markers:
+ mark = "; " + str(req.markers)
+ else:
+ mark = ""
+ line = "{0}{1}\t\t# {2}\n".format(req.req, mark, lic)
+ sys.stdout.write(line)
+ lines.append(line)
+ with open("requirements.txt", "w") as rrr:
+ rrr.writelines(lines)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/unit/common/test_utils.py b/tests/unit/common/test_utils.py
index 53b56523e..f29de5ca0 100644
--- a/tests/unit/common/test_utils.py
+++ b/tests/unit/common/test_utils.py
@@ -21,6 +21,7 @@ import mock
from six.moves import configparser
from yardstick.common import utils
+from yardstick.common import constants
class IterSubclassesTestCase(unittest.TestCase):
@@ -99,7 +100,7 @@ class GetParaFromYaml(unittest.TestCase):
get_env.return_value = self._get_file_abspath(file_path)
args = 'releng.file'
default = 'hello'
- self.assertTrue(utils.get_param(args, default), default)
+ self.assertTrue(constants.get_param(args, default), default)
@mock.patch('yardstick.common.utils.os.environ.get')
def test_get_param_para_exists(self, get_env):
@@ -107,7 +108,7 @@ class GetParaFromYaml(unittest.TestCase):
get_env.return_value = self._get_file_abspath(file_path)
args = 'releng.dir'
para = '/home/opnfv/repos/releng'
- self.assertEqual(para, utils.get_param(args))
+ self.assertEqual(para, constants.get_param(args))
def _get_file_abspath(self, filename):
curr_path = os.path.dirname(os.path.abspath(__file__))
@@ -916,6 +917,32 @@ class TestUtils(unittest.TestCase):
result = utils.parse_ini_file('my_path')
self.assertDictEqual(result, expected)
+ def test_join_non_strings(self):
+ self.assertEqual(utils.join_non_strings(':'), '')
+ self.assertEqual(utils.join_non_strings(':', 'a'), 'a')
+ self.assertEqual(utils.join_non_strings(':', 'a', 2, 'c'), 'a:2:c')
+ self.assertEqual(utils.join_non_strings(':', ['a', 2, 'c']), 'a:2:c')
+ self.assertEqual(utils.join_non_strings(':', 'abc'), 'abc')
+
+ def test_validate_non_string_sequence(self):
+ self.assertEqual(utils.validate_non_string_sequence([1, 2, 3]), [1, 2, 3])
+ self.assertIsNone(utils.validate_non_string_sequence('123'))
+ self.assertIsNone(utils.validate_non_string_sequence(1))
+
+ self.assertEqual(utils.validate_non_string_sequence(1, 2), 2)
+ self.assertEqual(utils.validate_non_string_sequence(1, default=2), 2)
+
+ with self.assertRaises(RuntimeError):
+ utils.validate_non_string_sequence(1, raise_exc=RuntimeError)
+
+ def test_error_class(self):
+ with self.assertRaises(RuntimeError):
+ utils.ErrorClass()
+
+ error_instance = utils.ErrorClass(test='')
+ with self.assertRaises(AttributeError):
+ error_instance.get_name()
+
class TestUtilsIpAddrMethods(unittest.TestCase):
diff --git a/tests/unit/network_services/helpers/acl_vnf_topology_ixia.yaml b/tests/unit/network_services/helpers/acl_vnf_topology_ixia.yaml
new file mode 100644
index 000000000..606d557e9
--- /dev/null
+++ b/tests/unit/network_services/helpers/acl_vnf_topology_ixia.yaml
@@ -0,0 +1,50 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nsd:nsd-catalog:
+ nsd:
+ - id: VACL
+ name: VACL
+ short-name: VACL
+ description: scenario with VACL,L3fwd and VNF
+ constituent-vnfd:
+ - member-vnf-index: '1'
+ vnfd-id-ref: tg__1
+ VNF model: ../../vnf_descriptors/ixia_rfc2544_tpl.yaml
+ - member-vnf-index: '2'
+ vnfd-id-ref: vnf__1
+ VNF model: ../../vnf_descriptors/acl_vnf.yaml
+
+ vld:
+ - id: private_1
+ name: tg__1 to vnf__1 link 1
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: tg__1 #TREX
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe0
+ vnfd-id-ref: vnf__1 #VNF
+
+ - id: public_1
+ name: vnf__1 to tg__1 link 2
+ type: ELAN
+ vnfd-connection-point-ref:
+ - member-vnf-index-ref: '2'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: vnf__1 #L3fwd
+ - member-vnf-index-ref: '1'
+ vnfd-connection-point-ref: xe1
+ vnfd-id-ref: tg__1 #VACL VNF
diff --git a/tests/unit/network_services/libs/__init__.py b/tests/unit/network_services/libs/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/unit/network_services/libs/__init__.py
diff --git a/tests/unit/network_services/libs/ixia_libs/__init__.py b/tests/unit/network_services/libs/ixia_libs/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/unit/network_services/libs/ixia_libs/__init__.py
diff --git a/tests/unit/network_services/libs/ixia_libs/test_IxNet.py b/tests/unit/network_services/libs/ixia_libs/test_IxNet.py
new file mode 100644
index 000000000..9114b5163
--- /dev/null
+++ b/tests/unit/network_services/libs/ixia_libs/test_IxNet.py
@@ -0,0 +1,882 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Unittest for yardstick.network_services.libs.ixia_libs.IxNet
+
+from __future__ import absolute_import
+import unittest
+import mock
+
+from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IxNextgen
+from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IP_VERSION_4
+from yardstick.network_services.libs.ixia_libs.IxNet.IxNet import IP_VERSION_6
+
+
+class TestIxNextgen(unittest.TestCase):
+
+ def test___init__(self):
+ ixnet_gen = IxNextgen()
+ self.assertIsNone(ixnet_gen._bidir)
+
+ @mock.patch("yardstick.network_services.libs.ixia_libs.IxNet.IxNet.IxNetwork")
+ @mock.patch("yardstick.network_services.libs.ixia_libs.IxNet.IxNet.sys")
+ def test_connect(self, mock_sys, mock_ix_network):
+ mock_ix_network.IxNet.return_value = mock_ixnet = mock.Mock()
+
+ ixnet_gen = IxNextgen()
+ ixnet_gen.get_config = mock.MagicMock()
+ ixnet_gen.get_ixnet = mock.MagicMock()
+
+ result = ixnet_gen._connect({"py_lib_path": "/tmp"})
+ self.assertIsNotNone(result)
+ self.assertEqual(mock_ix_network.IxNet.call_count, 1)
+ self.assertEqual(mock_ixnet.connect.call_count, 1)
+
+ def test_clear_ixia_config(self):
+ ixnet = mock.MagicMock()
+ ixnet.execute = mock.Mock()
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.clear_ixia_config()
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.execute.call_count, 1)
+
+ def test_load_ixia_profile(self):
+ ixnet = mock.MagicMock()
+ ixnet.execute = mock.Mock()
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.load_ixia_profile({})
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.execute.call_count, 1)
+
+ def test_load_ixia_config(self):
+ ixnet = mock.MagicMock()
+ ixnet.execute = mock.Mock()
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_load_config({})
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.execute.call_count, 2)
+
+ @mock.patch('yardstick.network_services.libs.ixia_libs.IxNet.IxNet.log')
+ def test_ix_assign_ports(self, mock_logger):
+ ixnet = mock.MagicMock()
+ ixnet.getList.return_value = [0, 1]
+ ixnet.getAttribute.side_effect = ['up', 'down']
+
+ config = {
+ 'chassis': '1.1.1.1',
+ 'card1': '1',
+ 'card2': '2',
+ 'port1': '2',
+ 'port2': '2',
+ }
+
+ ixnet_gen = IxNextgen(ixnet)
+ ixnet_gen._cfg = config
+
+ result = ixnet_gen.ix_assign_ports()
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.execute.call_count, 1)
+ self.assertEqual(ixnet.commit.call_count, 1)
+ self.assertEqual(ixnet.getAttribute.call_count, 2)
+ self.assertEqual(mock_logger.error.call_count, 1)
+
+ def test_ix_update_frame(self):
+ static_traffic_params = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": {
+ "64B": "100",
+ "1KB": "0",
+ },
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": False,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+
+ ixnet = mock.MagicMock()
+ ixnet.remapIds.return_value = ["0"]
+ ixnet.setMultiAttribute.return_value = [1]
+ ixnet.commit.return_value = [1]
+ ixnet.getList.side_effect = [
+ [1],
+ [1],
+ [1],
+ [
+ "ethernet.header.destinationAddress",
+ "ethernet.header.sourceAddress",
+ ],
+ ]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_update_frame(static_traffic_params)
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.setMultiAttribute.call_count, 7)
+ self.assertEqual(ixnet.commit.call_count, 2)
+
+ def test_ix_update_udp(self):
+ ixnet = mock.MagicMock()
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_update_udp({})
+ self.assertIsNone(result)
+
+ def test_ix_update_tcp(self):
+ ixnet = mock.MagicMock()
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_update_tcp({})
+ self.assertIsNone(result)
+
+ def test_ix_start_traffic(self):
+ ixnet = mock.MagicMock()
+ ixnet.getList.return_value = [0]
+ ixnet.getAttribute.return_value = 'down'
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_start_traffic()
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.getList.call_count, 1)
+ self.assertEqual(ixnet.execute.call_count, 3)
+
+ def test_ix_stop_traffic(self):
+ ixnet = mock.MagicMock()
+ ixnet.getList.return_value = [0]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_stop_traffic()
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.getList.call_count, 1)
+ self.assertEqual(ixnet.execute.call_count, 1)
+
+ def test_ix_get_statistics(self):
+ ixnet = mock.MagicMock()
+ ixnet.execute.return_value = ""
+ ixnet.getList.side_effect = [
+ [
+ '::ixNet::OBJ-/statistics/view:"Traffic Item Statistics"',
+ '::ixNet::OBJ-/statistics/view:"Port Statistics"',
+ ],
+ [
+ '::ixNet::OBJ-/statistics/view:"Flow Statistics"',
+ ],
+ ]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_get_statistics()
+ self.assertIsNotNone(result)
+ self.assertEqual(ixnet.getList.call_count, 2)
+ self.assertEqual(ixnet.execute.call_count, 20)
+
+ def test_find_view_obj_no_where(self):
+ views = ['here', 'there', 'everywhere']
+ result = IxNextgen.find_view_obj('no_where', views)
+ self.assertEqual(result, '')
+
+ def test_add_ip_header_v4(self):
+ static_traffic_params = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "count": 1024,
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": True,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+
+ ixnet = mock.MagicMock()
+ ixnet.remapIds.return_value = ["0"]
+ ixnet.setMultiAttribute.return_value = [1]
+ ixnet.commit.return_value = [1]
+ ixnet.getList.side_effect = [[1], [0], [0], ["srcIp", "dstIp"]]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_4)
+ self.assertIsNone(result)
+ self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
+ self.assertEqual(ixnet.commit.call_count, 1)
+
+ def test_add_ip_header_v4_nothing_to_do(self):
+ static_traffic_params = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "count": 1024,
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": True,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+
+ ixnet = mock.MagicMock()
+ ixnet.remapIds.return_value=["0"]
+ ixnet.setMultiAttribute.return_value = [1]
+ ixnet.commit.return_value = [1]
+ ixnet.getList.side_effect = [[1], [0, 1], [0], ["srcIp", "dstIp"]]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_4)
+ self.assertIsNone(result)
+ self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
+ self.assertEqual(ixnet.commit.call_count, 1)
+
+ def test_add_ip_header_v6(self):
+ static_traffic_profile = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": True,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+
+ ixnet = mock.MagicMock()
+ ixnet.getList.side_effect = [[1], [1], [1], ["srcIp", "dstIp"]]
+ ixnet.remapIds.return_value = ["0"]
+ ixnet.setMultiAttribute.return_value = [1]
+ ixnet.commit.return_value = [1]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.add_ip_header(static_traffic_profile, IP_VERSION_6)
+ self.assertIsNone(result)
+ self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
+ self.assertEqual(ixnet.commit.call_count, 1)
+
+ def test_add_ip_header_v6_nothing_to_do(self):
+ static_traffic_params = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "count": 1024,
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": True,
+ "framesize": {"64B": "100"},
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+
+ ixnet = mock.MagicMock()
+ ixnet.getList.side_effect = [[1], [0, 1], [1], ["srcIP", "dstIP"]]
+ ixnet.remapIds.return_value = ["0"]
+ ixnet.setMultiAttribute.return_value = [1]
+ ixnet.commit.return_value = [1]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.add_ip_header(static_traffic_params, IP_VERSION_6)
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.setMultiAttribute.call_count, 0)
+
+ def test_set_random_ip_multi_attributes_bad_ip_version(self):
+ bad_ip_version = object()
+ ixnet_gen = IxNextgen(mock.Mock())
+ mock1 = mock.Mock()
+ mock2 = mock.Mock()
+ mock3 = mock.Mock()
+ with self.assertRaises(ValueError):
+ ixnet_gen.set_random_ip_multi_attributes(mock1, bad_ip_version, mock2, mock3)
+
+ def test_get_config(self):
+ tg_cfg = {
+ "vdu": [
+ {
+ "external-interface": [
+ {
+ "virtual-interface": {
+ "vpci": "0000:07:00.1",
+ },
+ },
+ {
+ "virtual-interface": {
+ "vpci": "0001:08:01.2",
+ },
+ },
+ ],
+ },
+ ],
+ "mgmt-interface": {
+ "ip": "test1",
+ "tg-config": {
+ "dut_result_dir": "test2",
+ "version": "test3",
+ "ixchassis": "test4",
+ "tcl_port": "test5",
+ "py_lib_path": "test6",
+ },
+ }
+ }
+
+ expected = {
+ 'py_lib_path': 'test6',
+ 'machine': 'test1',
+ 'port': 'test5',
+ 'chassis': 'test4',
+ 'card1': '0000',
+ 'port1': '07',
+ 'card2': '0001',
+ 'port2': '08',
+ 'output_dir': 'test2',
+ 'version': 'test3',
+ 'bidir': True,
+ }
+
+ result = IxNextgen.get_config(tg_cfg)
+ self.assertDictEqual(result, expected)
+
+ def test_ix_update_ether(self):
+ static_traffic_params = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": True,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+
+ ixnet = mock.MagicMock()
+ ixnet.setMultiAttribute.return_value = [1]
+ ixnet.commit.return_value = [1]
+ ixnet.getList.side_effect = [
+ [1],
+ [1],
+ [1],
+ [
+ "ethernet.header.destinationAddress",
+ "ethernet.header.sourceAddress",
+ ],
+ ]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_update_ether(static_traffic_params)
+ self.assertIsNone(result)
+ self.assertGreater(ixnet.setMultiAttribute.call_count, 0)
+
+ def test_ix_update_ether_nothing_to_do(self):
+ static_traffic_params = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+
+ ixnet = mock.MagicMock()
+ ixnet.setMultiAttribute.return_value = [1]
+ ixnet.commit.return_value = [1]
+ ixnet.getList.side_effect=[
+ [1],
+ [1],
+ [1],
+ [
+ "ethernet.header.destinationAddress",
+ "ethernet.header.sourceAddress",
+ ],
+ ]
+
+ ixnet_gen = IxNextgen(ixnet)
+
+ result = ixnet_gen.ix_update_ether(static_traffic_params)
+ self.assertIsNone(result)
+ self.assertEqual(ixnet.setMultiAttribute.call_count, 0)
diff --git a/tests/unit/network_services/nfvi/test_resource.py b/tests/unit/network_services/nfvi/test_resource.py
index e2640ac74..cb26fd085 100644
--- a/tests/unit/network_services/nfvi/test_resource.py
+++ b/tests/unit/network_services/nfvi/test_resource.py
@@ -92,9 +92,11 @@ class TestResourceProfile(unittest.TestCase):
mock.Mock(return_value=(0, {}, ""))
ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
self.resource_profile = \
- ResourceProfile(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0],
- [1, 2, 3])
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
def test___init__(self):
self.assertEqual(True, self.resource_profile.enable)
@@ -107,13 +109,13 @@ class TestResourceProfile(unittest.TestCase):
reskey = ["", "cpufreq", "cpufreq-0"]
value = "metric:10"
val = self.resource_profile.get_cpu_data(reskey, value)
- self.assertEqual(val, ['0', 'cpufreq', '10', 'metric'])
+ self.assertIsNotNone(val)
def test_get_cpu_data_error(self):
reskey = ["", "", ""]
value = "metric:10"
val = self.resource_profile.get_cpu_data(reskey, value)
- self.assertEqual(val, ['error', 'Invalid', ''])
+ self.assertEqual(val, ('error', 'Invalid', '', ''))
def test__start_collectd(self):
with mock.patch("yardstick.ssh.SSH") as ssh:
@@ -121,32 +123,228 @@ class TestResourceProfile(unittest.TestCase):
ssh_mock.execute = \
mock.Mock(return_value=(0, "", ""))
ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
resource_profile = \
- ResourceProfile(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0],
- [1, 2, 3])
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
+ resource_profile._prepare_collectd_conf = mock.Mock()
self.assertIsNone(
resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin"))
- def test_initiate_systemagent(self):
+ def test__prepare_collectd_conf_BM(self):
with mock.patch("yardstick.ssh.SSH") as ssh:
ssh_mock = mock.Mock(autospec=ssh.SSH)
ssh_mock.execute = \
mock.Mock(return_value=(0, "", ""))
ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
resource_profile = \
- ResourceProfile(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0],
- [1, 2, 3])
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
+ resource_profile._provide_config_file = mock.Mock()
+ self.assertIsNone(
+ resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
+
+ def test__prepare_collectd_conf_managed_ovs_dpdk(self):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
+ resource_profile = \
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
+ resource_profile._provide_config_file = mock.Mock()
+ self.assertIsNone(
+ resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
+
+ def test__prepare_collectd_conf_ovs_dpdk(self):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
+ resource_profile = \
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
+ resource_profile._provide_config_file = mock.Mock()
+ self.assertIsNone(
+ resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
+
+ def test__prepare_collectd_conf_managed_sriov(self):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
+ resource_profile = \
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
+ resource_profile._provide_config_file = mock.Mock()
+ self.assertIsNone(
+ resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
+
+ def test__prepare_collectd_conf_sriov(self):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
+ resource_profile = \
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
+ resource_profile._provide_config_file = mock.Mock()
+ self.assertIsNone(
+ resource_profile._prepare_collectd_conf("/opt/nsb_bin"))
+
+ @mock.patch("yardstick.network_services.nfvi.resource.open")
+ @mock.patch("yardstick.network_services.nfvi.resource.tempfile")
+ @mock.patch("yardstick.network_services.nfvi.resource.os")
+ def test__provide_config_file(self, mock_open, mock_tempfile, mock_os):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
+ resource_profile = \
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
+ resource_profile._prepare_collectd_conf = mock.Mock()
+ resource_profile.connection = ssh_mock
+ resource_profile.connection.put = \
+ mock.Mock(return_value=(0, "", ""))
+ mock_tempfile.mkstemp = mock.Mock(return_value=["test", ""])
+ self.assertIsNone(
+ resource_profile._provide_config_file("/opt/nsb_bin",
+ "collectd.cfg", {}))
+
+ @mock.patch("yardstick.network_services.nfvi.resource.open")
+ def test_initiate_systemagent(self, mock_open):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface']
+ interfaces = \
+ self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface']
+ resource_profile = \
+ ResourceProfile(mgmt, interfaces, [1, 2, 3])
+ resource_profile._start_collectd = mock.Mock()
self.assertIsNone(
resource_profile.initiate_systemagent("/opt/nsb_bin"))
+ def test__parse_hugepages(self):
+ reskey = ["cpu", "cpuFreq"]
+ value = "timestamp:12345"
+ res = self.resource_profile.parse_hugepages(reskey, value)
+ self.assertEqual({'cpu/cpuFreq': '12345'}, res)
+
+ def test__parse_dpdkstat(self):
+ reskey = ["dpdk0", "0"]
+ value = "tx:12345"
+ res = self.resource_profile.parse_dpdkstat(reskey, value)
+ self.assertEqual({'dpdk0/0': '12345'}, res)
+
+ def test__parse_virt(self):
+ reskey = ["vm0", "cpu"]
+ value = "load:45"
+ res = self.resource_profile.parse_virt(reskey, value)
+ self.assertEqual({'vm0/cpu': '45'}, res)
+
+ def test__parse_ovs_stats(self):
+ reskey = ["ovs", "stats"]
+ value = "tx:45"
+ res = self.resource_profile.parse_ovs_stats(reskey, value)
+ self.assertEqual({'ovs/stats': '45'}, res)
+
def test_parse_collectd_result(self):
res = self.resource_profile.parse_collectd_result({}, [0, 1, 2])
- self.assertDictEqual(res, {'timestamp': '', 'cpu': {}, 'memory': {}})
+ expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
+ 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
+ 'virt': {}}
+ self.assertDictEqual(res, expected_result)
+
+ def test_parse_collectd_result_cpu(self):
+ metric = {"nsb_stats/cpu/0/ipc": "101"}
+ self.resource_profile.get_cpu_data = mock.Mock(return_value=[1,
+ "ipc",
+ "1234",
+ ""])
+ res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
+ expected_result = {'cpu': {1: {'ipc': '1234'}}, 'dpdkstat': {}, 'hugepages': {},
+ 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
+ 'virt': {}}
+ self.assertDictEqual(res, expected_result)
+
+ def test_parse_collectd_result_memory(self):
+ metric = {"nsb_stats/memory/bw": "101"}
+ res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
+ expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {},
+ 'memory': {'bw': '101'}, 'ovs_stats': {}, 'timestamp': '',
+ 'virt': {}}
+ self.assertDictEqual(res, expected_result)
+
+ def test_parse_collectd_result_hugepage(self):
+ metric = {"nsb_stats/hugepages/free": "101"}
+ self.resource_profile.parse_hugepages = \
+ mock.Mock(return_value={"free": "101"})
+ res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
+ expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {'free':
+ '101'},
+ 'memory': {}, 'ovs_stats': {}, 'timestamp': '',
+ 'virt': {}}
+ self.assertDictEqual(res, expected_result)
+
+ def test_parse_collectd_result_dpdk_virt_ovs(self):
+ metric = {"nsb_stats/dpdkstat/tx": "101",
+ "nsb_stats/ovs_stats/tx": "101",
+ "nsb_stats/virt/virt/memory": "101"}
+ self.resource_profile.parse_dpdkstat = \
+ mock.Mock(return_value={"tx": "101"})
+ self.resource_profile.parse_virt = \
+ mock.Mock(return_value={"memory": "101"})
+ self.resource_profile.parse_ovs_stats = \
+ mock.Mock(return_value={"tx": "101"})
+ res = self.resource_profile.parse_collectd_result(metric, [0, 1, 2])
+ expected_result = {'cpu': {}, 'dpdkstat': {'tx': '101'}, 'hugepages': {},
+ 'memory': {}, 'ovs_stats': {'tx': '101'}, 'timestamp': '',
+ 'virt': {'memory': '101'}}
+ self.assertDictEqual(res, expected_result)
+
+ def test_amqp_process_for_nfvi_kpi(self):
+ self.resource_profile.amqp_client = \
+ mock.MagicMock(side_effect=[None, mock.MagicMock()])
+ self.resource_profile.run_collectd_amqp = \
+ mock.Mock(return_value=0)
+ res = self.resource_profile.amqp_process_for_nfvi_kpi()
+ self.assertEqual(None, res)
+
+ def test_amqp_collect_nfvi_kpi(self):
+ self.resource_profile.amqp_client = \
+ mock.MagicMock(side_effect=[None, mock.MagicMock()])
+ self.resource_profile.run_collectd_amqp = \
+ mock.Mock(return_value=0)
+ self.resource_profile.parse_collectd_result = mock.Mock()
+ res = self.resource_profile.amqp_collect_nfvi_kpi()
+ self.assertIsNotNone(res)
def test_run_collectd_amqp(self):
_queue = multiprocessing.Queue()
resource.AmqpConsumer = mock.Mock(autospec=collectd)
- self.assertIsNone(self.resource_profile.run_collectd_amqp(_queue))
+ self.assertIsNone(self.resource_profile.run_collectd_amqp())
def test_start(self):
self.assertIsNone(self.resource_profile.start())
diff --git a/tests/unit/network_services/traffic_profile/test_http_ixload.py b/tests/unit/network_services/traffic_profile/test_http_ixload.py
new file mode 100644
index 000000000..2e1b6f4ff
--- /dev/null
+++ b/tests/unit/network_services/traffic_profile/test_http_ixload.py
@@ -0,0 +1,250 @@
+# Copyright (c) 2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+from __future__ import absolute_import
+import unittest
+import mock
+import runpy
+
+from oslo_serialization import jsonutils
+
+from yardstick.network_services.traffic_profile import http_ixload
+
+
+class TestIxLoadTrafficGen(unittest.TestCase):
+
+ def test_parse_run_test(self):
+ ports = [1, 2, 3]
+ test_input = {
+ "remote_server": "REMOTE_SERVER",
+ "ixload_cfg": "IXLOAD_CFG",
+ "result_dir": "RESULT_DIR",
+ "ixia_chassis": "IXIA_CHASSIS",
+ "IXIA": {
+ "card": "CARD",
+ "ports": ports,
+ },
+ }
+ j = jsonutils.dump_as_bytes(test_input)
+ ixload = http_ixload.IXLOADHttpTest(j)
+ self.assertDictEqual(ixload.test_input, test_input)
+ self.assertIsNone(ixload.parse_run_test())
+ self.assertEqual(ixload.ports_to_reassign, [
+ ["IXIA_CHASSIS", "CARD", 1],
+ ["IXIA_CHASSIS", "CARD", 2],
+ ["IXIA_CHASSIS", "CARD", 3],
+ ])
+
+ def test_format_ports_for_reassignment(self):
+ ports = [
+ ["IXIA_CHASSIS", "CARD", 1],
+ ["IXIA_CHASSIS", "CARD", 2],
+ ["IXIA_CHASSIS", "CARD", 3],
+ ]
+ formatted = http_ixload.IXLOADHttpTest.format_ports_for_reassignment(ports)
+ self.assertEqual(formatted, [
+ "IXIA_CHASSIS;CARD;1",
+ "IXIA_CHASSIS;CARD;2",
+ "IXIA_CHASSIS;CARD;3",
+ ])
+
+ def test_reassign_ports(self):
+ ports = [1, 2, 3]
+ test_input = {
+ "remote_server": "REMOTE_SERVER",
+ "ixload_cfg": "IXLOAD_CFG",
+ "result_dir": "RESULT_DIR",
+ "ixia_chassis": "IXIA_CHASSIS",
+ "IXIA": {
+ "card": "CARD",
+ "ports": ports,
+ },
+ }
+ j = jsonutils.dump_as_bytes(test_input)
+ ixload = http_ixload.IXLOADHttpTest(j)
+ repository = mock.Mock()
+ test = mock.MagicMock()
+ test.setPorts = mock.Mock()
+ ports_to_reassign = [(1, 2, 3), (1, 2, 4)]
+ ixload.format_ports_for_reassignment = mock.Mock(return_value=["1;2;3"])
+ self.assertIsNone(ixload.reassign_ports(test, repository, ports_to_reassign))
+
+ def test_reassign_ports_error(self):
+ ports = [1, 2, 3]
+ test_input = {
+ "remote_server": "REMOTE_SERVER",
+ "ixload_cfg": "IXLOAD_CFG",
+ "result_dir": "RESULT_DIR",
+ "ixia_chassis": "IXIA_CHASSIS",
+ "IXIA": {
+ "card": "CARD",
+ "ports": ports,
+ },
+ }
+ j = jsonutils.dump_as_bytes(test_input)
+ ixload = http_ixload.IXLOADHttpTest(j)
+ repository = mock.Mock()
+ test = "test"
+ ports_to_reassign = [(1, 2, 3), (1, 2, 4)]
+ ixload.format_ports_for_reassignment = mock.Mock(return_value=["1;2;3"])
+ ixload.ix_load = mock.MagicMock()
+ ixload.ix_load.delete = mock.Mock()
+ ixload.ix_load.disconnect = mock.Mock()
+ with self.assertRaises(Exception):
+ ixload.reassign_ports(test, repository, ports_to_reassign)
+
+ def test_stat_collector(self):
+ args = [0, 1]
+ self.assertIsNone(
+ http_ixload.IXLOADHttpTest.stat_collector(*args))
+
+ def test_IxL_StatCollectorCommand(self):
+ args = [[0, 1, 2, 3], [0, 1, 2, 3]]
+ self.assertIsNone(
+ http_ixload.IXLOADHttpTest.IxL_StatCollectorCommand(*args))
+
+ def test_set_results_dir(self):
+ test_stat_collector = mock.MagicMock()
+ test_stat_collector.setResultDir = mock.Mock()
+ results_on_windows = "c:/Results"
+ self.assertIsNone(
+ http_ixload.IXLOADHttpTest.set_results_dir(test_stat_collector,
+ results_on_windows))
+
+ def test_set_results_dir_error(self):
+ test_stat_collector = ""
+ results_on_windows = "c:/Results"
+ with self.assertRaises(Exception):
+ http_ixload.IXLOADHttpTest.set_results_dir(test_stat_collector, results_on_windows)
+
+ def test_load_config_file(self):
+ ports = [1, 2, 3]
+ test_input = {
+ "remote_server": "REMOTE_SERVER",
+ "ixload_cfg": "IXLOAD_CFG",
+ "result_dir": "RESULT_DIR",
+ "ixia_chassis": "IXIA_CHASSIS",
+ "IXIA": {
+ "card": "CARD",
+ "ports": ports,
+ },
+ }
+ j = jsonutils.dump_as_bytes(test_input)
+ ixload = http_ixload.IXLOADHttpTest(j)
+ ixload.ix_load = mock.MagicMock()
+ ixload.ix_load.new = mock.Mock(return_value="")
+ self.assertIsNotNone(ixload.load_config_file("ixload.cfg"))
+
+ def test_load_config_file_error(self):
+ ports = [1, 2, 3]
+ test_input = {
+ "remote_server": "REMOTE_SERVER",
+ "ixload_cfg": "IXLOAD_CFG",
+ "result_dir": "RESULT_DIR",
+ "ixia_chassis": "IXIA_CHASSIS",
+ "IXIA": {
+ "card": "CARD",
+ "ports": ports,
+ },
+ }
+ j = jsonutils.dump_as_bytes(test_input)
+ ixload = http_ixload.IXLOADHttpTest(j)
+ ixload.ix_load = "test"
+ with self.assertRaises(Exception):
+ ixload.load_config_file("ixload.cfg")
+
+ @mock.patch('yardstick.network_services.traffic_profile.http_ixload.IxLoad')
+ @mock.patch('yardstick.network_services.traffic_profile.http_ixload.StatCollectorUtils')
+ def test_start_http_test_connect_error(self, mock_collector_type, mock_ixload_type):
+ ports = [1, 2, 3]
+ test_input = {
+ "remote_server": "REMOTE_SERVER",
+ "ixload_cfg": "IXLOAD_CFG",
+ "result_dir": "RESULT_DIR",
+ "ixia_chassis": "IXIA_CHASSIS",
+ "IXIA": {
+ "card": "CARD",
+ "ports": ports,
+ },
+ }
+
+ j = jsonutils.dump_as_bytes(test_input)
+
+ mock_ixload = mock_ixload_type()
+ mock_ixload.connect.side_effect = RuntimeError
+
+ ixload = http_ixload.IXLOADHttpTest(j)
+ ixload.results_on_windows = 'windows_result_dir'
+ ixload.result_dir = 'my_result_dir'
+
+ with self.assertRaises(RuntimeError):
+ ixload.start_http_test()
+
+ @mock.patch('yardstick.network_services.traffic_profile.http_ixload.IxLoad')
+ @mock.patch('yardstick.network_services.traffic_profile.http_ixload.StatCollectorUtils')
+ def test_start_http_test(self, mock_collector_type, mock_ixload_type):
+ ports = [1, 2, 3]
+ test_input = {
+ "remote_server": "REMOTE_SERVER",
+ "ixload_cfg": "IXLOAD_CFG",
+ "result_dir": "RESULT_DIR",
+ "ixia_chassis": "IXIA_CHASSIS",
+ "IXIA": {
+ "card": "CARD",
+ "ports": ports,
+ },
+ }
+
+ j = jsonutils.dump_as_bytes(test_input)
+
+ ixload = http_ixload.IXLOADHttpTest(j)
+ ixload.results_on_windows = 'windows_result_dir'
+ ixload.result_dir = 'my_result_dir'
+ ixload.load_config_file = mock.MagicMock()
+
+ self.assertIsNone(ixload.start_http_test())
+
+ @mock.patch('yardstick.network_services.traffic_profile.http_ixload.IxLoad')
+ @mock.patch('yardstick.network_services.traffic_profile.http_ixload.StatCollectorUtils')
+ def test_start_http_test_reassign_error(self, mock_collector_type, mock_ixload_type):
+ ports = [1, 2, 3]
+ test_input = {
+ "remote_server": "REMOTE_SERVER",
+ "ixload_cfg": "IXLOAD_CFG",
+ "result_dir": "RESULT_DIR",
+ "ixia_chassis": "IXIA_CHASSIS",
+ "IXIA": {
+ "card": "CARD",
+ "ports": ports,
+ },
+ }
+
+ j = jsonutils.dump_as_bytes(test_input)
+
+ ixload = http_ixload.IXLOADHttpTest(j)
+ ixload.load_config_file = mock.MagicMock()
+
+ reassign_ports = mock.Mock(side_effect=RuntimeError)
+ ixload.reassign_ports = reassign_ports
+ ixload.results_on_windows = 'windows_result_dir'
+ ixload.result_dir = 'my_result_dir'
+
+ ixload.start_http_test()
+ self.assertEqual(reassign_ports.call_count, 1)
+
+ @mock.patch("yardstick.network_services.traffic_profile.http_ixload.IXLOADHttpTest")
+ def test_main(self, IXLOADHttpTest):
+ args = ["1", "2", "3"]
+ http_ixload.main(args)
diff --git a/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py b/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py
new file mode 100644
index 000000000..6dba64af9
--- /dev/null
+++ b/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py
@@ -0,0 +1,648 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from __future__ import absolute_import
+from __future__ import division
+import unittest
+import mock
+
+STL_MOCKS = {
+ 'stl': mock.MagicMock(),
+ 'stl.trex_stl_lib': mock.MagicMock(),
+ 'stl.trex_stl_lib.base64': mock.MagicMock(),
+ 'stl.trex_stl_lib.binascii': mock.MagicMock(),
+ 'stl.trex_stl_lib.collections': mock.MagicMock(),
+ 'stl.trex_stl_lib.copy': mock.MagicMock(),
+ 'stl.trex_stl_lib.datetime': mock.MagicMock(),
+ 'stl.trex_stl_lib.functools': mock.MagicMock(),
+ 'stl.trex_stl_lib.imp': mock.MagicMock(),
+ 'stl.trex_stl_lib.inspect': mock.MagicMock(),
+ 'stl.trex_stl_lib.json': mock.MagicMock(),
+ 'stl.trex_stl_lib.linecache': mock.MagicMock(),
+ 'stl.trex_stl_lib.math': mock.MagicMock(),
+ 'stl.trex_stl_lib.os': mock.MagicMock(),
+ 'stl.trex_stl_lib.platform': mock.MagicMock(),
+ 'stl.trex_stl_lib.pprint': mock.MagicMock(),
+ 'stl.trex_stl_lib.random': mock.MagicMock(),
+ 'stl.trex_stl_lib.re': mock.MagicMock(),
+ 'stl.trex_stl_lib.scapy': mock.MagicMock(),
+ 'stl.trex_stl_lib.socket': mock.MagicMock(),
+ 'stl.trex_stl_lib.string': mock.MagicMock(),
+ 'stl.trex_stl_lib.struct': mock.MagicMock(),
+ 'stl.trex_stl_lib.sys': mock.MagicMock(),
+ 'stl.trex_stl_lib.threading': mock.MagicMock(),
+ 'stl.trex_stl_lib.time': mock.MagicMock(),
+ 'stl.trex_stl_lib.traceback': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
+ 'stl.trex_stl_lib.types': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.common': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.json': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.os': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.random': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.re': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.string': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
+ 'stl.trex_stl_lib.warnings': mock.MagicMock(),
+ 'stl.trex_stl_lib.yaml': mock.MagicMock(),
+ 'stl.trex_stl_lib.zlib': mock.MagicMock(),
+ 'stl.trex_stl_lib.zmq': mock.MagicMock(),
+}
+
+STLClient = mock.MagicMock()
+stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
+stl_patch.start()
+
+if stl_patch:
+ from yardstick.network_services.traffic_profile.traffic_profile \
+ import TrexProfile
+ from yardstick.network_services.traffic_profile.ixia_rfc2544 import \
+ IXIARFC2544Profile
+ from yardstick.network_services.traffic_profile import ixia_rfc2544
+
+
+class TestIXIARFC2544Profile(unittest.TestCase):
+ TRAFFIC_PROFILE = {
+ "schema": "isb:traffic_profile:0.1",
+ "name": "fixed",
+ "description": "Fixed traffic profile to run UDP traffic",
+ "traffic_profile": {
+ "traffic_type": "FixedTraffic",
+ "frame_rate": 100, # pps
+ "flow_number": 10,
+ "frame_size": 64}}
+
+ PROFILE = {'description': 'Traffic profile to run RFC2544 latency',
+ 'name': 'rfc2544',
+ 'traffic_profile': {'traffic_type': 'IXIARFC2544Profile',
+ 'frame_rate': 100},
+ 'public': {'ipv4':
+ {'outer_l2': {'framesize':
+ {'64B': '100', '1518B': '0',
+ '128B': '0', '1400B': '0',
+ '256B': '0', '373b': '0',
+ '570B': '0'}},
+ 'outer_l3v4': {'dstip4': '1.1.1.1-1.15.255.255',
+ 'proto': 'udp',
+ 'srcip4': '90.90.1.1-90.105.255.255',
+ 'dscp': 0, 'ttl': 32},
+ 'outer_l4': {'srcport': '2001',
+ 'dsrport': '1234'}}},
+ 'private': {'ipv4':
+ {'outer_l2': {'framesize':
+ {'64B': '100', '1518B': '0',
+ '128B': '0', '1400B': '0',
+ '256B': '0', '373b': '0',
+ '570B': '0'}},
+ 'outer_l3v4': {'dstip4': '9.9.1.1-90.105.255.255',
+ 'proto': 'udp',
+ 'srcip4': '1.1.1.1-1.15.255.255',
+ 'dscp': 0, 'ttl': 32},
+ 'outer_l4': {'dstport': '2001',
+ 'srcport': '1234'}}},
+ 'schema': 'isb:traffic_profile:0.1'}
+
+ def test_get_ixia_traffic_profile_error(self):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [-1]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ STATIC_TRAFFIC = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": True,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+ ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
+
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.rate = 100
+ mac = {"src_mac_0": "00:00:00:00:00:01",
+ "src_mac_1": "00:00:00:00:00:02",
+ "src_mac_2": "00:00:00:00:00:02",
+ "dst_mac_0": "00:00:00:00:00:03",
+ "dst_mac_1": "00:00:00:00:00:04",
+ "dst_mac_2": "00:00:00:00:00:04"}
+ self.assertRaises(IOError, r_f_c2544_profile._get_ixia_traffic_profile,
+ self.PROFILE, mac, xfile="tmp",
+ static_traffic=STATIC_TRAFFIC)
+
+
+ @mock.patch("yardstick.network_services.traffic_profile.ixia_rfc2544.open")
+ def test_get_ixia_traffic_profile(self, mock_open):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [-1]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ STATIC_TRAFFIC = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": True,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+ ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
+
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.rate = 100
+ mac = {"src_mac_0": "00:00:00:00:00:01",
+ "src_mac_1": "00:00:00:00:00:02",
+ "src_mac_2": "00:00:00:00:00:02",
+ "dst_mac_0": "00:00:00:00:00:03",
+ "dst_mac_1": "00:00:00:00:00:04",
+ "dst_mac_2": "00:00:00:00:00:04"}
+ result = r_f_c2544_profile._get_ixia_traffic_profile(
+ self.PROFILE, mac, xfile="tmp", static_traffic=STATIC_TRAFFIC)
+ self.assertIsNotNone(result)
+
+ @mock.patch("yardstick.network_services.traffic_profile.ixia_rfc2544.open")
+ def test_get_ixia_traffic_profile_v6(self, mock_open):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [-1]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ STATIC_TRAFFIC = {
+ "private": {
+ "id": 1,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:03",
+ "framesPerSecond": True,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "dscp": 0,
+ "dstip4": "152.16.40.20",
+ "proto": "udp",
+ "srcip4": "152.16.100.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "2001",
+ "srcport": "1234"
+ },
+ "traffic_type": "continuous"
+ },
+ "public": {
+ "id": 2,
+ "bidir": "False",
+ "duration": 60,
+ "iload": "100",
+ "outer_l2": {
+ "dstmac": "00:00:00:00:00:04",
+ "framesPerSecond": True,
+ "framesize": 64,
+ "srcmac": "00:00:00:00:00:01"
+ },
+ "outer_l3": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v4": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l3v6": {
+ "count": 1024,
+ "dscp": 0,
+ "dstip4": "152.16.100.20",
+ "proto": "udp",
+ "srcip4": "152.16.40.20",
+ "ttl": 32
+ },
+ "outer_l4": {
+ "dstport": "1234",
+ "srcport": "2001"
+ },
+ "traffic_type": "continuous"
+ }
+ }
+ ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
+
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.rate = 100
+ mac = {"src_mac_0": "00:00:00:00:00:01",
+ "src_mac_1": "00:00:00:00:00:02",
+ "src_mac_2": "00:00:00:00:00:02",
+ "dst_mac_0": "00:00:00:00:00:03",
+ "dst_mac_1": "00:00:00:00:00:04",
+ "dst_mac_2": "00:00:00:00:00:04"}
+ profile_data = {'description': 'Traffic profile to run RFC2544',
+ 'name': 'rfc2544',
+ 'traffic_profile':
+ {'traffic_type': 'IXIARFC2544Profile',
+ 'frame_rate': 100},
+ 'public':
+ {'ipv4':
+ {'outer_l2': {'framesize':
+ {'64B': '100', '1518B': '0',
+ '128B': '0', '1400B': '0',
+ '256B': '0', '373b': '0',
+ '570B': '0'}},
+ 'outer_l3v6': {'dstip6': '1.1.1.1-1.15.255.255',
+ 'proto': 'udp',
+ 'srcip6': '90.90.1.1-90.105.255.255',
+ 'dscp': 0, 'ttl': 32},
+ 'outer_l4': {'srcport': '2001',
+ 'dsrport': '1234'}}},
+ 'private': {'ipv4':
+ {'outer_l2': {'framesize':
+ {'64B': '100', '1518B': '0',
+ '128B': '0', '1400B': '0',
+ '256B': '0', '373b': '0',
+ '570B': '0'}},
+ 'outer_l3v6':
+ {'dstip6': '9.9.1.1-90.105.255.255',
+ 'proto': 'udp',
+ 'srcip6': '1.1.1.1-1.15.255.255',
+ 'dscp': 0, 'ttl': 32},
+ 'outer_l4': {'dstport': '2001',
+ 'srcport': '1234'}}},
+ 'schema': 'isb:traffic_profile:0.1'}
+ result = r_f_c2544_profile._get_ixia_traffic_profile(
+ profile_data, mac, static_traffic=STATIC_TRAFFIC)
+ self.assertIsNotNone(result)
+
+ def test__ixia_traffic_generate(self):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [-1]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ traffic = {"public": {'iload': 10},
+ "private": {'iload': 10}}
+ ixia_obj = mock.MagicMock()
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.rate = 100
+ result = r_f_c2544_profile._ixia_traffic_generate(traffic_generator,
+ traffic, ixia_obj)
+ self.assertIsNone(result)
+
+ def test_execute(self):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [-1]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.first_run = True
+ r_f_c2544_profile.params = {"public": {'iload': 10},
+ "private": {'iload': 10}}
+
+ r_f_c2544_profile.get_streams = mock.Mock()
+ r_f_c2544_profile.full_profile = {}
+ r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock()
+ r_f_c2544_profile.get_multiplier = mock.Mock()
+ r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
+ ixia_obj = mock.MagicMock()
+ self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator,
+ ixia_obj))
+
+ def test_get_drop_percentage(self):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [0]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.params = self.PROFILE
+ ixia_obj = mock.MagicMock()
+ r_f_c2544_profile.execute = mock.Mock()
+ r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock()
+ r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
+ r_f_c2544_profile.get_multiplier = mock.Mock()
+ r_f_c2544_profile.tmp_throughput = 0
+ r_f_c2544_profile.tmp_drop = 0
+ r_f_c2544_profile.full_profile = {}
+ samples = {}
+ for ifname in range(1):
+ name = "xe{}".format(ifname)
+ samples[name] = {"rx_throughput_fps": 20,
+ "tx_throughput_fps": 20,
+ "rx_throughput_mbps": 10,
+ "tx_throughput_mbps": 10,
+ "RxThroughput": 10,
+ "TxThroughput": 10,
+ "in_packets": 1000,
+ "out_packets": 1000}
+ tol_min = 100.0
+ tolerance = 0.0
+ self.assertIsNotNone(r_f_c2544_profile.get_drop_percentage(
+ traffic_generator, samples,
+ tol_min, tolerance, ixia_obj))
+
+ def test_get_drop_percentage_update(self):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [0]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.params = self.PROFILE
+ ixia_obj = mock.MagicMock()
+ r_f_c2544_profile.execute = mock.Mock()
+ r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock()
+ r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
+ r_f_c2544_profile.get_multiplier = mock.Mock()
+ r_f_c2544_profile.tmp_throughput = 0
+ r_f_c2544_profile.tmp_drop = 0
+ r_f_c2544_profile.full_profile = {}
+ samples = {}
+ for ifname in range(1):
+ name = "xe{}".format(ifname)
+ samples[name] = {"rx_throughput_fps": 20,
+ "tx_throughput_fps": 20,
+ "rx_throughput_mbps": 10,
+ "tx_throughput_mbps": 10,
+ "RxThroughput": 10,
+ "TxThroughput": 10,
+ "in_packets": 1000,
+ "out_packets": 1002}
+ tol_min = 0.0
+ tolerance = 1.0
+ self.assertIsNotNone(r_f_c2544_profile.get_drop_percentage(
+ traffic_generator, samples,
+ tol_min, tolerance, ixia_obj))
+
+ def test_get_drop_percentage_div_zero(self):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [0]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.params = self.PROFILE
+ ixia_obj = mock.MagicMock()
+ r_f_c2544_profile.execute = mock.Mock()
+ r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock()
+ r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
+ r_f_c2544_profile.get_multiplier = mock.Mock()
+ r_f_c2544_profile.tmp_throughput = 0
+ r_f_c2544_profile.tmp_drop = 0
+ r_f_c2544_profile.full_profile = {}
+ samples = {}
+ for ifname in range(1):
+ name = "xe{}".format(ifname)
+ samples[name] = {"rx_throughput_fps": 20,
+ "tx_throughput_fps": 20,
+ "rx_throughput_mbps": 10,
+ "tx_throughput_mbps": 10,
+ "RxThroughput": 10,
+ "TxThroughput": 10,
+ "in_packets": 1000,
+ "out_packets": 0}
+ tol_min = 0.0
+ tolerance = 0.0
+ r_f_c2544_profile.tmp_throughput = 0
+ self.assertIsNotNone(r_f_c2544_profile.get_drop_percentage(
+ traffic_generator, samples,
+ tol_min, tolerance, ixia_obj))
+
+ def test_get_multiplier(self):
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.max_rate = 100
+ r_f_c2544_profile.min_rate = 100
+ self.assertEqual("1.0", r_f_c2544_profile.get_multiplier())
+
+ def test_start_ixia_latency(self):
+ traffic_generator = mock.Mock(autospec=TrexProfile)
+ traffic_generator.my_ports = [0, 1]
+ traffic_generator.priv_ports = [0]
+ traffic_generator.pub_ports = [1]
+ traffic_generator.client = \
+ mock.Mock(return_value=True)
+ r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE)
+ r_f_c2544_profile.max_rate = 100
+ r_f_c2544_profile.min_rate = 100
+ ixia_obj = mock.MagicMock()
+ r_f_c2544_profile._get_ixia_traffic_profile = \
+ mock.Mock(return_value={})
+ r_f_c2544_profile.full_profile = {}
+ r_f_c2544_profile._ixia_traffic_generate = mock.Mock()
+ self.assertEqual(
+ None,
+ r_f_c2544_profile.start_ixia_latency(traffic_generator,
+ ixia_obj))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml b/tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml
new file mode 100644
index 000000000..b184a29e2
--- /dev/null
+++ b/tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml
@@ -0,0 +1,47 @@
+# 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.
+
+access-list1:
+ acl:
+ access-list-entries:
+ - ace:
+ ace-oper-data:
+ match-counter: 0
+ actions: drop,count
+ matches:
+ destination-ipv4-network: 152.16.40.20/24
+ destination-port-range:
+ lower-port: 0
+ upper-port: 65535
+ source-ipv4-network: 0.0.0.0/0
+ source-port-range:
+ lower-port: 0
+ upper-port: 65535
+ rule-name: rule1588
+ - ace:
+ ace-oper-data:
+ match-counter: 0
+ actions: drop,count
+ matches:
+ destination-ipv4-network: 0.0.0.0/0
+ destination-port-range:
+ lower-port: 0
+ upper-port: 65535
+ source-ipv4-network: 152.16.100.20/24
+ source-port-range:
+ lower-port: 0
+ upper-port: 65535
+ rule-name: rule1589
+ acl-name: sample-ipv4-acl
+ acl-type: ipv4-acl
diff --git a/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py
new file mode 100644
index 000000000..c079a2ad0
--- /dev/null
+++ b/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py
@@ -0,0 +1,456 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from __future__ import absolute_import
+import unittest
+import mock
+import os
+
+
+STL_MOCKS = {
+ 'stl': mock.MagicMock(),
+ 'stl.trex_stl_lib': mock.MagicMock(),
+ 'stl.trex_stl_lib.base64': mock.MagicMock(),
+ 'stl.trex_stl_lib.binascii': mock.MagicMock(),
+ 'stl.trex_stl_lib.collections': mock.MagicMock(),
+ 'stl.trex_stl_lib.copy': mock.MagicMock(),
+ 'stl.trex_stl_lib.datetime': mock.MagicMock(),
+ 'stl.trex_stl_lib.functools': mock.MagicMock(),
+ 'stl.trex_stl_lib.imp': mock.MagicMock(),
+ 'stl.trex_stl_lib.inspect': mock.MagicMock(),
+ 'stl.trex_stl_lib.json': mock.MagicMock(),
+ 'stl.trex_stl_lib.linecache': mock.MagicMock(),
+ 'stl.trex_stl_lib.math': mock.MagicMock(),
+ 'stl.trex_stl_lib.os': mock.MagicMock(),
+ 'stl.trex_stl_lib.platform': mock.MagicMock(),
+ 'stl.trex_stl_lib.pprint': mock.MagicMock(),
+ 'stl.trex_stl_lib.random': mock.MagicMock(),
+ 'stl.trex_stl_lib.re': mock.MagicMock(),
+ 'stl.trex_stl_lib.scapy': mock.MagicMock(),
+ 'stl.trex_stl_lib.socket': mock.MagicMock(),
+ 'stl.trex_stl_lib.string': mock.MagicMock(),
+ 'stl.trex_stl_lib.struct': mock.MagicMock(),
+ 'stl.trex_stl_lib.sys': mock.MagicMock(),
+ 'stl.trex_stl_lib.threading': mock.MagicMock(),
+ 'stl.trex_stl_lib.time': mock.MagicMock(),
+ 'stl.trex_stl_lib.traceback': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
+ 'stl.trex_stl_lib.types': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.common': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.json': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.os': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.random': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.re': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.string': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
+ 'stl.trex_stl_lib.warnings': mock.MagicMock(),
+ 'stl.trex_stl_lib.yaml': mock.MagicMock(),
+ 'stl.trex_stl_lib.zlib': mock.MagicMock(),
+ 'stl.trex_stl_lib.zmq': mock.MagicMock(),
+}
+
+STLClient = mock.MagicMock()
+stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
+stl_patch.start()
+
+if stl_patch:
+ from yardstick.network_services.vnf_generic.vnf.acl_vnf import AclApproxVnf
+ from yardstick.network_services.vnf_generic.vnf import acl_vnf
+ from yardstick.network_services.nfvi.resource import ResourceProfile
+
+
+TEST_FILE_YAML = 'nsb_test_case.yaml'
+
+
+name = 'vnf__1'
+
+
+@mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Process")
+class TestAclApproxVnf(unittest.TestCase):
+ VNFD = {'vnfd:vnfd-catalog':
+ {'vnfd':
+ [{'short-name': 'VpeVnf',
+ 'vdu':
+ [{'routing_table':
+ [{'network': '152.16.100.20',
+ 'netmask': '255.255.255.0',
+ 'gateway': '152.16.100.20',
+ 'if': 'xe0'},
+ {'network': '152.16.40.20',
+ 'netmask': '255.255.255.0',
+ 'gateway': '152.16.40.20',
+ 'if': 'xe1'}],
+ 'description': 'VPE approximation using DPDK',
+ 'name': 'vpevnf-baremetal',
+ 'nd_route_tbl':
+ [{'network': '0064:ff9b:0:0:0:0:9810:6414',
+ 'netmask': '112',
+ 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
+ 'if': 'xe0'},
+ {'network': '0064:ff9b:0:0:0:0:9810:2814',
+ 'netmask': '112',
+ 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
+ 'if': 'xe1'}],
+ 'id': 'vpevnf-baremetal',
+ 'external-interface':
+ [{'virtual-interface':
+ {'dst_mac': '00:00:00:00:00:04',
+ 'vpci': '0000:05:00.0',
+ 'local_ip': '152.16.100.19',
+ 'type': 'PCI-PASSTHROUGH',
+ 'netmask': '255.255.255.0',
+ 'dpdk_port_num': '0',
+ 'bandwidth': '10 Gbps',
+ 'driver': "i40e",
+ 'dst_ip': '152.16.100.20',
+ 'local_iface_name': 'xe0',
+ 'local_mac': '00:00:00:00:00:02'},
+ 'vnfd-connection-point-ref': 'xe0',
+ 'name': 'xe0'},
+ {'virtual-interface':
+ {'dst_mac': '00:00:00:00:00:03',
+ 'vpci': '0000:05:00.1',
+ 'local_ip': '152.16.40.19',
+ 'type': 'PCI-PASSTHROUGH',
+ 'driver': "i40e",
+ 'netmask': '255.255.255.0',
+ 'dpdk_port_num': '1',
+ 'bandwidth': '10 Gbps',
+ 'dst_ip': '152.16.40.20',
+ 'local_iface_name': 'xe1',
+ 'local_mac': '00:00:00:00:00:01'},
+ 'vnfd-connection-point-ref': 'xe1',
+ 'name': 'xe1'}]}],
+ 'description': 'Vpe approximation using DPDK',
+ 'mgmt-interface':
+ {'vdu-id': 'vpevnf-baremetal',
+ 'host': '1.2.1.1',
+ 'password': 'r00t',
+ 'user': 'root',
+ 'ip': '1.2.1.1'},
+ 'benchmark':
+ {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
+ 'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
+ {'type': 'VPORT', 'name': 'xe1'}],
+ 'id': 'AclApproxVnf', 'name': 'VPEVnfSsh'}]}}
+
+ scenario_cfg = {'options': {'packetsize': 64, 'traffic_type': 4,
+ 'rfc2544': {'allowed_drop_rate': '0.8 - 1'},
+ 'vnf__1': {'rules': 'acl_1rule.yaml',
+ 'vnf_config': {'lb_config': 'SW',
+ 'lb_count': 1,
+ 'worker_config':
+ '1C/1T',
+ 'worker_threads': 1}}
+ },
+ 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7',
+ 'task_path': '/tmp',
+ 'tc': 'tc_ipv4_1Mflow_64B_packetsize',
+ 'runner': {'object': 'NetworkServiceTestCase',
+ 'interval': 35,
+ 'output_filename': '/tmp/yardstick.out',
+ 'runner_id': 74476, 'duration': 400,
+ 'type': 'Duration'},
+ 'traffic_profile': 'ipv4_throughput_acl.yaml',
+ 'traffic_options': {'flow': 'ipv4_Packets_acl.yaml',
+ 'imix': 'imix_voice.yaml'},
+ 'type': 'ISB',
+ 'nodes': {'tg__2': 'trafficgen_2.yardstick',
+ 'tg__1': 'trafficgen_1.yardstick',
+ 'vnf__1': 'vnf.yardstick'},
+ 'topology': 'vpe-tg-topology-baremetal.yaml'}
+
+ context_cfg = {'nodes': {'tg__2':
+ {'member-vnf-index': '3',
+ 'role': 'TrafficGen',
+ 'name': 'trafficgen_2.yardstick',
+ 'vnfd-id-ref': 'tg__2',
+ 'ip': '1.2.1.1',
+ 'interfaces':
+ {'xe0': {'local_iface_name': 'ens513f0',
+ 'vld_id': 'public',
+ 'netmask': '255.255.255.0',
+ 'local_ip': '152.16.40.20',
+ 'dst_mac': '00:00:00:00:00:01',
+ 'local_mac': '00:00:00:00:00:03',
+ 'dst_ip': '152.16.40.19',
+ 'driver': 'ixgbe',
+ 'vpci': '0000:02:00.0',
+ 'dpdk_port_num': 0},
+ 'xe1': {'local_iface_name': 'ens513f1',
+ 'netmask': '255.255.255.0',
+ 'network': '202.16.100.0',
+ 'local_ip': '202.16.100.20',
+ 'local_mac': '00:1e:67:d0:60:5d',
+ 'driver': 'ixgbe',
+ 'vpci': '0000:02:00.1',
+ 'dpdk_port_num': 1}},
+ 'password': 'r00t',
+ 'VNF model': 'l3fwd_vnf.yaml',
+ 'user': 'root'},
+ 'tg__1':
+ {'member-vnf-index': '1',
+ 'role': 'TrafficGen',
+ 'name': 'trafficgen_1.yardstick',
+ 'vnfd-id-ref': 'tg__1',
+ 'ip': '1.2.1.1',
+ 'interfaces':
+ {'xe0': {'local_iface_name': 'ens785f0',
+ 'vld_id': 'private',
+ 'netmask': '255.255.255.0',
+ 'local_ip': '152.16.100.20',
+ 'dst_mac': '00:00:00:00:00:02',
+ 'local_mac': '00:00:00:00:00:04',
+ 'dst_ip': '152.16.100.19',
+ 'driver': 'i40e',
+ 'vpci': '0000:05:00.0',
+ 'dpdk_port_num': 0},
+ 'xe1': {'local_iface_name': 'ens785f1',
+ 'netmask': '255.255.255.0',
+ 'local_ip': '152.16.100.21',
+ 'local_mac': '00:00:00:00:00:01',
+ 'driver': 'i40e',
+ 'vpci': '0000:05:00.1',
+ 'dpdk_port_num': 1}},
+ 'password': 'r00t',
+ 'VNF model': 'tg_rfc2544_tpl.yaml',
+ 'user': 'root'},
+ 'vnf__1':
+ {'name': 'vnf.yardstick',
+ 'vnfd-id-ref': 'vnf__1',
+ 'ip': '1.2.1.1',
+ 'interfaces':
+ {'xe0': {'local_iface_name': 'ens786f0',
+ 'vld_id': 'private',
+ 'netmask': '255.255.255.0',
+ 'local_ip': '152.16.100.19',
+ 'dst_mac': '00:00:00:00:00:04',
+ 'local_mac': '00:00:00:00:00:02',
+ 'dst_ip': '152.16.100.20',
+ 'driver': 'i40e',
+ 'vpci': '0000:05:00.0',
+ 'dpdk_port_num': 0},
+ 'xe1': {'local_iface_name': 'ens786f1',
+ 'vld_id': 'public',
+ 'netmask': '255.255.255.0',
+ 'local_ip': '152.16.40.19',
+ 'dst_mac': '00:00:00:00:00:03',
+ 'local_mac': '00:00:00:00:00:01',
+ 'dst_ip': '152.16.40.20',
+ 'driver': 'i40e',
+ 'vpci': '0000:05:00.1',
+ 'dpdk_port_num': 1}},
+ 'routing_table':
+ [{'netmask': '255.255.255.0',
+ 'gateway': '152.16.100.20',
+ 'network': '152.16.100.20',
+ 'if': 'xe0'},
+ {'netmask': '255.255.255.0',
+ 'gateway': '152.16.40.20',
+ 'network': '152.16.40.20',
+ 'if': 'xe1'}],
+ 'member-vnf-index': '2',
+ 'host': '1.2.1.1',
+ 'role': 'vnf',
+ 'user': 'root',
+ 'nd_route_tbl':
+ [{'netmask': '112',
+ 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
+ 'network': '0064:ff9b:0:0:0:0:9810:6414',
+ 'if': 'xe0'},
+ {'netmask': '112',
+ 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
+ 'network': '0064:ff9b:0:0:0:0:9810:2814',
+ 'if': 'xe1'}],
+ 'password': 'r00t',
+ 'VNF model': 'acl_vnf.yaml'}}}
+
+ def test___init__(self, mock_process):
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ self.assertIsNone(acl_approx_vnf._vnf_process)
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
+ def test_collect_kpi(self, mock_time, mock_process):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ acl_approx_vnf.q_in = mock.MagicMock()
+ acl_approx_vnf.q_out = mock.MagicMock()
+ acl_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
+ acl_approx_vnf.resource = mock.Mock(autospec=ResourceProfile)
+ acl_approx_vnf.vnf_execute = mock.Mock(return_value="")
+ result = {'packets_dropped': 0, 'packets_fwd': 0,
+ 'packets_in': 0}
+ self.assertEqual(result, acl_approx_vnf.collect_kpi())
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
+ def test_vnf_execute_command(self, mock_time, mock_process):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ acl_approx_vnf.q_in = mock.MagicMock()
+ acl_approx_vnf.q_out = mock.MagicMock()
+ acl_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
+ cmd = "quit"
+ self.assertEqual("", acl_approx_vnf.vnf_execute(cmd))
+
+ def test_get_stats(self, mock_process):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ acl_approx_vnf.q_in = mock.MagicMock()
+ acl_approx_vnf.q_out = mock.MagicMock()
+ acl_approx_vnf.q_out.qsize = mock.Mock(return_value=0)
+ mock_result = \
+ "ACL TOTAL: pkts_processed: 100, pkts_drop: 0, spkts_received: 100"
+ acl_approx_vnf.vnf_execute = mock.Mock(return_value=mock_result)
+ self.assertEqual(mock_result, acl_approx_vnf.get_stats())
+
+ def _get_file_abspath(self, filename):
+ curr_path = os.path.dirname(os.path.abspath(__file__))
+ file_path = os.path.join(curr_path, filename)
+ return file_path
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.hex")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.eval")
+ @mock.patch('yardstick.network_services.vnf_generic.vnf.acl_vnf.open')
+ def test_run_acl(self, mock_open, eval, hex, mock_process):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh_mock.run = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ acl_approx_vnf._build_config = mock.MagicMock()
+ acl_approx_vnf.queue_wrapper = mock.MagicMock()
+ acl_approx_vnf.ssh_helper = mock.MagicMock()
+ acl_approx_vnf.ssh_helper.run = mock.MagicMock()
+ acl_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg
+ acl_approx_vnf.vnf_cfg = {'lb_config': 'SW',
+ 'lb_count': 1,
+ 'worker_config': '1C/1T',
+ 'worker_threads': 1}
+ acl_approx_vnf.all_options = {'traffic_type': '4',
+ 'topology': 'nsb_test_case.yaml'}
+ acl_approx_vnf._run()
+ acl_approx_vnf.ssh_helper.run.assert_called_once()
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.YangModel")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.find_relative_file")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context")
+ def test_instantiate(self, mock_context, mock_yang, mock_find, mock_process):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ acl_approx_vnf.ssh_helper = ssh
+ acl_approx_vnf.deploy_helper = mock.MagicMock()
+ acl_approx_vnf.resource_helper = mock.MagicMock()
+ acl_approx_vnf._build_config = mock.MagicMock()
+ self.scenario_cfg['vnf_options'] = {'acl': {'cfg': "",
+ 'rules': ""}}
+ acl_approx_vnf.q_out.put("pipeline>")
+ acl_approx_vnf.WAIT_TIME = 0
+ self.scenario_cfg.update({"nodes": {"vnf__1": ""}})
+ self.assertIsNone(acl_approx_vnf.instantiate(self.scenario_cfg,
+ self.context_cfg))
+
+ def test_instantiate_panic(self, mock_process):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = mock.Mock(return_value=(1, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ self.scenario_cfg['vnf_options'] = {'acl': {'cfg': "",
+ 'rules': ""}}
+ acl_approx_vnf._run_acl = mock.Mock(return_value=0)
+ acl_approx_vnf.WAIT_TIME = 0
+ acl_approx_vnf.resource_helper = mock.MagicMock()
+ acl_approx_vnf._build_config = mock.MagicMock()
+ acl_approx_vnf._vnf_process = mock.MagicMock()
+ acl_approx_vnf._vnf_process.start = mock.Mock()
+ acl_approx_vnf._vnf_process.is_alive = mock.Mock(return_value=True)
+ self.assertRaises(ValueError, acl_approx_vnf.instantiate,
+ self.scenario_cfg, self.context_cfg)
+ acl_approx_vnf.q_out.put("PANIC")
+ acl_approx_vnf.WAIT_TIME = 0
+ self.assertRaises(ValueError, acl_approx_vnf.instantiate,
+ self.scenario_cfg, self.context_cfg)
+
+ def test_scale(self, mock_process):
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ flavor = ""
+ self.assertRaises(NotImplementedError, acl_approx_vnf.scale, flavor)
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time")
+ def test_terminate(self, mock_time, mock_process):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ acl_approx_vnf = AclApproxVnf(name, vnfd)
+ acl_approx_vnf._vnf_process = mock.MagicMock()
+ acl_approx_vnf._vnf_process.terminate = mock.Mock()
+ acl_approx_vnf.used_drivers = {"01:01.0": "i40e",
+ "01:01.1": "i40e"}
+ acl_approx_vnf.vnf_execute = mock.MagicMock()
+ acl_approx_vnf.ssh_helper = ssh_mock
+ acl_approx_vnf.dpdk_nic_bind = "dpdk_nic_bind.py"
+ acl_approx_vnf._resource_collect_stop = mock.Mock()
+ self.assertEqual(None, acl_approx_vnf.terminate())
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py
new file mode 100644
index 000000000..cda44127e
--- /dev/null
+++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py
@@ -0,0 +1,374 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from __future__ import absolute_import
+import unittest
+import mock
+import subprocess
+
+STL_MOCKS = {
+ 'stl': mock.MagicMock(),
+ 'stl.trex_stl_lib': mock.MagicMock(),
+ 'stl.trex_stl_lib.base64': mock.MagicMock(),
+ 'stl.trex_stl_lib.binascii': mock.MagicMock(),
+ 'stl.trex_stl_lib.collections': mock.MagicMock(),
+ 'stl.trex_stl_lib.copy': mock.MagicMock(),
+ 'stl.trex_stl_lib.datetime': mock.MagicMock(),
+ 'stl.trex_stl_lib.functools': mock.MagicMock(),
+ 'stl.trex_stl_lib.imp': mock.MagicMock(),
+ 'stl.trex_stl_lib.inspect': mock.MagicMock(),
+ 'stl.trex_stl_lib.json': mock.MagicMock(),
+ 'stl.trex_stl_lib.linecache': mock.MagicMock(),
+ 'stl.trex_stl_lib.math': mock.MagicMock(),
+ 'stl.trex_stl_lib.os': mock.MagicMock(),
+ 'stl.trex_stl_lib.platform': mock.MagicMock(),
+ 'stl.trex_stl_lib.pprint': mock.MagicMock(),
+ 'stl.trex_stl_lib.random': mock.MagicMock(),
+ 'stl.trex_stl_lib.re': mock.MagicMock(),
+ 'stl.trex_stl_lib.scapy': mock.MagicMock(),
+ 'stl.trex_stl_lib.socket': mock.MagicMock(),
+ 'stl.trex_stl_lib.string': mock.MagicMock(),
+ 'stl.trex_stl_lib.struct': mock.MagicMock(),
+ 'stl.trex_stl_lib.sys': mock.MagicMock(),
+ 'stl.trex_stl_lib.threading': mock.MagicMock(),
+ 'stl.trex_stl_lib.time': mock.MagicMock(),
+ 'stl.trex_stl_lib.traceback': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
+ 'stl.trex_stl_lib.types': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.common': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.json': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.os': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.random': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.re': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.string': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
+ 'stl.trex_stl_lib.warnings': mock.MagicMock(),
+ 'stl.trex_stl_lib.yaml': mock.MagicMock(),
+ 'stl.trex_stl_lib.zlib': mock.MagicMock(),
+ 'stl.trex_stl_lib.zmq': mock.MagicMock(),
+}
+
+STLClient = mock.MagicMock()
+stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
+stl_patch.start()
+
+if stl_patch:
+ from yardstick.network_services.vnf_generic.vnf.tg_ixload import IxLoadTrafficGen
+ from yardstick.network_services.vnf_generic.vnf.tg_ixload import IxLoadResourceHelper
+ from yardstick.network_services.traffic_profile.base import TrafficProfile
+
+
+NAME = "tg__1"
+
+
+class TestIxLoadTrafficGen(unittest.TestCase):
+ VNFD = {'vnfd:vnfd-catalog':
+ {'vnfd':
+ [{'short-name': 'VpeVnf',
+ 'vdu':
+ [{'routing_table':
+ [{'network': '152.16.100.20',
+ 'netmask': '255.255.255.0',
+ 'gateway': '152.16.100.20',
+ 'if': 'xe0'},
+ {'network': '152.16.40.20',
+ 'netmask': '255.255.255.0',
+ 'gateway': '152.16.40.20',
+ 'if': 'xe1'}],
+ 'description': 'VPE approximation using DPDK',
+ 'name': 'vpevnf-baremetal',
+ 'nd_route_tbl':
+ [{'network': '0064:ff9b:0:0:0:0:9810:6414',
+ 'netmask': '112',
+ 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
+ 'if': 'xe0'},
+ {'network': '0064:ff9b:0:0:0:0:9810:2814',
+ 'netmask': '112',
+ 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
+ 'if': 'xe1'}],
+ 'id': 'vpevnf-baremetal',
+ 'external-interface':
+ [{'virtual-interface':
+ {'dst_mac': '00:00:00:00:00:04',
+ 'vpci': '0000:05:00.0',
+ 'local_ip': '152.16.100.19',
+ 'type': 'PCI-PASSTHROUGH',
+ 'netmask': '255.255.255.0',
+ 'dpdk_port_num': '0',
+ 'bandwidth': '10 Gbps',
+ 'driver': "i40e",
+ 'dst_ip': '152.16.100.20',
+ 'local_iface_name': 'xe0',
+ 'local_mac': '00:00:00:00:00:02'},
+ 'vnfd-connection-point-ref': 'xe0',
+ 'name': 'xe0'},
+ {'virtual-interface':
+ {'dst_mac': '00:00:00:00:00:03',
+ 'vpci': '0000:05:00.1',
+ 'local_ip': '152.16.40.19',
+ 'type': 'PCI-PASSTHROUGH',
+ 'driver': "i40e",
+ 'netmask': '255.255.255.0',
+ 'dpdk_port_num': '1',
+ 'bandwidth': '10 Gbps',
+ 'dst_ip': '152.16.40.20',
+ 'local_iface_name': 'xe1',
+ 'local_mac': '00:00:00:00:00:01'},
+ 'vnfd-connection-point-ref': 'xe1',
+ 'name': 'xe1'}]}],
+ 'description': 'Vpe approximation using DPDK',
+ 'mgmt-interface':
+ {'vdu-id': 'vpevnf-baremetal',
+ 'host': '1.1.1.1',
+ 'password': 'r00t',
+ 'user': 'root',
+ 'ip': '1.1.1.1'},
+ 'benchmark':
+ {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
+ 'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
+ {'type': 'VPORT', 'name': 'xe1'}],
+ 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
+
+ TRAFFIC_PROFILE = {
+ "schema": "isb:traffic_profile:0.1",
+ "name": "fixed",
+ "description": "Fixed traffic profile to run UDP traffic",
+ "traffic_profile": {
+ "traffic_type": "FixedTraffic",
+ "frame_rate": 100, # pps
+ "flow_number": 10,
+ "frame_size": 64}}
+
+ def test___init__(self):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
+ self.assertIsNone(ixload_traffic_gen.data)
+
+ def test_collect_kpi(self):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
+ ixload_traffic_gen.data = {}
+ restult = ixload_traffic_gen.collect_kpi()
+ self.assertEqual({}, restult)
+
+ def test_listen_traffic(self):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
+ self.assertEqual(None, ixload_traffic_gen.listen_traffic({}))
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.makedirs")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
+ def test_instantiate(self, call, shutil, mock_makedirs):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh_mock.run = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
+ scenario_cfg = {'tc': "nsb_test_case",
+ 'ixia_profile': "ixload.cfg"}
+ ixload_traffic_gen.RESULTS_MOUNT = "/tmp/result"
+ shutil.copy = mock.Mock()
+ scenario_cfg.update({'options': {'packetsize': 64, 'traffic_type': 4,
+ 'rfc2544': {'allowed_drop_rate': '0.8 - 1'},
+ 'vnf__1': {'rules': 'acl_1rule.yaml',
+ 'vnf_config': {'lb_config': 'SW',
+ 'lb_count': 1,
+ 'worker_config':
+ '1C/1T',
+ 'worker_threads': 1}}
+ }})
+ self.assertRaises(IOError,
+ ixload_traffic_gen.instantiate(scenario_cfg, {}))
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.min")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.max")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.len")
+ def test_run_traffic(self, call, shutil, main_open, min, max, len):
+ mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
+ mock_traffic_profile.get_traffic_definition.return_value = "64"
+ mock_traffic_profile.params = self.TRAFFIC_PROFILE
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh_mock.run = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ vnfd["mgmt-interface"].update({"tg-config": {}})
+ vnfd["mgmt-interface"]["tg-config"].update({"ixchassis":
+ "1.1.1.1"})
+ vnfd["mgmt-interface"]["tg-config"].update({"py_bin_path":
+ "/root"})
+ sut = IxLoadTrafficGen(NAME, vnfd)
+ sut.connection = mock.Mock()
+ sut.connection.run = mock.Mock()
+ sut._traffic_runner = mock.Mock(return_value=0)
+ shutil.copy = mock.Mock()
+ result = sut.run_traffic(mock_traffic_profile)
+ self.assertIsNone(result)
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.min")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.max")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.len")
+ def test_run_traffic_csv(self, call, shutil, main_open, min, max, len):
+ mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
+ mock_traffic_profile.get_traffic_definition.return_value = "64"
+ mock_traffic_profile.params = self.TRAFFIC_PROFILE
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh_mock.run = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ vnfd["mgmt-interface"].update({"tg-config": {}})
+ vnfd["mgmt-interface"]["tg-config"].update({"ixchassis":
+ "1.1.1.1"})
+ vnfd["mgmt-interface"]["tg-config"].update({"py_bin_path":
+ "/root"})
+ sut = IxLoadTrafficGen(NAME, vnfd)
+ sut.connection = mock.Mock()
+ sut.connection.run = mock.Mock()
+ sut._traffic_runner = mock.Mock(return_value=0)
+ shutil.copy = mock.Mock()
+ subprocess.call(["touch", "/tmp/1.csv"])
+ sut.rel_bin_path = mock.Mock(return_value="/tmp/*.csv")
+ result = sut.run_traffic(mock_traffic_profile)
+ self.assertIsNone(result)
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
+ def test_terminate(self, call):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
+ self.assertEqual(None, ixload_traffic_gen.terminate())
+
+ @mock.patch("yardstick.ssh.SSH")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
+ def test_parse_csv_read(self, mock_call, mock_ssh):
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ kpi_data = {
+ 'HTTP Total Throughput (Kbps)': 1,
+ 'HTTP Simulated Users': 2,
+ 'HTTP Concurrent Connections': '3',
+ 'HTTP Connection Rate': 4.3,
+ 'HTTP Transaction Rate': True,
+ }
+ http_reader = [kpi_data]
+
+ mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH)
+ mock_ssh_type.execute.return_value = 0, "", ""
+ mock_ssh.from_node.return_value = mock_ssh_type
+
+ ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
+ result = ixload_traffic_gen.resource_helper.result
+
+ ixload_traffic_gen.resource_helper.parse_csv_read(http_reader)
+ for key_left, key_right in IxLoadResourceHelper.KPI_LIST.items():
+ self.assertEqual(result[key_left][-1], int(kpi_data[key_right]))
+
+ @mock.patch("yardstick.ssh.SSH")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
+ def test_parse_csv_read_value_error(self, mock_call, mock_ssh):
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ http_reader = [{
+ 'HTTP Total Throughput (Kbps)': 1,
+ 'HTTP Simulated Users': 2,
+ 'HTTP Concurrent Connections': "not a number",
+ 'HTTP Connection Rate': 4,
+ 'HTTP Transaction Rate': 5,
+ }]
+
+ mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH)
+ mock_ssh_type.execute.return_value = 0, "", ""
+ mock_ssh.from_node.return_value = mock_ssh_type
+
+ ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
+ init_value = ixload_traffic_gen.resource_helper.result
+
+ ixload_traffic_gen.resource_helper.parse_csv_read(http_reader)
+ self.assertDictEqual(ixload_traffic_gen.resource_helper.result, init_value)
+
+ @mock.patch("yardstick.ssh.SSH")
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call")
+ def test_parse_csv_read_error(self, mock_call, mock_ssh):
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ http_reader = [{
+ 'HTTP Total Throughput (Kbps)': 1,
+ 'HTTP Simulated Users': 2,
+ 'HTTP Concurrent Connections': 3,
+ 'HTTP Transaction Rate': 5,
+ }]
+
+ mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH)
+ mock_ssh_type.execute.return_value = 0, "", ""
+ mock_ssh.from_node.return_value = mock_ssh_type
+
+ ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd)
+
+ with self.assertRaises(KeyError):
+ ixload_traffic_gen.resource_helper.parse_csv_read(http_reader)
diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py
new file mode 100644
index 000000000..8f7f05772
--- /dev/null
+++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py
@@ -0,0 +1,405 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from __future__ import absolute_import
+import os
+import unittest
+import mock
+STL_MOCKS = {
+ 'stl': mock.MagicMock(),
+ 'stl.trex_stl_lib': mock.MagicMock(),
+ 'stl.trex_stl_lib.base64': mock.MagicMock(),
+ 'stl.trex_stl_lib.binascii': mock.MagicMock(),
+ 'stl.trex_stl_lib.collections': mock.MagicMock(),
+ 'stl.trex_stl_lib.copy': mock.MagicMock(),
+ 'stl.trex_stl_lib.datetime': mock.MagicMock(),
+ 'stl.trex_stl_lib.functools': mock.MagicMock(),
+ 'stl.trex_stl_lib.imp': mock.MagicMock(),
+ 'stl.trex_stl_lib.inspect': mock.MagicMock(),
+ 'stl.trex_stl_lib.json': mock.MagicMock(),
+ 'stl.trex_stl_lib.linecache': mock.MagicMock(),
+ 'stl.trex_stl_lib.math': mock.MagicMock(),
+ 'stl.trex_stl_lib.os': mock.MagicMock(),
+ 'stl.trex_stl_lib.platform': mock.MagicMock(),
+ 'stl.trex_stl_lib.pprint': mock.MagicMock(),
+ 'stl.trex_stl_lib.random': mock.MagicMock(),
+ 'stl.trex_stl_lib.re': mock.MagicMock(),
+ 'stl.trex_stl_lib.scapy': mock.MagicMock(),
+ 'stl.trex_stl_lib.socket': mock.MagicMock(),
+ 'stl.trex_stl_lib.string': mock.MagicMock(),
+ 'stl.trex_stl_lib.struct': mock.MagicMock(),
+ 'stl.trex_stl_lib.sys': mock.MagicMock(),
+ 'stl.trex_stl_lib.threading': mock.MagicMock(),
+ 'stl.trex_stl_lib.time': mock.MagicMock(),
+ 'stl.trex_stl_lib.traceback': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
+ 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
+ 'stl.trex_stl_lib.types': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.common': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.json': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.os': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.random': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.re': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.string': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
+ 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
+ 'stl.trex_stl_lib.warnings': mock.MagicMock(),
+ 'stl.trex_stl_lib.yaml': mock.MagicMock(),
+ 'stl.trex_stl_lib.zlib': mock.MagicMock(),
+ 'stl.trex_stl_lib.zmq': mock.MagicMock(),
+}
+
+STLClient = mock.MagicMock()
+stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
+stl_patch.start()
+
+if stl_patch:
+ from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaTrafficGen
+ from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaRfc2544Helper
+ from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaResourceHelper
+ from yardstick.network_services.traffic_profile.base import TrafficProfile
+
+TEST_FILE_YAML = 'nsb_test_case.yaml'
+
+
+NAME = "tg__1"
+
+
+@mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.IxNextgen")
+class TestIxiaResourceHelper(unittest.TestCase):
+
+ def test___init___with_custom_rfc_helper(self, mock_ix_nextgen):
+ class MyRfcHelper(IxiaRfc2544Helper):
+ pass
+
+ ixia_resource_helper = IxiaResourceHelper(mock.Mock(), MyRfcHelper)
+ self.assertIsInstance(ixia_resource_helper.rfc_helper, MyRfcHelper)
+
+ def test_stop_collect_with_client(self, mock_ix_nextgen):
+ mock_client = mock.Mock()
+
+ ixia_resource_helper = IxiaResourceHelper(mock.Mock())
+
+ ixia_resource_helper.client = mock_client
+ ixia_resource_helper.stop_collect()
+ self.assertEqual(mock_client.ix_stop_traffic.call_count, 1)
+
+
+@mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.IxNextgen")
+class TestIXIATrafficGen(unittest.TestCase):
+ VNFD = {'vnfd:vnfd-catalog':
+ {'vnfd':
+ [{'short-name': 'VpeVnf',
+ 'vdu':
+ [{'routing_table':
+ [{'network': '152.16.100.20',
+ 'netmask': '255.255.255.0',
+ 'gateway': '152.16.100.20',
+ 'if': 'xe0'},
+ {'network': '152.16.40.20',
+ 'netmask': '255.255.255.0',
+ 'gateway': '152.16.40.20',
+ 'if': 'xe1'}],
+ 'description': 'VPE approximation using DPDK',
+ 'name': 'vpevnf-baremetal',
+ 'nd_route_tbl':
+ [{'network': '0064:ff9b:0:0:0:0:9810:6414',
+ 'netmask': '112',
+ 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
+ 'if': 'xe0'},
+ {'network': '0064:ff9b:0:0:0:0:9810:2814',
+ 'netmask': '112',
+ 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
+ 'if': 'xe1'}],
+ 'id': 'vpevnf-baremetal',
+ 'external-interface':
+ [{'virtual-interface':
+ {'dst_mac': '00:00:00:00:00:04',
+ 'vpci': '0000:05:00.0',
+ 'local_ip': '152.16.100.19',
+ 'type': 'PCI-PASSTHROUGH',
+ 'netmask': '255.255.255.0',
+ 'dpdk_port_num': '0',
+ 'bandwidth': '10 Gbps',
+ 'driver': "i40e",
+ 'dst_ip': '152.16.100.20',
+ 'local_iface_name': 'xe0',
+ 'local_mac': '00:00:00:00:00:02'},
+ 'vnfd-connection-point-ref': 'xe0',
+ 'name': 'xe0'},
+ {'virtual-interface':
+ {'dst_mac': '00:00:00:00:00:03',
+ 'vpci': '0000:05:00.1',
+ 'local_ip': '152.16.40.19',
+ 'type': 'PCI-PASSTHROUGH',
+ 'driver': "i40e",
+ 'netmask': '255.255.255.0',
+ 'dpdk_port_num': '1',
+ 'bandwidth': '10 Gbps',
+ 'dst_ip': '152.16.40.20',
+ 'local_iface_name': 'xe1',
+ 'local_mac': '00:00:00:00:00:01'},
+ 'vnfd-connection-point-ref': 'xe1',
+ 'name': 'xe1'}]}],
+ 'description': 'Vpe approximation using DPDK',
+ 'mgmt-interface':
+ {'vdu-id': 'vpevnf-baremetal',
+ 'host': '1.1.1.1',
+ 'password': 'r00t',
+ 'user': 'root',
+ 'ip': '1.1.1.1'},
+ 'benchmark':
+ {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']},
+ 'connection-point': [{'type': 'VPORT', 'name': 'xe0'},
+ {'type': 'VPORT', 'name': 'xe1'}],
+ 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}}
+
+ TRAFFIC_PROFILE = {
+ "schema": "isb:traffic_profile:0.1",
+ "name": "fixed",
+ "description": "Fixed traffic profile to run UDP traffic",
+ "traffic_profile": {
+ "traffic_type": "FixedTraffic",
+ "frame_rate": 100, # pps
+ "flow_number": 10,
+ "frame_size": 64}}
+
+ TC_YAML = {'scenarios': [{'tc_options':
+ {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}},
+ 'runner': {'duration': 400,
+ 'interval': 35, 'type': 'Duration'},
+ 'traffic_options':
+ {'flow': 'ipv4_1flow_Packets_vpe.yaml',
+ 'imix': 'imix_voice.yaml'},
+ 'vnf_options': {'vpe': {'cfg': 'vpe_config'}},
+ 'traffic_profile': 'ipv4_throughput_vpe.yaml',
+ 'type': 'NSPerf',
+ 'nodes': {'tg__1': 'trafficgen_1.yardstick',
+ 'vnf__1': 'vnf.yardstick'},
+ 'topology': 'vpe_vnf_topology.yaml'}],
+ 'context': {'nfvi_type': 'baremetal', 'type': 'Node',
+ 'name': 'yardstick',
+ 'file': '/etc/yardstick/nodes/pod.yaml'},
+ 'schema': 'yardstick:task:0.1'}
+
+ def test___init__(self, mock_ixnextgen):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+
+ def test_listen_traffic(self, mock_ixnextgen):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+ self.assertEqual(None, ixnet_traffic_gen.listen_traffic({}))
+
+ def test_instantiate(self, mock_ixnextgen):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh_mock.run = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+ scenario_cfg = {'tc': "nsb_test_case", "topology": "",
+ 'ixia_profile': "ixload.cfg"}
+ scenario_cfg.update({'options': {'packetsize': 64,
+ 'traffic_type': 4,
+ 'rfc2544': {'allowed_drop_rate': '0.8 - 1'},
+ 'vnf__1': {'rules': 'acl_1rule.yaml',
+ 'vnf_config': {'lb_config': 'SW',
+ 'lb_count': 1,
+ 'worker_config':
+ '1C/1T',
+ 'worker_threads': 1}}
+ }})
+ ixnet_traffic_gen.topology = ""
+ ixnet_traffic_gen.get_ixobj = mock.MagicMock()
+ ixnet_traffic_gen._ixia_traffic_gen = mock.MagicMock()
+ ixnet_traffic_gen._ixia_traffic_gen._connect = mock.Mock()
+ self.assertRaises(
+ IOError,
+ ixnet_traffic_gen.instantiate(scenario_cfg, {}))
+
+ def test_collect_kpi(self, mock_ixnextgen):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+ ixnet_traffic_gen.data = {}
+ restult = ixnet_traffic_gen.collect_kpi()
+ self.assertEqual({}, restult)
+
+ def test_terminate(self, mock_ixnextgen):
+ with mock.patch("yardstick.ssh.SSH") as ssh:
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ ssh_mock = mock.Mock(autospec=ssh.SSH)
+ ssh_mock.execute = \
+ mock.Mock(return_value=(0, "", ""))
+ ssh.from_node.return_value = ssh_mock
+ ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd)
+ ixnet_traffic_gen._terminated = mock.MagicMock()
+ ixnet_traffic_gen._terminated.value = 0
+ ixnet_traffic_gen._ixia_traffic_gen = mock.MagicMock()
+ ixnet_traffic_gen._ixia_traffic_gen.ix_stop_traffic = mock.Mock()
+ ixnet_traffic_gen._traffic_process = mock.MagicMock()
+ ixnet_traffic_gen._traffic_process.terminate = mock.Mock()
+ self.assertEqual(None, ixnet_traffic_gen.terminate())
+
+ def _get_file_abspath(self, filename):
+ curr_path = os.path.dirname(os.path.abspath(__file__))
+ file_path = os.path.join(curr_path, filename)
+ return file_path
+
+ def test_scale(self, mock_ix_nextgen):
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ sut = IxiaTrafficGen('vnf1', vnfd)
+ sut.scale()
+
+ def test__check_status(self, mock_ix_nextgen):
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ sut = IxiaTrafficGen('vnf1', vnfd)
+ sut._check_status()
+
+ @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.time")
+ @mock.patch("yardstick.ssh.SSH")
+ def test_traffic_runner(self, mock_ixnextgen, mock_ssh, mock_time):
+ mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
+ mock_traffic_profile.get_traffic_definition.return_value = "64"
+ mock_traffic_profile.params = self.TRAFFIC_PROFILE
+
+ mock_ssh_instance = mock.Mock(autospec=mock_ssh.SSH)
+ mock_ssh_instance.execute.return_value = 0, "", ""
+ mock_ssh_instance.run.return_value = 0, "", ""
+
+ mock_ssh.from_node.return_value = mock_ssh_instance
+
+ vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
+ vnfd["mgmt-interface"].update({
+ 'tg-config': {
+ "ixchassis": "1.1.1.1",
+ "py_bin_path": "/root",
+ }
+ })
+
+ samples = {}
+ name = ''
+ for ifname in range(1):
+ name = "xe{}".format(ifname)
+ samples[name] = {
+ "Rx_Rate_Kbps": 20,
+ "Tx_Rate_Kbps": 20,
+ "Rx_Rate_Mbps": 10,
+ "Tx_Rate_Mbps": 10,
+ "RxThroughput": 10,
+ "TxThroughput": 10,
+ "Valid_Frames_Rx": 1000,
+ "Frames_Tx": 1000,
+ "in_packets": 1000,
+ "out_packets": 1000,
+ }
+
+ samples.update({"CurrentDropPercentage": 0.0})
+
+ last_res = [
+ 0,
+ {
+ "Rx_Rate_Kbps": [20, 20],
+ "Tx_Rate_Kbps": [20, 20],
+ "Rx_Rate_Mbps": [10, 10],
+ "Tx_Rate_Mbps": [10, 10],
+ "CurrentDropPercentage": [0, 0],
+ "RxThroughput": [10, 10],
+ "TxThroughput": [10, 10],
+ "Frames_Tx": [1000, 1000],
+ "in_packets": [1000, 1000],
+ "Valid_Frames_Rx": [1000, 1000],
+ "out_packets": [1000, 1000],
+ },
+ ]
+
+ mock_traffic_profile.execute.return_value = ['Completed', samples]
+ mock_traffic_profile.get_drop_percentage.return_value = ['Completed', samples]
+
+ sut = IxiaTrafficGen(name, vnfd)
+ sut.tg_port_pairs = [[[0], [1]]]
+ sut.vnf_port_pairs = [[[0], [1]]]
+ sut.tc_file_name = self._get_file_abspath(TEST_FILE_YAML)
+ sut.topology = ""
+
+ sut.ssh_helper = mock.Mock()
+ sut._traffic_process = mock.MagicMock()
+ sut.generate_port_pairs = mock.Mock()
+
+ sut._ixia_traffic_gen = mock.MagicMock()
+ sut._ixia_traffic_gen.ix_get_statistics.return_value = last_res
+
+ sut.resource_helper.client = mock.MagicMock()
+ sut.resource_helper.client_started = mock.MagicMock()
+ sut.resource_helper.client_started.value = 1
+
+ sut.scenario_helper.scenario_cfg = {
+ 'options': {
+ 'packetsize': 64,
+ 'traffic_type': 4,
+ 'rfc2544': {
+ 'allowed_drop_rate': '0.8 - 1'
+ },
+ 'vnf__1': {
+ 'rules': 'acl_1rule.yaml',
+ 'vnf_config': {
+ 'lb_config': 'SW',
+ 'lb_count': 1,
+ 'worker_config': '1C/1T',
+ 'worker_threads': 1,
+ },
+ },
+ },
+ 'ixia_profile': {}
+ }
+
+ result = sut._traffic_runner(mock_traffic_profile)
+ self.assertIsNone(result)
diff --git a/yardstick/common/constants.py b/yardstick/common/constants.py
index 8e8114fbb..822d3b4fa 100644
--- a/yardstick/common/constants.py
+++ b/yardstick/common/constants.py
@@ -8,15 +8,36 @@
##############################################################################
from __future__ import absolute_import
import os
+from functools import reduce
-from yardstick.common.utils import get_param
+import pkg_resources
+from yardstick.common.utils import parse_yaml
dirname = os.path.dirname
abspath = os.path.abspath
join = os.path.join
sep = os.path.sep
+CONF = {}
+
+
+def get_param(key, default=''):
+
+ # we have to defer this to runtime so that we can mock os.environ.get in unittests
+ conf_file = os.environ.get('CONF_FILE', '/etc/yardstick/yardstick.yaml')
+
+ # don't re-parse yaml for each lookup
+ if not CONF:
+ CONF.update(parse_yaml(conf_file))
+ try:
+ return reduce(lambda a, b: a[b], key.split('.'), CONF)
+ except KeyError:
+ if not default:
+ raise
+ return default
+
+
try:
SERVER_IP = get_param('api.server_ip')
except KeyError:
@@ -41,7 +62,8 @@ CONF_DIR = get_param('dir.conf', '/etc/yardstick')
REPOS_DIR = get_param('dir.repos', '/home/opnfv/repos/yardstick')
RELENG_DIR = get_param('dir.releng', '/home/opnfv/repos/releng')
LOG_DIR = get_param('dir.log', '/tmp/yardstick/')
-YARDSTICK_ROOT_PATH = dirname(dirname(dirname(abspath(__file__)))) + sep
+YARDSTICK_ROOT_PATH = dirname(
+ dirname(abspath(pkg_resources.resource_filename(__name__, "")))) + sep
CONF_SAMPLE_DIR = join(REPOS_DIR, 'etc/yardstick/')
ANSIBLE_DIR = join(REPOS_DIR, 'ansible')
SAMPLE_CASE_DIR = join(REPOS_DIR, 'samples')
diff --git a/yardstick/common/utils.py b/yardstick/common/utils.py
index 1059e1ce4..729bc1db9 100644
--- a/yardstick/common/utils.py
+++ b/yardstick/common/utils.py
@@ -27,7 +27,6 @@ import collections
import socket
import random
import ipaddress
-from functools import reduce
from contextlib import closing
import yaml
@@ -107,19 +106,6 @@ def parse_yaml(file_path):
return value
-def get_param(key, default=''):
-
- conf_file = os.environ.get('CONF_FILE', '/etc/yardstick/yardstick.yaml')
-
- conf = parse_yaml(conf_file)
- try:
- return reduce(lambda a, b: a[b], key.split('.'), conf)
- except KeyError:
- if not default:
- raise
- return default
-
-
def makedirs(d):
try:
os.makedirs(d)
@@ -370,3 +356,29 @@ def parse_cpuinfo(cpuinfo):
def config_to_dict(config):
return {section: dict(config.items(section)) for section in
config.sections()}
+
+
+def validate_non_string_sequence(value, default=None, raise_exc=None):
+ if isinstance(value, collections.Sequence) and not isinstance(value, str):
+ return value
+ if raise_exc:
+ raise raise_exc
+ return default
+
+
+def join_non_strings(separator, *non_strings):
+ try:
+ non_strings = validate_non_string_sequence(non_strings[0], raise_exc=RuntimeError)
+ except (IndexError, RuntimeError):
+ pass
+ return str(separator).join(str(non_string) for non_string in non_strings)
+
+
+class ErrorClass(object):
+
+ def __init__(self, *args, **kwargs):
+ if 'test' not in kwargs:
+ raise RuntimeError
+
+ def __getattr__(self, item):
+ raise AttributeError
diff --git a/yardstick/network_services/libs/__init__.py b/yardstick/network_services/libs/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/yardstick/network_services/libs/__init__.py
diff --git a/yardstick/network_services/libs/ixia_libs/IxNet/IxNet.py b/yardstick/network_services/libs/ixia_libs/IxNet/IxNet.py
new file mode 100644
index 000000000..815a2a21c
--- /dev/null
+++ b/yardstick/network_services/libs/ixia_libs/IxNet/IxNet.py
@@ -0,0 +1,335 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+from __future__ import print_function
+import sys
+import logging
+
+import re
+from itertools import product
+
+from yardstick.common.utils import ErrorClass
+
+try:
+ import IxNetwork
+except ImportError:
+ IxNetwork = ErrorClass
+
+log = logging.getLogger(__name__)
+
+IP_VERSION_4 = 4
+IP_VERSION_6 = 6
+
+
+class TrafficStreamHelper(object):
+
+ TEMPLATE = '{0.traffic_item}/{0.stream}:{0.param_id}/{1}'
+
+ def __init__(self, traffic_item, stream, param_id):
+ super(TrafficStreamHelper, self).__init__()
+ self.traffic_item = traffic_item
+ self.stream = stream
+ self.param_id = param_id
+
+ def __getattr__(self, item):
+ return self.TEMPLATE.format(self, item)
+
+
+class FramesizeHelper(object):
+
+ def __init__(self):
+ super(FramesizeHelper, self).__init__()
+ self.weighted_pairs = []
+ self.weighted_range_pairs = []
+
+ @property
+ def weighted_pairs_arg(self):
+ return '-weightedPairs', self.weighted_pairs
+
+ @property
+ def weighted_range_pairs_arg(self):
+ return '-weightedRangePairs', self.weighted_range_pairs
+
+ def make_args(self, *args):
+ return self.weighted_pairs_arg + self.weighted_range_pairs_arg + args
+
+ def populate_data(self, framesize_data):
+ for key, value in framesize_data.items():
+ if value == '0':
+ continue
+
+ replaced = re.sub('[Bb]', '', key)
+ self.weighted_pairs.extend([
+ replaced,
+ value,
+ ])
+ pairs = [
+ replaced,
+ replaced,
+ value,
+ ]
+ self.weighted_range_pairs.append(pairs)
+
+
+class IxNextgen(object):
+
+ STATS_NAME_MAP = {
+ "traffic_item": 'Traffic Item',
+ "Tx_Frames": 'Tx Frames',
+ "Rx_Frames": 'Rx Frames',
+ "Tx_Frame_Rate": 'Tx Frame Rate',
+ "Rx_Frame_Rate": 'Tx Frame Rate',
+ "Store-Forward_Avg_latency_ns": 'Store-Forward Avg Latency (ns)',
+ "Store-Forward_Min_latency_ns": 'Store-Forward Min Latency (ns)',
+ "Store-Forward_Max_latency_ns": 'Store-Forward Max Latency (ns)',
+ }
+
+ PORT_STATS_NAME_MAP = {
+ "stat_name": 'Stat Name',
+ "Frames_Tx": 'Frames Tx.',
+ "Valid_Frames_Rx": 'Valid Frames Rx.',
+ "Frames_Tx_Rate": 'Frames Tx. Rate',
+ "Valid_Frames_Rx_Rate": 'Valid Frames Rx. Rate',
+ "Tx_Rate_Kbps": 'Tx. Rate (Kbps)',
+ "Rx_Rate_Kbps": 'Rx. Rate (Kbps)',
+ "Tx_Rate_Mbps": 'Tx. Rate (Mbps)',
+ "Rx_Rate_Mbps": 'Rx. Rate (Mbps)',
+ }
+
+ LATENCY_NAME_MAP = {
+ "Store-Forward_Avg_latency_ns": 'Store-Forward Avg Latency (ns)',
+ "Store-Forward_Min_latency_ns": 'Store-Forward Min Latency (ns)',
+ "Store-Forward_Max_latency_ns": 'Store-Forward Max Latency (ns)',
+ }
+
+ RANDOM_MASK_MAP = {
+ IP_VERSION_4: '0.0.0.255',
+ IP_VERSION_6: '0:0:0:0:0:0:0:ff',
+ }
+
+ MODE_SEEDS_MAP = {
+ 0: ('private', ['256', '2048']),
+ }
+
+ MODE_SEEDS_DEFAULT = 'public', ['2048', '256']
+
+ @staticmethod
+ def find_view_obj(view_name, views):
+ edited_view_name = '::ixNet::OBJ-/statistics/view:"{}"'.format(view_name)
+ return next((view for view in views if edited_view_name == view), '')
+
+ @staticmethod
+ def get_config(tg_cfg):
+ external_interface = tg_cfg["vdu"][0]["external-interface"]
+ card_port0 = external_interface[0]["virtual-interface"]["vpci"]
+ card_port1 = external_interface[1]["virtual-interface"]["vpci"]
+ card0, port0 = card_port0.split(':')[:2]
+ card1, port1 = card_port1.split(':')[:2]
+ cfg = {
+ 'py_lib_path': tg_cfg["mgmt-interface"]["tg-config"]["py_lib_path"],
+ 'machine': tg_cfg["mgmt-interface"]["ip"],
+ 'port': tg_cfg["mgmt-interface"]["tg-config"]["tcl_port"],
+ 'chassis': tg_cfg["mgmt-interface"]["tg-config"]["ixchassis"],
+ 'card1': card0,
+ 'port1': port0,
+ 'card2': card1,
+ 'port2': port1,
+ 'output_dir': tg_cfg["mgmt-interface"]["tg-config"]["dut_result_dir"],
+ 'version': tg_cfg["mgmt-interface"]["tg-config"]["version"],
+ 'bidir': True,
+ }
+ return cfg
+
+ def __init__(self, ixnet=None):
+ self.ixnet = ixnet
+ self._objRefs = dict()
+ self._cfg = None
+ self._logger = logging.getLogger(__name__)
+ self._params = None
+ self._bidir = None
+
+ def iter_over_get_lists(self, x1, x2, y2, offset=0):
+ for x in self.ixnet.getList(x1, x2):
+ y_list = self.ixnet.getList(x, y2)
+ for i, y in enumerate(y_list, offset):
+ yield x, y, i
+
+ def set_random_ip_multi_attribute(self, ipv4, seed, fixed_bits, random_mask, l3_count):
+ self.ixnet.setMultiAttribute(
+ ipv4,
+ '-seed', str(seed),
+ '-fixedBits', str(fixed_bits),
+ '-randomMask', str(random_mask),
+ '-valueType', 'random',
+ '-countValue', str(l3_count))
+
+ def set_random_ip_multi_attributes(self, ip, version, seeds, l3):
+ try:
+ random_mask = self.RANDOM_MASK_MAP[version]
+ except KeyError:
+ raise ValueError('Unknown version %s' % version)
+
+ l3_count = l3['count']
+ if "srcIp" in ip:
+ fixed_bits = l3['srcip4']
+ self.set_random_ip_multi_attribute(ip, seeds[0], fixed_bits, random_mask, l3_count)
+ if "dstIp" in ip:
+ fixed_bits = l3['dstip4']
+ self.set_random_ip_multi_attribute(ip, seeds[1], fixed_bits, random_mask, l3_count)
+
+ def add_ip_header(self, params, version):
+ for it, ep, i in self.iter_over_get_lists('/traffic', 'trafficItem', "configElement"):
+ mode, seeds = self.MODE_SEEDS_MAP.get(i, self.MODE_SEEDS_DEFAULT)
+ l3 = params[mode]['outer_l3']
+
+ for ip, ip_bits, _ in self.iter_over_get_lists(ep, 'stack', 'field'):
+ self.set_random_ip_multi_attributes(ip_bits, version, seeds, l3)
+
+ self.ixnet.commit()
+
+ def _connect(self, tg_cfg):
+ self._cfg = self.get_config(tg_cfg)
+
+ sys.path.append(self._cfg["py_lib_path"])
+ self.ixnet = IxNetwork.IxNet()
+
+ machine = self._cfg['machine']
+ port = str(self._cfg['port'])
+ version = str(self._cfg['version'])
+ result = self.ixnet.connect(machine, '-port', port, '-version', version)
+ return result
+
+ def clear_ixia_config(self):
+ self.ixnet.execute('newConfig')
+
+ def load_ixia_profile(self, profile):
+ self.ixnet.execute('loadConfig', self.ixnet.readFrom(profile))
+
+ def ix_load_config(self, profile):
+ self.clear_ixia_config()
+ self.load_ixia_profile(profile)
+
+ def ix_assign_ports(self):
+ vports = self.ixnet.getList(self.ixnet.getRoot(), 'vport')
+ ports = [
+ (self._cfg['chassis'], self._cfg['card1'], self._cfg['port1']),
+ (self._cfg['chassis'], self._cfg['card2'], self._cfg['port2']),
+ ]
+
+ vport_list = self.ixnet.getList("/", "vport")
+ self.ixnet.execute('assignPorts', ports, [], vport_list, True)
+ self.ixnet.commit()
+
+ for vport in vports:
+ if self.ixnet.getAttribute(vport, '-state') != 'up':
+ log.error("Both thr ports are down...")
+
+ def ix_update_frame(self, params):
+ streams = ["configElement"]
+
+ for param in params.values():
+ framesize_data = FramesizeHelper()
+ traffic_items = self.ixnet.getList('/traffic', 'trafficItem')
+ param_id = param['id']
+ for traffic_item, stream in product(traffic_items, streams):
+ helper = TrafficStreamHelper(traffic_item, stream, param_id)
+
+ self.ixnet.setMultiAttribute(helper.transmissionControl,
+ '-type', '{0}'.format(param['traffic_type']),
+ '-duration', '{0}'.format(param['duration']))
+
+ stream_frame_rate_path = helper.frameRate
+ self.ixnet.setMultiAttribute(stream_frame_rate_path, '-rate', param['iload'])
+ if param['outer_l2']['framesPerSecond']:
+ self.ixnet.setMultiAttribute(stream_frame_rate_path,
+ '-type', 'framesPerSecond')
+
+ framesize_data.populate_data(param['outer_l2']['framesize'])
+
+ make_attr_args = framesize_data.make_args('-incrementFrom', '66',
+ '-randomMin', '66',
+ '-quadGaussian', [],
+ '-type', 'weightedPairs',
+ '-presetDistribution', 'cisco',
+ '-incrementTo', '1518')
+
+ self.ixnet.setMultiAttribute(helper.frameSize, *make_attr_args)
+
+ self.ixnet.commit()
+
+ def update_ether_multi_attribute(self, ether, mac_addr):
+ self.ixnet.setMultiAttribute(ether,
+ '-singleValue', mac_addr,
+ '-fieldValue', mac_addr,
+ '-valueType', 'singleValue')
+
+ def update_ether_multi_attributes(self, ether, l2):
+ if "ethernet.header.destinationAddress" in ether:
+ self.update_ether_multi_attribute(ether, str(l2['dstmac']))
+
+ if "ethernet.header.sourceAddress" in ether:
+ self.update_ether_multi_attribute(ether, str(l2['srcmac']))
+
+ def ix_update_ether(self, params):
+ for ti, ep, index in self.iter_over_get_lists('/traffic', 'trafficItem',
+ "configElement", 1):
+ iter1 = (v['outer_l2'] for v in params.values() if str(v['id']) == str(index))
+ try:
+ l2 = next(iter1, {})
+ except KeyError:
+ continue
+
+ for ip, ether, _ in self.iter_over_get_lists(ep, 'stack', 'field'):
+ self.update_ether_multi_attributes(ether, l2)
+
+ self.ixnet.commit()
+
+ def ix_update_udp(self, params):
+ pass
+
+ def ix_update_tcp(self, params):
+ pass
+
+ def ix_start_traffic(self):
+ tis = self.ixnet.getList('/traffic', 'trafficItem')
+ for ti in tis:
+ self.ixnet.execute('generate', [ti])
+ self.ixnet.execute('apply', '/traffic')
+ self.ixnet.execute('start', '/traffic')
+
+ def ix_stop_traffic(self):
+ tis = self.ixnet.getList('/traffic', 'trafficItem')
+ for _ in tis:
+ self.ixnet.execute('stop', '/traffic')
+
+ def build_stats_map(self, view_obj, name_map):
+ return {kl: self.execute_get_column_values(view_obj, kr) for kl, kr in name_map.items()}
+
+ def execute_get_column_values(self, view_obj, name):
+ return self.ixnet.execute('getColumnValues', view_obj, name)
+
+ def ix_get_statistics(self):
+ views = self.ixnet.getList('/statistics', 'view')
+ view_obj = self.find_view_obj("Traffic Item Statistics", views)
+ stats = self.build_stats_map(view_obj, self.STATS_NAME_MAP)
+
+ self.find_view_obj("Port Statistics", views)
+ ports_stats = self.build_stats_map(view_obj, self.PORT_STATS_NAME_MAP)
+
+ views = self.ixnet.getList('/statistics', 'view')
+ view_obj = self.find_view_obj("Flow Statistics", views)
+ stats["latency"] = self.build_stats_map(view_obj, self.LATENCY_NAME_MAP)
+
+ return stats, ports_stats
diff --git a/yardstick/network_services/libs/ixia_libs/IxNet/__init__.py b/yardstick/network_services/libs/ixia_libs/IxNet/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/yardstick/network_services/libs/ixia_libs/IxNet/__init__.py
diff --git a/yardstick/network_services/libs/ixia_libs/__init__.py b/yardstick/network_services/libs/ixia_libs/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/yardstick/network_services/libs/ixia_libs/__init__.py
diff --git a/yardstick/network_services/nfvi/collectd.conf b/yardstick/network_services/nfvi/collectd.conf
index abcf24ded..6d8b73f7f 100644
--- a/yardstick/network_services/nfvi/collectd.conf
+++ b/yardstick/network_services/nfvi/collectd.conf
@@ -15,7 +15,7 @@
Hostname "nsb_stats"
FQDNLookup true
-Interval 5
+Interval {interval}
##############################################################################
# LoadPlugin section #
@@ -23,10 +23,8 @@ Interval 5
# Specify what features to activate. #
##############################################################################
-LoadPlugin amqp
-LoadPlugin cpu
-LoadPlugin intel_rdt
-LoadPlugin memory
+#LoadPlugin syslog
+{loadplugin}
##############################################################################
# Plugin configuration #
@@ -35,6 +33,10 @@ LoadPlugin memory
# ription of those options is available in the collectd.conf(5) manual page. #
##############################################################################
+#<Plugin syslog>
+# LogLevel debug
+#</Plugin>
+
<Plugin amqp>
<Publish "name">
Host "0.0.0.0"
@@ -53,7 +55,7 @@ LoadPlugin memory
<Plugin cpu>
ReportByCpu true
ReportByState true
- ValuesPercentage false
+ ValuesPercentage true
</Plugin>
<Plugin memory>
@@ -61,18 +63,47 @@ LoadPlugin memory
ValuesPercentage false
</Plugin>
-<LoadPlugin intel_rdt>
- Interval 5
-</LoadPlugin>
<Plugin "intel_rdt">
Cores ""
</Plugin>
-<Plugin memcached>
- <Instance "local">
- Host "127.0.0.1"
- Port "11211"
- </Instance>
+<Plugin hugepages>
+ ReportPerNodeHP true
+ ReportRootHP true
+ ValuesPages true
+ ValuesBytes false
+ ValuesPercentage false
+</Plugin>
+
+<Plugin hugepages>
+ ReportPerNodeHP true
+ ReportRootHP true
+ ValuesPages true
+ ValuesBytes false
+ ValuesPercentage false
+</Plugin>
+
+<Plugin dpdkstat>
+ <EAL>
+ Coremask "0x1"
+ MemoryChannels "4"
+ ProcessType "secondary"
+ FilePrefix "rte"
+ </EAL>
+ SharedMemObj "dpdk_collectd_stats_0"
+ EnabledPortMask 0xffff
+ {dpdk_interface}
+</Plugin>
+
+<Plugin virt>
+ Domain "samplevnf"
+</Plugin>
+
+<Plugin ovs_stats>
+ Port "6640"
+ Address "127.0.0.1"
+ Socket "/usr/local/var/run/openvswitch/db.sock"
+ Bridges "br0" "br_ext"
</Plugin>
<Include "/etc/collectd/collectd.conf.d">
diff --git a/yardstick/network_services/nfvi/collectd.sh b/yardstick/network_services/nfvi/collectd.sh
index 7acb40431..8162ec539 100755
--- a/yardstick/network_services/nfvi/collectd.sh
+++ b/yardstick/network_services/nfvi/collectd.sh
@@ -22,8 +22,20 @@ if [ "$(whoami)" != "root" ]; then
exit 1;
fi
+echo "setup proxy..."
+http_proxy=$1
+https_proxy=$2
+if [[ "$http_proxy" != "" ]]; then
+ export http_proxy=$http_proxy
+ export https_proxy=$http_proxy
+fi
+
+if [[ "$https_proxy" != "" ]]; then
+ export https_proxy=$https_proxy
+fi
+
echo "Install required libraries to run collectd..."
-pkg=(git flex bison build-essential pkg-config automake autotools-dev libltdl-dev librabbitmq-dev rabbitmq-server)
+pkg=(git flex bison build-essential pkg-config automake autotools-dev libltdl-dev librabbitmq-dev rabbitmq-server cmake)
for i in "${pkg[@]}"; do
dpkg-query -W --showformat='${Status}\n' "${i}"|grep "install ok installed"
if [ "$?" -eq "1" ]; then
@@ -43,7 +55,6 @@ else
rm -rf intel-cmt-cat >/dev/null
git clone https://github.com/01org/intel-cmt-cat.git
pushd intel-cmt-cat
- git checkout tags/v1.5 -b v1.5
make install PREFIX=/usr
popd
@@ -51,7 +62,59 @@ else
echo "Done."
fi
-which /opt/nsb_bin/collectd/collectd >/dev/null
+ls /usr/lib/libdpdk.so >/dev/null
+if [ $? -eq 0 ]
+then
+ echo "DPDK already installed. Done"
+else
+ pushd .
+
+ echo "Get dpdk and install..."
+ mkdir -p $INSTALL_NSB_BIN
+ rm -rf "$INSTALL_NSB_BIN"/dpdk >/dev/null
+ git clone http://dpdk.org/git/dpdk
+ pushd dpdk
+ mkdir -p /mnt/huge
+ mount -t hugetlbfs nodev /mnt/huge
+ sed -i 's/CONFIG_RTE_BUILD_SHARED_LIB=n/CONFIG_RTE_BUILD_SHARED_LIB=y/g' config/common_base
+ sed -i 's/CONFIG_RTE_EAL_PMD_PATH=""/CONFIG_RTE_EAL_PMD_PATH="\/usr\/lib\/dpdk-pmd\/"/g' config/common_base
+
+ echo "Build dpdk v16.04"
+ make config T=x86_64-native-linuxapp-gcc
+ make
+ sudo make install prefix=/usr
+ mkdir -p /usr/lib/dpdk-pmd
+ find /usr/lib -type f -name 'librte_pmd*' | while read path ; do ln -s $path /usr/lib/dpdk-pmd/`echo $path | grep -o 'librte_.*so'` ; done
+
+ echo "Disable ASLR."
+ echo 0 > /proc/sys/kernel/randomize_va_space
+ make install PREFIX=/usr
+ popd
+
+ popd
+ echo "Done."
+fi
+
+which $INSTALL_NSB_BIN/yajl > /dev/null
+if [ -f "/usr/local/lib/libyajl.so.2.1.1" ]
+then
+ echo "ovs stats libs already installed."
+else
+ echo "installing ovs stats libraries"
+ pushd .
+
+ cd $INSTALL_NSB_BIN
+ git clone https://github.com/lloyd/yajl.git
+ pushd yajl
+ ./configure
+ make
+ make install
+ popd
+
+ popd
+fi
+
+which $INSTALL_NSB_BIN/collectd/collectd >/dev/null
if [ $? -eq 0 ]
then
echo "Collectd already installed. Done"
@@ -62,9 +125,9 @@ else
git clone https://github.com/collectd/collectd.git
pushd collectd
git stash
- git checkout -b collectd 43a4db3b3209f497a0ba408aebf8aee385c6262d
+ git checkout -n nfvi 47c86ace348a1d7a5352a83d10935209f89aa4f5
./build.sh
- ./configure --with-libpqos=/usr/
+ ./configure --with-libpqos=/usr/ --with-libdpdk=/usr --with-libyajl=/usr/local --enable-debug --enable-dpdkstat --enable-virt --enable-ovs_stats
make install > /dev/null
popd
echo "Done."
diff --git a/yardstick/network_services/nfvi/resource.py b/yardstick/network_services/nfvi/resource.py
index 18b0d8952..ce09b6597 100644
--- a/yardstick/network_services/nfvi/resource.py
+++ b/yardstick/network_services/nfvi/resource.py
@@ -14,19 +14,28 @@
""" Resource collection definitions """
from __future__ import absolute_import
+from __future__ import print_function
+import tempfile
import logging
+import os
import os.path
import re
import multiprocessing
+from collections import Sequence
+
from oslo_config import cfg
from yardstick import ssh
from yardstick.network_services.nfvi.collectd import AmqpConsumer
from yardstick.network_services.utils import provision_tool
+LOG = logging.getLogger(__name__)
+
CONF = cfg.CONF
ZMQ_OVS_PORT = 5567
ZMQ_POLLING_TIME = 12000
+LIST_PLUGINS_ENABLED = ["amqp", "cpu", "cpufreq", "intel_rdt", "memory",
+ "hugepages", "dpdkstat", "virt", "ovs_stats"]
class ResourceProfile(object):
@@ -34,16 +43,17 @@ class ResourceProfile(object):
This profile adds a resource at the beginning of the test session
"""
- def __init__(self, vnfd, cores):
+ def __init__(self, mgmt, interfaces=None, cores=None):
self.enable = True
self.connection = None
- self.cores = cores
+ self.cores = cores if isinstance(cores, Sequence) else []
+ self._queue = multiprocessing.Queue()
+ self.amqp_client = None
+ self.interfaces = interfaces if isinstance(interfaces, Sequence) else []
- mgmt_interface = vnfd.get("mgmt-interface")
# why the host or ip?
- self.vnfip = mgmt_interface.get("host", mgmt_interface["ip"])
- self.connection = ssh.SSH.from_node(mgmt_interface,
- overrides={"ip": self.vnfip})
+ self.vnfip = mgmt.get("host", mgmt["ip"])
+ self.connection = ssh.SSH.from_node(mgmt, overrides={"ip": self.vnfip})
self.connection.wait()
@@ -52,81 +62,147 @@ class ResourceProfile(object):
err, pid, _ = self.connection.execute("pgrep -f %s" % process)
return [err == 0, pid]
- def run_collectd_amqp(self, queue):
+ def run_collectd_amqp(self):
""" run amqp consumer to collect the NFVi data """
- amqp = \
- AmqpConsumer('amqp://admin:admin@{}:5672/%2F'.format(self.vnfip),
- queue)
+ amqp_url = 'amqp://admin:admin@{}:5672/%2F'.format(self.vnfip)
+ amqp = AmqpConsumer(amqp_url, self._queue)
try:
amqp.run()
except (AttributeError, RuntimeError, KeyboardInterrupt):
amqp.stop()
@classmethod
- def get_cpu_data(cls, reskey, value):
+ def parse_simple_resource(cls, key, value):
+ return {'/'.join(key): value.split(":")[1]}
+
+ @classmethod
+ def get_cpu_data(cls, key_split, value):
""" Get cpu topology of the host """
pattern = r"-(\d+)"
- if "cpufreq" in reskey[1]:
- match = re.search(pattern, reskey[2], re.MULTILINE)
- metric = reskey[1]
+ if "cpufreq" in key_split[0]:
+ metric = key_split[0]
+ source = key_split[1]
else:
- match = re.search(pattern, reskey[1], re.MULTILINE)
- metric = reskey[2]
+ metric = key_split[1]
+ source = key_split[0]
+
+ match = re.search(pattern, source, re.MULTILINE)
+ if not match:
+ return "error", "Invalid", "", ""
+
+ time, value = value.split(":")
+ return str(match.group(1)), metric, value, time
+
+ @classmethod
+ def parse_hugepages(cls, key, value):
+ return cls.parse_simple_resource(key, value)
- time, val = re.split(":", value)
- if match:
- return [str(match.group(1)), metric, val, time]
+ @classmethod
+ def parse_dpdkstat(cls, key, value):
+ return cls.parse_simple_resource(key, value)
+
+ @classmethod
+ def parse_virt(cls, key, value):
+ return cls.parse_simple_resource(key, value)
- return ["error", "Invalid", ""]
+ @classmethod
+ def parse_ovs_stats(cls, key, value):
+ return cls.parse_simple_resource(key, value)
- def parse_collectd_result(self, metrics, listcores):
+ def parse_collectd_result(self, metrics, core_list):
""" convert collectd data into json"""
- res = {"cpu": {}, "memory": {}}
+ result = {
+ "cpu": {},
+ "memory": {},
+ "hugepages": {},
+ "dpdkstat": {},
+ "virt": {},
+ "ovs_stats": {},
+ }
testcase = ""
for key, value in metrics.items():
- reskey = key.rsplit("/")
- if "cpu" in reskey[1] or "intel_rdt" in reskey[1]:
- cpu_key, name, metric, testcase = \
- self.get_cpu_data(reskey, value)
- if cpu_key in listcores:
- res["cpu"].setdefault(cpu_key, {}).update({name: metric})
- elif "memory" in reskey[1]:
- val = re.split(":", value)[1]
- res["memory"].update({reskey[2]: val})
- res["timestamp"] = testcase
-
- return res
-
- def amqp_collect_nfvi_kpi(self, _queue=multiprocessing.Queue()):
+ key_split = key.split("/")
+ res_key_iter = (key for key in key_split if "nsb_stats" not in key)
+ res_key0 = next(res_key_iter)
+ res_key1 = next(res_key_iter)
+
+ if "cpu" in res_key0 or "intel_rdt" in res_key0:
+ cpu_key, name, metric, testcase = self.get_cpu_data(key_split, value)
+ if cpu_key in core_list:
+ result["cpu"].setdefault(cpu_key, {}).update({name: metric})
+
+ elif "memory" in res_key0:
+ result["memory"].update({res_key1: value.split(":")[0]})
+
+ elif "hugepages" in res_key0:
+ result["hugepages"].update(self.parse_hugepages(key, value))
+
+ elif "dpdkstat" in res_key0:
+ result["dpdkstat"].update(self.parse_dpdkstat(key, value))
+
+ elif "virt" in res_key1:
+ result["virt"].update(self.parse_virt(key, value))
+
+ elif "ovs_stats" in res_key0:
+ result["ovs_stats"].update(self.parse_ovs_stats(key, value))
+
+ result["timestamp"] = testcase
+
+ return result
+
+ def amqp_process_for_nfvi_kpi(self):
""" amqp collect and return nfvi kpis """
- try:
- metric = {}
- amqp_client = \
- multiprocessing.Process(target=self.run_collectd_amqp,
- args=(_queue,))
- amqp_client.start()
- amqp_client.join(7)
- amqp_client.terminate()
-
- while not _queue.empty():
- metric.update(_queue.get())
- except (AttributeError, RuntimeError, TypeError, ValueError):
- logging.debug("Failed to get NFVi stats...")
- msg = {}
- else:
- msg = self.parse_collectd_result(metric, self.cores)
+ if self.amqp_client is None:
+ self.amqp_client = \
+ multiprocessing.Process(target=self.run_collectd_amqp)
+ self.amqp_client.start()
+ def amqp_collect_nfvi_kpi(self):
+ """ amqp collect and return nfvi kpis """
+ metric = {}
+ while not self._queue.empty():
+ metric.update(self._queue.get())
+ msg = self.parse_collectd_result(metric, self.cores)
return msg
- @classmethod
- def _start_collectd(cls, connection, bin_path):
- connection.execute('pkill -9 collectd')
+ def _provide_config_file(self, bin_path, nfvi_cfg, kwargs):
+ with open(os.path.join(bin_path, nfvi_cfg), 'r') as cfg:
+ template = cfg.read()
+ cfg, cfg_content = tempfile.mkstemp()
+ with os.fdopen(cfg, "w+") as cfg:
+ cfg.write(template.format(**kwargs))
+ cfg_file = os.path.join(bin_path, nfvi_cfg)
+ self.connection.put(cfg_content, cfg_file)
+
+ def _prepare_collectd_conf(self, bin_path):
+ """ Prepare collectd conf """
+ loadplugin = "\n".join("LoadPlugin {0}".format(plugin)
+ for plugin in LIST_PLUGINS_ENABLED)
+
+ interfaces = "\n".join("PortName '{0[name]}'".format(interface)
+ for interface in self.interfaces)
+
+ kwargs = {
+ "interval": '25',
+ "loadplugin": loadplugin,
+ "dpdk_interface": interfaces,
+ }
+
+ self._provide_config_file(bin_path, 'collectd.conf', kwargs)
+
+ def _start_collectd(self, connection, bin_path):
+ LOG.debug("Starting collectd to collect NFVi stats")
+ # temp disable
+ return
+ connection.execute('sudo pkill -9 collectd')
collectd = os.path.join(bin_path, "collectd.sh")
provision_tool(connection, collectd)
- provision_tool(connection, os.path.join(bin_path, "collectd.conf"))
+ self._prepare_collectd_conf(bin_path)
# Reset amqp queue
+ LOG.debug("reset and setup amqp to collect data from collectd")
+ connection.execute("sudo rm -rf /var/lib/rabbitmq/mnesia/rabbit*")
connection.execute("sudo service rabbitmq-server start")
connection.execute("sudo rabbitmqctl stop_app")
connection.execute("sudo rabbitmqctl reset")
@@ -134,8 +210,15 @@ class ResourceProfile(object):
connection.execute("sudo service rabbitmq-server restart")
# Run collectd
- connection.execute(collectd)
- connection.execute(os.path.join(bin_path, "collectd", "collectd"))
+
+ http_proxy = os.environ.get('http_proxy', '')
+ https_proxy = os.environ.get('https_proxy', '')
+ connection.execute("sudo %s '%s' '%s'" %
+ (collectd, http_proxy, https_proxy))
+ LOG.debug("Start collectd service.....")
+ connection.execute(
+ "sudo %s" % os.path.join(bin_path, "collectd", "collectd"))
+ LOG.debug("Done")
def initiate_systemagent(self, bin_path):
""" Start system agent for NFVi collection on host """
@@ -145,16 +228,24 @@ class ResourceProfile(object):
def start(self):
""" start nfvi collection """
if self.enable:
- logging.debug("Start NVFi metric collection...")
+ LOG.debug("Start NVFi metric collection...")
def stop(self):
""" stop nfvi collection """
- if self.enable:
- agent = "collectd"
- logging.debug("Stop resource monitor...")
- status, pid = self.check_if_sa_running(agent)
- if status:
- self.connection.execute('kill -9 %s' % pid)
- self.connection.execute('pkill -9 %s' % agent)
- self.connection.execute('service rabbitmq-server stop')
- self.connection.execute("sudo rabbitmqctl stop_app")
+ if not self.enable:
+ return
+
+ agent = "collectd"
+ LOG.debug("Stop resource monitor...")
+
+ if self.amqp_client is not None:
+ self.amqp_client.terminate()
+
+ status, pid = self.check_if_sa_running(agent)
+ if status == 0:
+ return
+
+ self.connection.execute('sudo kill -9 %s' % pid)
+ self.connection.execute('sudo pkill -9 %s' % agent)
+ self.connection.execute('sudo service rabbitmq-server stop')
+ self.connection.execute("sudo rabbitmqctl stop_app")
diff --git a/yardstick/network_services/traffic_profile/http_ixload.py b/yardstick/network_services/traffic_profile/http_ixload.py
new file mode 100644
index 000000000..8a4f97f04
--- /dev/null
+++ b/yardstick/network_services/traffic_profile/http_ixload.py
@@ -0,0 +1,294 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+from __future__ import print_function
+
+import sys
+import os
+import logging
+
+# ixload uses its own py2. So importing jsonutils fails. So adding below
+# workaround to support call from yardstick
+try:
+ from oslo_serialization import jsonutils
+except ImportError:
+ import json as jsonutils
+
+from yardstick.common.utils import join_non_strings
+from yardstick.common.utils import ErrorClass
+
+try:
+ from IxLoad import IxLoad, StatCollectorUtils
+except ImportError:
+ IxLoad = ErrorClass
+ StatCollectorUtils = ErrorClass
+
+LOG = logging.getLogger(__name__)
+CSV_FILEPATH_NAME = 'IxL_statResults.csv'
+
+STATS_TO_GET = (
+ 'HTTP_Client.csv',
+ 'HTTP_Server.csv',
+ 'L2-3 Stats for Client Ports.csv',
+ 'L2-3 Stats for Server Ports.csv',
+ 'IxLoad Detailed Report.html',
+ 'IxLoad Detailed Report.pdf'
+)
+
+HTTP_CLIENT_STATS = [
+ ["HTTP Client", "TCP Connections Established", "kSum"],
+ ["HTTP Client", "TCP Connection Requests Failed", "kSum"],
+ ["HTTP Client", "HTTP Simulated Users", "kSum"],
+ ["HTTP Client", "HTTP Concurrent Connections", "kSum"],
+ ["HTTP Client", "HTTP Connections", "kSum"],
+ ["HTTP Client", "HTTP Transactions", "kSum"],
+ ["HTTP Client", "HTTP Connection Attempts", "kSum"]
+]
+
+HTTP_SERVER_STATS = [
+ ["HTTP Server", "TCP Connections Established", "kSum"],
+ ["HTTP Server", "TCP Connection Requests Failed", "kSum"]
+]
+
+
+INCOMING_STAT_RECORD_TEMPLATE = """
+=====================================
+INCOMING STAT RECORD >>> %s
+Len = %s
+%s
+%s
+=====================================
+"""
+
+INCOMING_STAT_INTERVAL_TEMPLATE = """
+=====================================
+Incoming stats: Time interval: %s
+Incoming stats: Time interval: %s
+=====================================
+"""
+
+
+class IXLOADHttpTest(object):
+
+ def __init__(self, test_input):
+ self.test_input = jsonutils.loads(test_input)
+ self.parse_run_test()
+ self.ix_load = None
+ self.stat_utils = None
+ self.remote_server = None
+ self.config_file = None
+ self.results_on_windows = None
+ self.result_dir = None
+ self.chassis = None
+ self.card = None
+ self.ports_to_reassign = None
+
+ @staticmethod
+ def format_ports_for_reassignment(ports):
+ formatted = [join_non_strings(';', p) for p in ports if len(p) == 3]
+ LOG.debug('for client ports:%s', os.linesep.join(formatted))
+ return formatted
+
+ def reassign_ports(self, test, repository, ports_to_reassign):
+ LOG.debug('ReassignPorts: %s %s', test, repository)
+
+ chassis_chain = repository.cget('chassisChain')
+ LOG.debug('chassischain: %s', chassis_chain)
+ client_ports = ports_to_reassign[0::2]
+ server_ports = ports_to_reassign[1::2]
+
+ client_ports = self.format_ports_for_reassignment(client_ports)
+ LOG.debug('Reassigning client ports: %s', client_ports)
+ server_ports = self.format_ports_for_reassignment(server_ports)
+ LOG.debug('Reassigning server ports: %s', server_ports)
+ ports_to_set = client_ports + server_ports
+
+ try:
+ LOG.debug('Reassigning ports: %s', ports_to_set)
+ test.setPorts(ports_to_set)
+ except Exception:
+ LOG.error('Error: Could not remap port assignment for: %s',
+ ports_to_set)
+ self.ix_load.delete(repository)
+ self.ix_load.disconnect()
+ raise
+
+ @staticmethod
+ def stat_collector(*args):
+ LOG.debug(INCOMING_STAT_RECORD_TEMPLATE, args, len(args), args[0], args[1])
+
+ @staticmethod
+ def IxL_StatCollectorCommand(*args):
+ stats = args[1][3]
+ timestamp = args[1][1]
+ LOG.debug(INCOMING_STAT_INTERVAL_TEMPLATE, timestamp, stats)
+
+ @staticmethod
+ def set_results_dir(test_controller, results_on_windows):
+ """
+ If the folder doesn't exists on the Windows Client PC,
+ IxLoad will automatically create it.
+ """
+ try:
+ test_controller.setResultDir(results_on_windows)
+ except Exception:
+ LOG.error('Error creating results dir on Win: %s',
+ results_on_windows)
+ raise
+
+ def load_config_file(self, config_file):
+ try:
+ LOG.debug(config_file)
+ repository = self.ix_load.new("ixRepository", name=config_file)
+ return repository
+ except Exception:
+ LOG.error('Error: IxLoad config file not found: %s', config_file)
+ raise
+
+ def start_http_test(self):
+ self.ix_load = IxLoad()
+
+ LOG.debug('--- ixLoad obj: %s', self.ix_load)
+ try:
+ self.ix_load.connect(self.remote_server)
+ except Exception:
+ raise
+
+ log_tag = "IxLoad-api"
+ log_name = "reprun"
+ logger = self.ix_load.new("ixLogger", log_tag, 1)
+ log_engine = logger.getEngine()
+ log_engine.setLevels(self.ix_load.ixLogger.kLevelDebug,
+ self.ix_load.ixLogger.kLevelInfo)
+ log_engine.setFile(log_name, 2, 256, 1)
+
+ # Initialize stat collection utilities
+ self.stat_utils = StatCollectorUtils()
+
+ test_controller = self.ix_load.new("ixTestController", outputDir=1)
+
+ repository = self.load_config_file(self.config_file)
+
+ # Get the first test on the testList
+ test_name = repository.testList[0].cget("name")
+ test = repository.testList.getItem(test_name)
+
+ self.set_results_dir(test_controller, self.results_on_windows)
+
+ test.config(statsRequired=1, enableResetPorts=1, csvInterval=2,
+ enableForceOwnership=True)
+
+ # ---- Remap ports ----
+ try:
+ self.reassign_ports(test, repository, self.ports_to_reassign)
+ except Exception:
+ LOG.exception("Exception occurred during reassign_ports")
+
+ # -----------------------------------------------------------------------
+ # Set up stat Collection
+ # -----------------------------------------------------------------------
+ test_server_handle = test_controller.getTestServerHandle()
+ self.stat_utils.Initialize(test_server_handle)
+
+ # Clear any stats that may have been registered previously
+ self.stat_utils.ClearStats()
+
+ # Define the stats we would like to collect
+ self.stat_utils.AddStat(caption="Watch_Stat_1",
+ statSourceType="HTTP Client",
+ statName="TCP Connections Established",
+ aggregationType="kSum",
+ filterList={})
+
+ self.stat_utils.AddStat(caption="Watch_Stat_2",
+ statSourceType="HTTP Client",
+ statName="TCP Connection Requests Failed",
+ aggregationType="kSum",
+ filterList={})
+
+ self.stat_utils.AddStat(caption="Watch_Stat_3",
+ statSourceType="HTTP Server",
+ statName="TCP Connections Established",
+ aggregationType="kSum",
+ filterList={})
+
+ self.stat_utils.AddStat(caption="Watch_Stat_4",
+ statSourceType="HTTP Server",
+ statName="TCP Connection Requests Failed",
+ aggregationType="kSum",
+ filterList={})
+
+ self.stat_utils.StartCollector(self.IxL_StatCollectorCommand)
+
+ test_controller.run(test)
+ self.ix_load.waitForTestFinish()
+
+ test_controller.releaseConfigWaitFinish()
+
+ # Stop the collector (running in the tcl event loop)
+ self.stat_utils.StopCollector()
+
+ # Cleanup
+ test_controller.generateReport(detailedReport=1, format="PDF;HTML")
+ test_controller.releaseConfigWaitFinish()
+
+ self.ix_load.delete(test)
+ self.ix_load.delete(test_controller)
+ self.ix_load.delete(logger)
+ self.ix_load.delete(log_engine)
+
+ LOG.debug('Retrieving CSV stats from Windows Client PC ...')
+ for stat_file in STATS_TO_GET:
+ enhanced_stat_file = stat_file.replace('-', '')
+ enhanced_stat_file = enhanced_stat_file.replace(' ', '_')
+ enhanced_stat_file = enhanced_stat_file.replace('__', '_')
+
+ LOG.debug('Getting csv stat file: %s', stat_file)
+ src_file = os.path.join(self.results_on_windows, stat_file)
+ dst_file = os.path.join(self.result_dir, '_'.join(['ixLoad', enhanced_stat_file]))
+ self.ix_load.retrieveFileCopy(src_file, dst_file)
+
+ self.ix_load.disconnect()
+
+ def parse_run_test(self):
+ self.remote_server = self.test_input["remote_server"]
+ LOG.debug("remote tcl server: %s", self.remote_server)
+
+ self.config_file = self.test_input["ixload_cfg"]
+ LOG.debug("ixload config: %s", self.remote_server)
+
+ self.results_on_windows = 'C:/Results'
+ self.result_dir = self.test_input["result_dir"]
+ self.chassis = self.test_input["ixia_chassis"]
+ LOG.debug("remote ixia chassis: %s", self.chassis)
+
+ self.card = self.test_input["IXIA"]["card"]
+ self.ports_to_reassign = [
+ [self.chassis, self.card, port] for port in
+ self.test_input["IXIA"]["ports"]
+ ]
+
+ LOG.debug("Ports to be reassigned: %s", self.ports_to_reassign)
+
+
+def main(args):
+ # Get the args from cmdline and parse and run the test
+ test_input = "".join(args[1:])
+ if test_input:
+ ixload_obj = IXLOADHttpTest(test_input)
+ ixload_obj.start_http_test()
+
+if __name__ == '__main__':
+ main(sys.argv)
diff --git a/yardstick/network_services/traffic_profile/ixia_rfc2544.py b/yardstick/network_services/traffic_profile/ixia_rfc2544.py
new file mode 100644
index 000000000..5ba00180b
--- /dev/null
+++ b/yardstick/network_services/traffic_profile/ixia_rfc2544.py
@@ -0,0 +1,155 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+import logging
+import json
+
+from yardstick.network_services.traffic_profile.traffic_profile import \
+ TrexProfile
+
+LOG = logging.getLogger(__name__)
+
+
+class IXIARFC2544Profile(TrexProfile):
+ def _get_ixia_traffic_profile(self, profile_data, mac={},
+ xfile=None, static_traffic={}):
+ result = {}
+ if xfile:
+ with open(xfile, 'r') as stream:
+ try:
+ static_traffic = json.load(stream)
+ except Exception as exc:
+ LOG.debug(exc)
+
+ for traffickey, trafficvalue in static_traffic.items():
+ traffic = static_traffic[traffickey]
+ # outer_l2
+ index = 0
+ for key, value in profile_data[traffickey].items():
+ framesize = value['outer_l2']['framesize']
+ traffic['outer_l2']['framesize'] = framesize
+ traffic['framesPerSecond'] = True
+ traffic['bidir'] = False
+ traffic['outer_l2']['srcmac'] = \
+ mac["src_mac_{}".format(traffic['id'])]
+ traffic['outer_l2']['dstmac'] = \
+ mac["dst_mac_{}".format(traffic['id'])]
+ # outer_l3
+ if "outer_l3v6" in list(value.keys()):
+ traffic['outer_l3'] = value['outer_l3v6']
+ srcip4 = value['outer_l3v6']['srcip6']
+ traffic['outer_l3']['srcip4'] = srcip4.split("-")[0]
+ dstip4 = value['outer_l3v6']['dstip6']
+ traffic['outer_l3']['dstip4'] = dstip4.split("-")[0]
+ else:
+ traffic['outer_l3'] = value['outer_l3v4']
+ srcip4 = value['outer_l3v4']['srcip4']
+ traffic['outer_l3']['srcip4'] = srcip4.split("-")[0]
+ dstip4 = value['outer_l3v4']['dstip4']
+ traffic['outer_l3']['dstip4'] = dstip4.split("-")[0]
+
+ traffic['outer_l3']['type'] = key
+ # outer_l4
+ traffic['outer_l4'] = value['outer_l4']
+ index = index + 1
+ result.update({traffickey: traffic})
+
+ return result
+
+ def _ixia_traffic_generate(self, traffic_generator, traffic, ixia_obj):
+ for key, value in traffic.items():
+ if "public" in key or "private" in key:
+ traffic[key]["iload"] = str(self.rate)
+ ixia_obj.ix_update_frame(traffic)
+ ixia_obj.ix_update_ether(traffic)
+ # ixia_obj.ix_update_ipv4(traffic)
+ ixia_obj.ix_start_traffic()
+ self.tmp_drop = 0
+ self.tmp_throughput = 0
+
+ def execute(self, traffic_generator, ixia_obj, mac={}, xfile=None):
+ if self.first_run:
+ self.full_profile = {}
+ self.pg_id = 0
+ self.profile = 'private_1'
+ for key, value in self.params.items():
+ if "private" in key or "public" in key:
+ self.profile_data = self.params[key]
+ self.get_streams(self.profile_data)
+ self.full_profile.update({key: self.profile_data})
+ traffic = \
+ self._get_ixia_traffic_profile(self.full_profile, mac, xfile)
+ self.max_rate = self.rate
+ self.min_rate = 0
+ self.get_multiplier()
+ self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj)
+
+ def get_multiplier(self):
+ self.rate = round((self.max_rate + self.min_rate) / 2.0, 2)
+ multiplier = round(self.rate / self.pps, 2)
+ return str(multiplier)
+
+ def start_ixia_latency(self, traffic_generator, ixia_obj,
+ mac={}, xfile=None):
+ traffic = self._get_ixia_traffic_profile(self.full_profile, mac)
+ self._ixia_traffic_generate(traffic_generator, traffic,
+ ixia_obj, xfile)
+
+ def get_drop_percentage(self, traffic_generator, samples, tol_min,
+ tolerance, ixia_obj, mac={}, xfile=None):
+ status = 'Running'
+ drop_percent = 100
+ in_packets = sum([samples[iface]['in_packets'] for iface in samples])
+ out_packets = sum([samples[iface]['out_packets'] for iface in samples])
+ rx_throughput = \
+ sum([samples[iface]['RxThroughput'] for iface in samples])
+ tx_throughput = \
+ sum([samples[iface]['TxThroughput'] for iface in samples])
+ packet_drop = abs(out_packets - in_packets)
+ try:
+ drop_percent = round((packet_drop / float(out_packets)) * 100, 2)
+ except ZeroDivisionError:
+ LOG.info('No traffic is flowing')
+ samples['TxThroughput'] = round(tx_throughput / 1.0, 2)
+ samples['RxThroughput'] = round(rx_throughput / 1.0, 2)
+ samples['CurrentDropPercentage'] = drop_percent
+ samples['Throughput'] = self.tmp_throughput
+ samples['DropPercentage'] = self.tmp_drop
+ if drop_percent > tolerance and self.tmp_throughput == 0:
+ samples['Throughput'] = round(rx_throughput / 1.0, 2)
+ samples['DropPercentage'] = drop_percent
+ if self.first_run:
+ max_supported_rate = out_packets / 30.0
+ self.rate = max_supported_rate
+ self.first_run = False
+ if drop_percent <= tolerance:
+ status = 'Completed'
+ if drop_percent > tolerance:
+ self.max_rate = self.rate
+ elif drop_percent < tol_min:
+ self.min_rate = self.rate
+ if drop_percent >= self.tmp_drop:
+ self.tmp_drop = drop_percent
+ self.tmp_throughput = round((rx_throughput / 1.0), 2)
+ samples['Throughput'] = round(rx_throughput / 1.0, 2)
+ samples['DropPercentage'] = drop_percent
+ else:
+ samples['Throughput'] = round(rx_throughput / 1.0, 2)
+ samples['DropPercentage'] = drop_percent
+ return status, samples
+ self.get_multiplier()
+ traffic = self._get_ixia_traffic_profile(self.full_profile, mac, xfile)
+ self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj)
+ return status, samples
diff --git a/yardstick/network_services/vnf_generic/vnf/acl_vnf.py b/yardstick/network_services/vnf_generic/vnf/acl_vnf.py
new file mode 100644
index 000000000..5f3c8a0cd
--- /dev/null
+++ b/yardstick/network_services/vnf_generic/vnf/acl_vnf.py
@@ -0,0 +1,72 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+from __future__ import print_function
+import logging
+
+from yardstick.benchmark.scenarios.networking.vnf_generic import find_relative_file
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF, DpdkVnfSetupEnvHelper
+from yardstick.network_services.yang_model import YangModel
+
+LOG = logging.getLogger(__name__)
+
+# ACL should work the same on all systems, we can provide the binary
+ACL_PIPELINE_COMMAND = \
+ 'sudo {tool_path} -p {ports_len_hex} -f {cfg_file} -s {script}'
+
+ACL_COLLECT_KPI = r"""\
+ACL TOTAL:[^p]+pkts_processed"?:\s(\d+),[^p]+pkts_drop"?:\s(\d+),[^p]+pkts_received"?:\s(\d+),"""
+
+
+class AclApproxSetupEnvSetupEnvHelper(DpdkVnfSetupEnvHelper):
+
+ APP_NAME = "vACL"
+ CFG_CONFIG = "/tmp/acl_config"
+ CFG_SCRIPT = "/tmp/acl_script"
+ PIPELINE_COMMAND = ACL_PIPELINE_COMMAND
+ HW_DEFAULT_CORE = 2
+ SW_DEFAULT_CORE = 5
+ DEFAULT_CONFIG_TPL_CFG = "acl.cfg"
+ VNF_TYPE = "ACL"
+
+
+class AclApproxVnf(SampleVNF):
+
+ APP_NAME = "vACL"
+ APP_WORD = 'acl'
+ COLLECT_KPI = ACL_COLLECT_KPI
+
+ COLLECT_MAP = {
+ 'packets_in': 3,
+ 'packets_fwd': 1,
+ 'packets_dropped': 2,
+ }
+
+ def __init__(self, name, vnfd, setup_env_helper_type=None, resource_helper_type=None):
+ if setup_env_helper_type is None:
+ setup_env_helper_type = AclApproxSetupEnvSetupEnvHelper
+
+ super(AclApproxVnf, self).__init__(name, vnfd, setup_env_helper_type, resource_helper_type)
+ self.acl_rules = None
+
+ def scale(self, flavor=""):
+ raise NotImplementedError
+
+ def _start_vnf(self):
+ yang_model_path = find_relative_file(self.scenario_helper.options['rules'],
+ self.scenario_helper.task_path)
+ yang_model = YangModel(yang_model_path)
+ self.acl_rules = yang_model.get_rules()
+ super(AclApproxVnf, self)._start_vnf()
diff --git a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
index 89c086d97..e08f51784 100644
--- a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
+++ b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
@@ -331,7 +331,8 @@ class DpdkVnfSetupEnvHelper(SetupEnvHelper):
self.socket = 1
cores = self._validate_cpu_cfg()
- return ResourceProfile(self.vnfd_helper, cores)
+ return ResourceProfile(self.vnfd_helper.mgmt_interface,
+ interfaces=self.vnfd_helper.interfaces, cores=cores)
def _detect_drivers(self):
interfaces = self.vnfd_helper.interfaces
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_ixload.py b/yardstick/network_services/vnf_generic/vnf/tg_ixload.py
new file mode 100644
index 000000000..c15f7b954
--- /dev/null
+++ b/yardstick/network_services/vnf_generic/vnf/tg_ixload.py
@@ -0,0 +1,176 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+import csv
+import glob
+import logging
+import os
+import shutil
+
+from collections import OrderedDict
+from subprocess import call
+
+import six
+
+from yardstick.common.utils import makedirs
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
+
+LOG = logging.getLogger(__name__)
+
+VNF_PATH = os.path.dirname(os.path.realpath(__file__))
+
+MOUNT_CMD = """\
+mount.cifs //{0[ip]}/Results {1.RESULTS_MOUNT} \
+-o username={0[user]},password={0[password]}\
+"""
+
+IXLOAD_CONFIG_TEMPLATE = '''\
+{
+ "ixia_chassis": "%s",
+ "IXIA": {
+ "ports": %s,
+ "card": %s
+ },
+ "remote_server": "%s",
+ "result_dir": "%s",
+ "ixload_cfg": '"C:/Results/%s"
+}'''
+
+IXLOAD_CMD = "{ixloadpy} {http_ixload} {args}"
+
+
+class ResourceDataHelper(list):
+
+ def get_aggregates(self):
+ return {
+ "min": min(self),
+ "max": max(self),
+ "avg": sum(self) / len(self),
+ }
+
+
+class IxLoadResourceHelper(ClientResourceHelper):
+
+ RESULTS_MOUNT = "/mnt/Results"
+
+ KPI_LIST = OrderedDict((
+ ('http_throughput', 'HTTP Total Throughput (Kbps)'),
+ ('simulated_users', 'HTTP Simulated Users'),
+ ('concurrent_connections', 'HTTP Concurrent Connections'),
+ ('connection_rate', 'HTTP Connection Rate'),
+ ('transaction_rate', 'HTTP Transaction Rate'),
+ ))
+
+ def __init__(self, setup_helper):
+ super(IxLoadResourceHelper, self).__init__(setup_helper)
+ self.result = OrderedDict((key, ResourceDataHelper()) for key in self.KPI_LIST)
+ self.resource_file_name = ''
+
+ def parse_csv_read(self, reader):
+ for row in reader:
+ try:
+ new_data = {key_left: int(row[key_right])
+ for key_left, key_right in self.KPI_LIST.items()}
+ except (TypeError, ValueError):
+ continue
+ else:
+ for key, value in new_data.items():
+ self.result[key].append(value)
+
+ def setup(self):
+ # TODO: fixupt scenario_helper to hanlde ixia
+ self.resource_file_name = str(self.scenario_helper.scenario_cfg['ixia_profile'])
+ makedirs(self.RESULTS_MOUNT)
+ cmd = MOUNT_CMD.format(self.vnfd_helper.mgmt_interface, self)
+ LOG.debug(cmd)
+
+ if not os.path.ismount(self.RESULTS_MOUNT):
+ call(cmd, shell=True)
+
+ shutil.rmtree(self.RESULTS_MOUNT, ignore_errors=True)
+ makedirs(self.RESULTS_MOUNT)
+ shutil.copy(self.resource_file_name, self.RESULTS_MOUNT)
+
+ def make_aggregates(self):
+ return {key_right: self.result[key_left].get_aggregates()
+ for key_left, key_right in self.KPI_LIST.items()}
+
+ def log(self):
+ for key in self.KPI_LIST:
+ LOG.debug(self.result[key])
+
+
+class IxLoadTrafficGen(SampleVNFTrafficGen):
+
+ def __init__(self, name, vnfd, setup_env_helper_type=None, resource_helper_type=None):
+ if resource_helper_type is None:
+ resource_helper_type = IxLoadResourceHelper
+
+ super(IxLoadTrafficGen, self).__init__(name, vnfd, setup_env_helper_type,
+ resource_helper_type)
+ self._result = {}
+ self.done = False
+ self.data = None
+
+ def run_traffic(self, traffic_profile):
+ ports = []
+ card = None
+ for interface in self.vnfd_helper.interfaces:
+ vpci_list = interface['virtual-interface']["vpci"].split(":")
+ card = vpci_list[0]
+ ports.append(vpci_list[1])
+
+ for csv_file in glob.iglob(self.ssh_helper.join_bin_path('*.csv')):
+ os.unlink(csv_file)
+
+ ixia_config = self.vnfd_helper.mgmt_interface["tg-config"]
+ ixload_config = IXLOAD_CONFIG_TEMPLATE % (
+ ixia_config["ixchassis"], ports, card,
+ self.vnfd_helper.mgmt_interface["ip"], self.ssh_helper.bin_path,
+ os.path.basename(self.resource_helper.resource_file_name))
+
+ http_ixload_path = os.path.join(VNF_PATH, "../../traffic_profile")
+ cmd = IXLOAD_CMD.format(
+ ixloadpy=os.path.join(ixia_config["py_bin_path"], "ixloadpython"),
+ http_ixload=os.path.join(http_ixload_path, "http_ixload.py"),
+ args="'%s'" % ixload_config)
+
+ LOG.debug(cmd)
+ call(cmd, shell=True)
+
+ with open(self.ssh_helper.join_bin_path("ixLoad_HTTP_Client.csv")) as csv_file:
+ lines = csv_file.readlines()[10:]
+
+ with open(self.ssh_helper.join_bin_path("http_result.csv"), 'wb+') as result_file:
+ result_file.writelines(six.text_type(lines[:-1]))
+ result_file.flush()
+ result_file.seek(0)
+ reader = csv.DictReader(result_file)
+ self.resource_helper.parse_csv_read(reader)
+
+ self.resource_helper.log()
+ self.data = self.resource_helper.make_aggregates()
+
+ def listen_traffic(self, traffic_profile):
+ pass
+
+ def instantiate(self, scenario_cfg, context_cfg):
+ super(IxLoadTrafficGen, self).instantiate(scenario_cfg, context_cfg)
+ self.done = False
+
+ def terminate(self):
+ call(["pkill", "-9", "http_ixload.py"])
+ super(IxLoadTrafficGen, self).terminate()
diff --git a/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
new file mode 100644
index 000000000..07bbdae95
--- /dev/null
+++ b/yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py
@@ -0,0 +1,165 @@
+# Copyright (c) 2016-2017 Intel Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import
+import time
+import os
+import logging
+import sys
+
+from yardstick.common.utils import ErrorClass
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
+from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper
+
+try:
+ from IxNet import IxNextgen
+except ImportError:
+ IxNextgen = ErrorClass
+
+LOG = logging.getLogger(__name__)
+
+WAIT_AFTER_CFG_LOAD = 10
+WAIT_FOR_TRAFFIC = 30
+IXIA_LIB = os.path.dirname(os.path.realpath(__file__))
+IXNET_LIB = os.path.join(IXIA_LIB, "../../libs/ixia_libs/IxNet")
+sys.path.append(IXNET_LIB)
+
+
+class IxiaRfc2544Helper(Rfc2544ResourceHelper):
+
+ pass
+
+
+class IxiaResourceHelper(ClientResourceHelper):
+
+ def __init__(self, setup_helper, rfc_helper_type=None):
+ super(IxiaResourceHelper, self).__init__(setup_helper)
+ self.scenario_helper = setup_helper.scenario_helper
+
+ self.client = IxNextgen()
+
+ if rfc_helper_type is None:
+ rfc_helper_type = IxiaRfc2544Helper
+
+ self.rfc_helper = rfc_helper_type(self.scenario_helper)
+ self.tg_port_pairs = []
+ self.priv_ports = None
+ self.pub_ports = None
+
+ def _connect(self, client=None):
+ self.client.connect(self.vnfd_helper)
+
+ def _build_ports(self):
+ # self.generate_port_pairs(self.topology)
+ self.priv_ports = [int(x[0][-1]) for x in self.tg_port_pairs]
+ self.pub_ports = [int(x[1][-1]) for x in self.tg_port_pairs]
+ self.my_ports = list(set(self.priv_ports).union(set(self.pub_ports)))
+
+ def get_stats(self, *args, **kwargs):
+ return self.client.ix_get_statistics()[1]
+
+ def stop_collect(self):
+ self._terminated.value = 0
+ if self.client:
+ self.client.ix_stop_traffic()
+
+ def generate_samples(self, key=None, default=None):
+ last_result = self.get_stats()
+
+ samples = {}
+ for vpci_idx, interface in enumerate(self.vnfd_helper.interfaces):
+ name = "xe{0}".format(vpci_idx)
+ samples[name] = {
+ "rx_throughput_kps": float(last_result["Rx_Rate_Kbps"][vpci_idx]),
+ "tx_throughput_kps": float(last_result["Tx_Rate_Kbps"][vpci_idx]),
+ "rx_throughput_mbps": float(last_result["Rx_Rate_Mbps"][vpci_idx]),
+ "tx_throughput_mbps": float(last_result["Tx_Rate_Mbps"][vpci_idx]),
+ "in_packets": int(last_result["Valid_Frames_Rx"][vpci_idx]),
+ "out_packets": int(last_result["Frames_Tx"][vpci_idx]),
+ "RxThroughput": int(last_result["Valid_Frames_Rx"][vpci_idx]) / 30,
+ "TxThroughput": int(last_result["Frames_Tx"][vpci_idx]) / 30,
+ }
+
+ return samples
+
+ def run_traffic(self, traffic_profile):
+ min_tol = self.rfc_helper.tolerance_low
+ max_tol = self.rfc_helper.tolerance_high
+
+ self._build_ports()
+ self._connect()
+
+ # we don't know client_file_name until runtime as instantiate
+ client_file_name = self.scenario_helper.scenario_cfg['ixia_profile']
+ self.client.ix_load_config(client_file_name)
+ time.sleep(WAIT_AFTER_CFG_LOAD)
+
+ self.client.ix_assign_ports()
+
+ mac = {}
+ for index, interface in enumerate(self.vnfd_helper.interfaces):
+ virt_intf = interface["virtual-interface"]
+ mac.update({
+ "src_mac_{}".format(index): virt_intf["local_mac"],
+ "dst_mac_{}".format(index): virt_intf["dst_mac"],
+ })
+
+ samples = {}
+ ixia_file = os.path.join(os.getcwd(), "ixia_traffic.cfg")
+ # Generate ixia traffic config...
+ while not self._terminated.value:
+ traffic_profile.execute(self, self.client, mac, ixia_file)
+ self.client_started.value = 1
+ time.sleep(WAIT_FOR_TRAFFIC)
+ self.client.ix_stop_traffic()
+ samples = self.generate_samples()
+ self._queue.put(samples)
+ status, samples = traffic_profile.get_drop_percentage(self, samples, min_tol,
+ max_tol, self.client, mac,
+ ixia_file)
+
+ current = samples['CurrentDropPercentage']
+ if min_tol <= current <= max_tol or status == 'Completed':
+ self._terminated.value = 1
+
+ self.client.ix_stop_traffic()
+ self._queue.put(samples)
+
+
+class IxiaTrafficGen(SampleVNFTrafficGen):
+
+ def __init__(self, name, vnfd, setup_env_helper_type=None, resource_helper_type=None):
+ if resource_helper_type is None:
+ resource_helper_type = IxiaResourceHelper
+
+ super(IxiaTrafficGen, self).__init__(name, vnfd, setup_env_helper_type,
+ resource_helper_type)
+ self._ixia_traffic_gen = None
+ self.ixia_file_name = ''
+ self.tg_port_pairs = []
+ self.vnf_port_pairs = []
+
+ def _check_status(self):
+ pass
+
+ def scale(self, flavor=""):
+ pass
+
+ def listen_traffic(self, traffic_profile):
+ pass
+
+ def terminate(self):
+ self.resource_helper.stop_collect()
+ super(IxiaTrafficGen, self).terminate()