diff options
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"><rpf> <Ixia.Aptixia.StackManager.SMSession type="Ixia.Aptixia.StackManager.SMSession" objectid="a1e46af9-15aa-4923-8410-c81d0cdf0836" version="6.70.420"> <doWaitLinkUp type="Bool">0</doWaitLinkUp> <doGratArp type="Bool">0</doGratArp> <subscribeToGratArpNotifications type="Bool">0</subscribeToGratArpNotifications> <doInterfaceCheck type="Bool">0</doInterfaceCheck> <rebootPortsBeforeConfigure type="Bool">0</rebootPortsBeforeConfigure> <testDuration type="Int">10000</testDuration> <checkLinkState type="Bool">0</checkLinkState> <portGroupList type="ListNode"> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="865be042-32d5-426a-9e75-0908c943801f" version="6.70.420"> <name type="String">client network</name> <category type="String" /> <stack type="Ixia.Aptixia.StackManager.L1EthernetPlugin" objectid="1dcd6e1b-17cd-45a1-875a-cbea40d3468c" version="6.70.420"> <autoNegotiate type="Bool">1</autoNegotiate> <speed type="String">k100FD</speed> <advertise10Half type="Bool">1</advertise10Half> <advertise10Full type="Bool">1</advertise10Full> <advertise100Half type="Bool">1</advertise100Half> <advertise100Full type="Bool">1</advertise100Full> <advertise1000Full type="Bool">1</advertise1000Full> <cardDualPhy type="Ixia.Aptixia.StackManager.DualPhyPlugin" objectid="b458c333-b4d4-48ef-bd38-3b456f72f8c8" version="6.70.420"> <medium type="String">auto</medium> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </cardDualPhy> <cardElm type="Ixia.Aptixia.StackManager.EthernetELMPlugin" objectid="28c0383a-76a7-4750-8162-2ad946ddac97" version="6.70.420"> <negotiateMasterSlave type="Bool">1</negotiateMasterSlave> <negotiationType type="String">master</negotiationType> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </cardElm> <enableFlowControl type="Bool">0</enableFlowControl> <directedAddress type="String">01:80:C2:00:00:01</directedAddress> <dataCenter type="Ixia.Aptixia.StackManager.DataCenterSettings" objectid="b9a0be2e-3880-4100-9e29-9b474f9301f4" version="6.70.420"> <dcSupported type="Bool">1</dcSupported> <dcEnabled type="Bool">0</dcEnabled> <dcFlowControl type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType">0</dcFlowControl> <dcMode type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode">2</dcMode> <dcPfcMapping type="IntList" /> <dcPfcPauseEnable type="Bool">0</dcPfcPauseEnable> <dcPfcPauseDelay type="Int">1</dcPfcPauseDelay> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </dataCenter> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.L2EthernetPlugin type="Ixia.Aptixia.StackManager.L2EthernetPlugin" objectid="e0232591-010e-492c-8a28-75e436f4adb2" version="6.70.420"> <macRangeList type="ListNode"> <Ixia.Aptixia.StackManager.MacRange type="Ixia.Aptixia.StackManager.MacRange" objectid="3011c8a8-a9fd-4b76-a27d-91948113ed4f" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">MAC-R1</name> <mac type="String">00:98:10:64:14:00</mac> <incrementBy type="String">00:00:00:00:00:01</incrementBy> <mtu type="Int">1500</mtu> <count type="Int">1</count> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="adb27552-7165-46a3-bc9e-04914adf40ac" version="6.70.420"> <name type="String">VLAN-R1</name> <enabled type="Bool">0</enabled> <firstId type="Int">1</firstId> <incrementStep type="Int">100</incrementStep> <increment type="Int">1</increment> <uniqueCount type="Int">4094</uniqueCount> <priority type="Int">0</priority> <tpid type="String">0x8100</tpid> <innerEnable type="Bool">0</innerEnable> <innerFirstId type="Int">1</innerFirstId> <innerIncrementStep type="Int">1</innerIncrementStep> <innerIncrement type="Int">1</innerIncrement> <innerUniqueCount type="Int">4094</innerUniqueCount> <innerPriority type="Int">0</innerPriority> <idIncrMode type="Int">1</idIncrMode> <innerTpid type="String">0x8100</innerTpid> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </vlanRange> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacRange> </macRangeList> <vlanRangeList type="ListNode"> <Ixia.Aptixia.StackManager.VlanIdRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="adb27552-7165-46a3-bc9e-04914adf40ac" version="6.70.420" /> </vlanRangeList> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Plugin type="Ixia.Aptixia.StackManager.IpV4V6Plugin" objectid="a916ae0f-0731-405d-ad19-eaade6c515f1" version="6.70.420"> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="a3559674-8d95-4020-90b3-b42eacaef105" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">IP-R1</name> <ipType type="String">IPv4</ipType> <ipAddress type="String">152.16.100.20</ipAddress> <prefix type="Int">24</prefix> <incrementBy type="String">0.0.0.1</incrementBy> <count type="Int">1</count> <autoCountEnabled type="Bool">0</autoCountEnabled> <gatewayAddress type="String">152.16.100.10</gatewayAddress> <gatewayIncrement type="String">0.0.0.0</gatewayIncrement> <gatewayIncrementMode type="String">perSubnet</gatewayIncrementMode> <enableGatewayArp type="Bool">0</enableGatewayArp> <generateStatistics type="Bool">0</generateStatistics> <mss type="Int">1460</mss> <randomizeAddress type="Bool">0</randomizeAddress> <randomizeSeed type="Int">2596329041</randomizeSeed> <autoMacGeneration type="Bool">1</autoMacGeneration> <macRange type="Ixia.Aptixia.StackManager.MacRange" objectid="3011c8a8-a9fd-4b76-a27d-91948113ed4f" version="6.70.420" /> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="adb27552-7165-46a3-bc9e-04914adf40ac" version="6.70.420" /> <atmRange type="Ixia.Aptixia.StackManager.AtmRange" objectid="00000000-0000-0000-0000-000000000000" /> <pvcRange type="Ixia.Aptixia.StackManager.PvcRange" objectid="00000000-0000-0000-0000-000000000000" /> <autoIpTypeEnabled type="Bool">0</autoIpTypeEnabled> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Range> </rangeList> <rangeGroups type="ListNode"> <Ixia.Aptixia.StackManager.RangeGroup type="Ixia.Aptixia.StackManager.RangeGroup" objectid="aa33a76b-9c7f-48d9-a537-8d6eeec03662" version="6.70.420"> <name type="String">DistGroup1</name> <distribType type="Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType">0</distribType> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="a3559674-8d95-4020-90b3-b42eacaef105" version="6.70.420" /> </rangeList> </Ixia.Aptixia.StackManager.RangeGroup> </rangeGroups> <childrenList type="ListNode" /> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">IP-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Plugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">MAC/VLAN-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.L2EthernetPlugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">Ethernet-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </stack> <globalPluginList type="ListNode"> <Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type="Ixia.Aptixia.StackManager.IxLoadSettingsPlugin" objectid="9c6c8594-548e-4ea5-a478-0bfb6252c1ce" version="1.0.0"> <teardownInterfaceWithUser type="Bool">0</teardownInterfaceWithUser> <interfaceBehavior type="Int">0</interfaceBehavior> <name type="String">Settings-2</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSettingsPlugin> <Ixia.Aptixia.StackManager.DnsPlugin type="Ixia.Aptixia.StackManager.DnsPlugin" objectid="693c7b7b-327b-4d59-b187-57d7600308e3" version="6.70.420"> <domain type="String" /> <timeout type="Int">30000</timeout> <nameServerList type="ListNode" /> <searchList type="ListNode" /> <hostList type="ListNode" /> <name type="String">DNS-2</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.DnsPlugin> <Ixia.Aptixia.StackManager.FilterPlugin type="Ixia.Aptixia.StackManager.FilterPlugin" objectid="0f6ebdb4-7909-447a-b80a-e132dae33a9b" version="6.70.420"> <auto type="Bool">1</auto> <all type="Bool">0</all> <pppoecontrol type="Bool">0</pppoecontrol> <pppoenetwork type="Bool">0</pppoenetwork> <isis type="Bool">0</isis> <ip type="String" /> <tcp type="String" /> <udp type="String" /> <mac type="String" /> <icmp type="String" /> <name type="String">Filter-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.FilterPlugin> <Ixia.Aptixia.StackManager.TCPPlugin type="Ixia.Aptixia.StackManager.TCPPlugin" objectid="7a893f25-0ac6-41c7-ab5a-511c2068582a" version="6.70.420"> <bestPerfSettings type="Bool">0</bestPerfSettings> <accept_ra_all type="Bool">0</accept_ra_all> <tcp_abort_on_overflow type="Bool">0</tcp_abort_on_overflow> <tcp_adv_win_scale type="Int">2</tcp_adv_win_scale> <tcp_app_win type="Int">31</tcp_app_win> <tcp_bic type="Int">0</tcp_bic> <tcp_bic_fast_convergence type="Int">1</tcp_bic_fast_convergence> <tcp_bic_low_window type="Int">14</tcp_bic_low_window> <tcp_dsack type="Bool">1</tcp_dsack> <tcp_ecn type="Bool">0</tcp_ecn> <tcp_fack type="Bool">1</tcp_fack> <tcp_fin_timeout type="Int">60</tcp_fin_timeout> <tcp_frto type="Int">0</tcp_frto> <tcp_keepalive_intvl type="Int">7200</tcp_keepalive_intvl> <tcp_keepalive_probes type="Int">75</tcp_keepalive_probes> <tcp_keepalive_time type="Int">9</tcp_keepalive_time> <tcp_low_latency type="Int">0</tcp_low_latency> <tcp_max_orphans type="Int">8192</tcp_max_orphans> <tcp_max_syn_backlog type="Int">1024</tcp_max_syn_backlog> <tcp_max_tw_buckets type="Int">180000</tcp_max_tw_buckets> <tcp_mem_low type="Int">24576</tcp_mem_low> <tcp_mem_pressure type="Int">32768</tcp_mem_pressure> <tcp_mem_high type="Int">49152</tcp_mem_high> <tcp_moderate_rcvbuf type="Int">0</tcp_moderate_rcvbuf> <tcp_no_metrics_save type="Bool">0</tcp_no_metrics_save> <tcp_orphan_retries type="Int">0</tcp_orphan_retries> <tcp_reordering type="Int">3</tcp_reordering> <tcp_retrans_collapse type="Bool">1</tcp_retrans_collapse> <tcp_retries1 type="Int">3</tcp_retries1> <tcp_retries2 type="Int">15</tcp_retries2> <tcp_rfc1337 type="Bool">0</tcp_rfc1337> <tcp_rmem_min type="Int">4096</tcp_rmem_min> <tcp_rmem_default type="Int">1024</tcp_rmem_default> <tcp_rmem_max type="Int">262144</tcp_rmem_max> <tcp_sack type="Bool">1</tcp_sack> <tcp_stdurg type="Bool">0</tcp_stdurg> <tcp_synack_retries type="Int">5</tcp_synack_retries> <tcp_syn_retries type="Int">5</tcp_syn_retries> <tcp_timestamps type="Bool">1</tcp_timestamps> <tcp_tw_recycle type="Bool">1</tcp_tw_recycle> <tcp_tw_reuse type="Bool">0</tcp_tw_reuse> <tcp_vegas_alpha type="Int">2</tcp_vegas_alpha> <tcp_vegas_beta type="Int">6</tcp_vegas_beta> <tcp_vegas_cong_avoid type="Int">0</tcp_vegas_cong_avoid> <tcp_vegas_gamma type="Int">2</tcp_vegas_gamma> <tcp_westwood type="Int">0</tcp_westwood> <tcp_window_scaling type="Bool">0</tcp_window_scaling> <ip_no_pmtu_disc type="Bool">1</ip_no_pmtu_disc> <tcp_wmem_min type="Int">4096</tcp_wmem_min> <tcp_wmem_default type="Int">1024</tcp_wmem_default> <tcp_wmem_max type="Int">262144</tcp_wmem_max> <tcp_ipfrag_time type="Int">30</tcp_ipfrag_time> <tcp_port_min type="Int">1024</tcp_port_min> <tcp_port_max type="Int">65535</tcp_port_max> <tcp_rto_min type="Int">1000</tcp_rto_min> <tcp_rto_max type="Int">120000</tcp_rto_max> <tcp_tw_rfc1323_strict type="Bool">0</tcp_tw_rfc1323_strict> <udp_port_randomization type="Bool">0</udp_port_randomization> <disable_min_max_buffer_size type="Bool">1</disable_min_max_buffer_size> <llm_hdr_gap type="Int">8</llm_hdr_gap> <llm_hdr_gap_ns type="Int">10</llm_hdr_gap_ns> <inter_packet_granular_delay type="Double">0</inter_packet_granular_delay> <delayed_acks type="Bool">1</delayed_acks> <accept_ra_default type="Bool">0</accept_ra_default> <rps_needed type="Bool">0</rps_needed> <delayed_acks_segments type="Int">0</delayed_acks_segments> <delayed_acks_timeout type="Int">0</delayed_acks_timeout> <tcp_large_icwnd type="Int">0</tcp_large_icwnd> <tcp_mgmt_rmem type="Int">87380</tcp_mgmt_rmem> <tcp_mgmt_wmem type="Int">32768</tcp_mgmt_wmem> <adjust_tcp_buffers type="Bool">1</adjust_tcp_buffers> <name type="String">TCP-2</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.TCPPlugin> <Ixia.Aptixia.StackManager.GratArpPlugin type="Ixia.Aptixia.StackManager.GratArpPlugin" objectid="fc54eec4-41ef-4b6c-9415-bf639013b52d" version="6.70.420"> <enabled type="Bool">1</enabled> <forwardGratArp type="Bool">0</forwardGratArp> <rateControlEnabled type="Bool">0</rateControlEnabled> <maxFramesPerSecond type="Int">0</maxFramesPerSecond> <name type="String">GratARP-1</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.GratArpPlugin> <Ixia.Aptixia.StackManager.MeshingPlugin type="Ixia.Aptixia.StackManager.MeshingPlugin" objectid="b0ccbeae-9db2-4416-bbed-80dcb2a7a9ed" version="6.70.420"> <trafficMaps type="ListNode"> <Ixia.Aptixia.StackManager.MeshingTrafficMap type="Ixia.Aptixia.StackManager.MeshingTrafficMap" objectid="ea086372-6f3e-4867-932d-bfa5aff92921" version="6.70.420"> <name type="String">newClientActivity1!HTTP server_newServerActivity1</name> <configMapFilename type="String">newClientActivity1Script.configmap</configMapFilename> <sourceActivityId type="Int">0</sourceActivityId> <ipPreference type="Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eIpPreference">2</ipPreference> <portRangesString type="String" /> <meshingType type="Ixia.Aptixia.StackManager.MeshingTrafficMapSkeleton+eMeshingType">2</meshingType> <destinationActivityId type="Int">0</destinationActivityId> </Ixia.Aptixia.StackManager.MeshingTrafficMap> </trafficMaps> <activityRangeMapInfoList type="ListNode" /> <name type="String">Meshing-2</name> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MeshingPlugin> </globalPluginList> <portList type="StringList"> <String>10.223.166.127;2;5</String> </portList> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.IPSecPortGroupData type="Ixia.Aptixia.StackManager.IPSecPortGroupData" objectid="df783f7c-615e-47c1-b7f0-1174985ea22e" version="8.1.7"> <role type="String">Initiator</role> <associates type="ListNode" /> <overrideGlobalOptions type="Bool">0</overrideGlobalOptions> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <maxInitiationRate type="Int">50</maxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <maxPendingTunnels type="Int">50</maxPendingTunnels> <teardownRate type="Int">10</teardownRate> <enableESPPerStreamStats type="Bool">0</enableESPPerStreamStats> <enableESPReplayStats type="Bool">0</enableESPReplayStats> <activities type="ListNode" /> <pcpuLogLevel type="String">0</pcpuLogLevel> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecPortGroupData> </typeSpecificData> <virtualMode type="Bool">0</virtualMode> <allowedVirtualModeTypes type="StringList" /> <doOwnership type="Bool">0</doOwnership> <branchToNicMap type="ListNode" /> <cpuAggregation type="Bool">0</cpuAggregation> <activePort type="String" /> <networkLayersManager type="Ixia.Aptixia.StackManager.NetworkLayersManager" objectid="3d3cf9ef-8aab-4388-9252-4baea80122d3" version="6.70.420" /> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.PortGroup> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="c4ecfc60-64ac-4dc2-9410-e0f58d84f229" version="6.70.420"> <name type="String">server network</name> <category type="String" /> <stack type="Ixia.Aptixia.StackManager.L1EthernetPlugin" objectid="1bd9f1bc-9959-464e-b1e8-ddb0bb4d0181" version="6.70.420"> <autoNegotiate type="Bool">1</autoNegotiate> <speed type="String">k100FD</speed> <advertise10Half type="Bool">1</advertise10Half> <advertise10Full type="Bool">1</advertise10Full> <advertise100Half type="Bool">1</advertise100Half> <advertise100Full type="Bool">1</advertise100Full> <advertise1000Full type="Bool">1</advertise1000Full> <cardDualPhy type="Ixia.Aptixia.StackManager.DualPhyPlugin" objectid="4fe8412b-7d4c-4ebe-a0d4-480a4401b3d0" version="6.70.420"> <medium type="String">auto</medium> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </cardDualPhy> <cardElm type="Ixia.Aptixia.StackManager.EthernetELMPlugin" objectid="4dfec118-30e8-4494-b7c7-e28518e7848a" version="6.70.420"> <negotiateMasterSlave type="Bool">1</negotiateMasterSlave> <negotiationType type="String">master</negotiationType> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </cardElm> <enableFlowControl type="Bool">0</enableFlowControl> <directedAddress type="String">01:80:C2:00:00:01</directedAddress> <dataCenter type="Ixia.Aptixia.StackManager.DataCenterSettings" objectid="123fecc5-cb5e-43e9-92a1-b053dc56d0f3" version="6.70.420"> <dcSupported type="Bool">1</dcSupported> <dcEnabled type="Bool">0</dcEnabled> <dcFlowControl type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eFlowControlType">0</dcFlowControl> <dcMode type="Ixia.Aptixia.StackManager.DataCenterSettingsSkeleton+eDataCenterMode">2</dcMode> <dcPfcMapping type="IntList" /> <dcPfcPauseEnable type="Bool">0</dcPfcPauseEnable> <dcPfcPauseDelay type="Int">1</dcPfcPauseDelay> <ixLoadRestObjectId type="Int">4</ixLoadRestObjectId> </dataCenter> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.L2EthernetPlugin type="Ixia.Aptixia.StackManager.L2EthernetPlugin" objectid="35ff711b-53f7-4c74-9e8b-98d35adaa6bf" version="6.70.420"> <macRangeList type="ListNode"> <Ixia.Aptixia.StackManager.MacRange type="Ixia.Aptixia.StackManager.MacRange" objectid="f91c9f52-8150-4d0f-b657-498ed241835c" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">MAC-R2</name> <mac type="String">00:98:28:28:14:00</mac> <incrementBy type="String">00:00:00:00:00:01</incrementBy> <mtu type="Int">1500</mtu> <count type="Int">1</count> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="57fa3f41-7695-42d7-ac26-68924bb1e8bb" version="6.70.420"> <name type="String">VLAN-R2</name> <enabled type="Bool">0</enabled> <firstId type="Int">1</firstId> <incrementStep type="Int">32</incrementStep> <increment type="Int">1</increment> <uniqueCount type="Int">4094</uniqueCount> <priority type="Int">0</priority> <tpid type="String">0x8100</tpid> <innerEnable type="Bool">0</innerEnable> <innerFirstId type="Int">1</innerFirstId> <innerIncrementStep type="Int">1</innerIncrementStep> <innerIncrement type="Int">1</innerIncrement> <innerUniqueCount type="Int">4094</innerUniqueCount> <innerPriority type="Int">0</innerPriority> <idIncrMode type="Int">1</idIncrMode> <innerTpid type="String">0x8100</innerTpid> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </vlanRange> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacRange> </macRangeList> <vlanRangeList type="ListNode"> <Ixia.Aptixia.StackManager.VlanIdRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="57fa3f41-7695-42d7-ac26-68924bb1e8bb" version="6.70.420" /> </vlanRangeList> <childrenList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Plugin type="Ixia.Aptixia.StackManager.IpV4V6Plugin" objectid="b85b184d-9bb4-48c2-a029-e633fee7a3c8" version="6.70.420"> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="1d9bf537-0c3d-4fdf-9b85-0a622cc77649" version="6.70.420"> <enabled type="Bool">1</enabled> <name type="String">IP-R2</name> <ipType type="String">IPv4</ipType> <ipAddress type="String">152.40.40.20</ipAddress> <prefix type="Int">24</prefix> <incrementBy type="String">0.0.0.1</incrementBy> <count type="Int">1</count> <autoCountEnabled type="Bool">0</autoCountEnabled> <gatewayAddress type="String">152.40.40.10</gatewayAddress> <gatewayIncrement type="String">0.0.0.0</gatewayIncrement> <gatewayIncrementMode type="String">perSubnet</gatewayIncrementMode> <enableGatewayArp type="Bool">0</enableGatewayArp> <generateStatistics type="Bool">0</generateStatistics> <mss type="Int">1460</mss> <randomizeAddress type="Bool">0</randomizeAddress> <randomizeSeed type="Int">463911585</randomizeSeed> <autoMacGeneration type="Bool">1</autoMacGeneration> <macRange type="Ixia.Aptixia.StackManager.MacRange" objectid="f91c9f52-8150-4d0f-b657-498ed241835c" version="6.70.420" /> <vlanRange type="Ixia.Aptixia.StackManager.VlanIdRange" objectid="57fa3f41-7695-42d7-ac26-68924bb1e8bb" version="6.70.420" /> <atmRange type="Ixia.Aptixia.StackManager.AtmRange" objectid="00000000-0000-0000-0000-000000000000" /> <pvcRange type="Ixia.Aptixia.StackManager.PvcRange" objectid="00000000-0000-0000-0000-000000000000" /> <autoIpTypeEnabled type="Bool">0</autoIpTypeEnabled> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Range> </rangeList> <rangeGroups type="ListNode"> <Ixia.Aptixia.StackManager.RangeGroup type="Ixia.Aptixia.StackManager.RangeGroup" objectid="b2c21c73-bfe3-4fbc-9804-b5a8b307d893" version="6.70.420"> <name type="String">DistGroup1</name> <distribType type="Ixia.Aptixia.StackManager.RangeGroupSkeleton+eDistributionType">0</distribType> <rangeList type="ListNode"> <Ixia.Aptixia.StackManager.IpV4V6Range type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="1d9bf537-0c3d-4fdf-9b85-0a622cc77649" version="6.70.420" /> </rangeList> </Ixia.Aptixia.StackManager.RangeGroup> </rangeGroups> <childrenList type="ListNode" /> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">IP-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpV4V6Plugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">MAC/VLAN-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.L2EthernetPlugin> </childrenList> <extensionList type="ListNode" /> <dscMode type="Bool">0</dscMode> <name type="String">Ethernet-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </stack> <globalPluginList type="ListNode"> <Ixia.Aptixia.StackManager.IxLoadSettingsPlugin type="Ixia.Aptixia.StackManager.IxLoadSettingsPlugin" objectid="993e33c6-e1f7-4967-982e-82a032f8c61a" version="1.0.0"> <teardownInterfaceWithUser type="Bool">0</teardownInterfaceWithUser> <interfaceBehavior type="Int">0</interfaceBehavior> <name type="String">Settings-4</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSettingsPlugin> <Ixia.Aptixia.StackManager.DnsPlugin type="Ixia.Aptixia.StackManager.DnsPlugin" objectid="36ca84d7-ff44-45b7-b75d-aec38b753161" version="6.70.420"> <domain type="String" /> <timeout type="Int">30000</timeout> <nameServerList type="ListNode" /> <searchList type="ListNode" /> <hostList type="ListNode" /> <name type="String">DNS-4</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.DnsPlugin> <Ixia.Aptixia.StackManager.FilterPlugin type="Ixia.Aptixia.StackManager.FilterPlugin" objectid="25c5acdd-9dd3-4802-93b6-b10651820b66" version="6.70.420"> <auto type="Bool">1</auto> <all type="Bool">0</all> <pppoecontrol type="Bool">0</pppoecontrol> <pppoenetwork type="Bool">0</pppoenetwork> <isis type="Bool">0</isis> <ip type="String" /> <tcp type="String" /> <udp type="String" /> <mac type="String" /> <icmp type="String" /> <name type="String">Filter-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.FilterPlugin> <Ixia.Aptixia.StackManager.TCPPlugin type="Ixia.Aptixia.StackManager.TCPPlugin" objectid="6259328b-97c2-4390-8ab1-f16bf3459219" version="6.70.420"> <bestPerfSettings type="Bool">0</bestPerfSettings> <accept_ra_all type="Bool">0</accept_ra_all> <tcp_abort_on_overflow type="Bool">0</tcp_abort_on_overflow> <tcp_adv_win_scale type="Int">2</tcp_adv_win_scale> <tcp_app_win type="Int">31</tcp_app_win> <tcp_bic type="Int">0</tcp_bic> <tcp_bic_fast_convergence type="Int">1</tcp_bic_fast_convergence> <tcp_bic_low_window type="Int">14</tcp_bic_low_window> <tcp_dsack type="Bool">1</tcp_dsack> <tcp_ecn type="Bool">0</tcp_ecn> <tcp_fack type="Bool">1</tcp_fack> <tcp_fin_timeout type="Int">60</tcp_fin_timeout> <tcp_frto type="Int">0</tcp_frto> <tcp_keepalive_intvl type="Int">7200</tcp_keepalive_intvl> <tcp_keepalive_probes type="Int">75</tcp_keepalive_probes> <tcp_keepalive_time type="Int">9</tcp_keepalive_time> <tcp_low_latency type="Int">0</tcp_low_latency> <tcp_max_orphans type="Int">8192</tcp_max_orphans> <tcp_max_syn_backlog type="Int">1024</tcp_max_syn_backlog> <tcp_max_tw_buckets type="Int">180000</tcp_max_tw_buckets> <tcp_mem_low type="Int">24576</tcp_mem_low> <tcp_mem_pressure type="Int">32768</tcp_mem_pressure> <tcp_mem_high type="Int">49152</tcp_mem_high> <tcp_moderate_rcvbuf type="Int">0</tcp_moderate_rcvbuf> <tcp_no_metrics_save type="Bool">0</tcp_no_metrics_save> <tcp_orphan_retries type="Int">0</tcp_orphan_retries> <tcp_reordering type="Int">3</tcp_reordering> <tcp_retrans_collapse type="Bool">1</tcp_retrans_collapse> <tcp_retries1 type="Int">3</tcp_retries1> <tcp_retries2 type="Int">15</tcp_retries2> <tcp_rfc1337 type="Bool">0</tcp_rfc1337> <tcp_rmem_min type="Int">4096</tcp_rmem_min> <tcp_rmem_default type="Int">1024</tcp_rmem_default> <tcp_rmem_max type="Int">262144</tcp_rmem_max> <tcp_sack type="Bool">1</tcp_sack> <tcp_stdurg type="Bool">0</tcp_stdurg> <tcp_synack_retries type="Int">5</tcp_synack_retries> <tcp_syn_retries type="Int">5</tcp_syn_retries> <tcp_timestamps type="Bool">1</tcp_timestamps> <tcp_tw_recycle type="Bool">1</tcp_tw_recycle> <tcp_tw_reuse type="Bool">0</tcp_tw_reuse> <tcp_vegas_alpha type="Int">2</tcp_vegas_alpha> <tcp_vegas_beta type="Int">6</tcp_vegas_beta> <tcp_vegas_cong_avoid type="Int">0</tcp_vegas_cong_avoid> <tcp_vegas_gamma type="Int">2</tcp_vegas_gamma> <tcp_westwood type="Int">0</tcp_westwood> <tcp_window_scaling type="Bool">0</tcp_window_scaling> <ip_no_pmtu_disc type="Bool">1</ip_no_pmtu_disc> <tcp_wmem_min type="Int">4096</tcp_wmem_min> <tcp_wmem_default type="Int">1024</tcp_wmem_default> <tcp_wmem_max type="Int">262144</tcp_wmem_max> <tcp_ipfrag_time type="Int">30</tcp_ipfrag_time> <tcp_port_min type="Int">1024</tcp_port_min> <tcp_port_max type="Int">65535</tcp_port_max> <tcp_rto_min type="Int">1000</tcp_rto_min> <tcp_rto_max type="Int">120000</tcp_rto_max> <tcp_tw_rfc1323_strict type="Bool">0</tcp_tw_rfc1323_strict> <udp_port_randomization type="Bool">0</udp_port_randomization> <disable_min_max_buffer_size type="Bool">1</disable_min_max_buffer_size> <llm_hdr_gap type="Int">8</llm_hdr_gap> <llm_hdr_gap_ns type="Int">10</llm_hdr_gap_ns> <inter_packet_granular_delay type="Double">0</inter_packet_granular_delay> <delayed_acks type="Bool">1</delayed_acks> <accept_ra_default type="Bool">0</accept_ra_default> <rps_needed type="Bool">0</rps_needed> <delayed_acks_segments type="Int">0</delayed_acks_segments> <delayed_acks_timeout type="Int">0</delayed_acks_timeout> <tcp_large_icwnd type="Int">0</tcp_large_icwnd> <tcp_mgmt_rmem type="Int">87380</tcp_mgmt_rmem> <tcp_mgmt_wmem type="Int">32768</tcp_mgmt_wmem> <adjust_tcp_buffers type="Bool">1</adjust_tcp_buffers> <name type="String">TCP-4</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.TCPPlugin> <Ixia.Aptixia.StackManager.GratArpPlugin type="Ixia.Aptixia.StackManager.GratArpPlugin" objectid="3eedf749-efa4-43a0-87ae-e110a77c88d4" version="6.70.420"> <enabled type="Bool">1</enabled> <forwardGratArp type="Bool">0</forwardGratArp> <rateControlEnabled type="Bool">0</rateControlEnabled> <maxFramesPerSecond type="Int">0</maxFramesPerSecond> <name type="String">GratARP-2</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.GratArpPlugin> <Ixia.Aptixia.StackManager.MeshingPlugin type="Ixia.Aptixia.StackManager.MeshingPlugin" objectid="284f9992-65d8-4027-a155-709f1965f892" version="6.70.420"> <trafficMaps type="ListNode" /> <activityRangeMapInfoList type="ListNode" /> <name type="String">Meshing-1</name> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MeshingPlugin> </globalPluginList> <portList type="StringList"> <String>10.223.166.127;2;6</String> </portList> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.IPSecPortGroupData type="Ixia.Aptixia.StackManager.IPSecPortGroupData" objectid="f65f12f2-018c-46f5-a9c5-a1f6f7151909" version="8.1.7"> <role type="String">Initiator</role> <associates type="ListNode" /> <overrideGlobalOptions type="Bool">0</overrideGlobalOptions> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <maxInitiationRate type="Int">50</maxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <maxPendingTunnels type="Int">50</maxPendingTunnels> <teardownRate type="Int">10</teardownRate> <enableESPPerStreamStats type="Bool">0</enableESPPerStreamStats> <enableESPReplayStats type="Bool">0</enableESPReplayStats> <activities type="ListNode" /> <pcpuLogLevel type="String">0</pcpuLogLevel> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecPortGroupData> </typeSpecificData> <virtualMode type="Bool">0</virtualMode> <allowedVirtualModeTypes type="StringList" /> <doOwnership type="Bool">0</doOwnership> <branchToNicMap type="ListNode" /> <cpuAggregation type="Bool">0</cpuAggregation> <activePort type="String" /> <networkLayersManager type="Ixia.Aptixia.StackManager.NetworkLayersManager" objectid="60b1273d-78d3-4813-8cea-ec9a7101b8a3" version="6.70.420" /> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.PortGroup> </portGroupList> <externalProperties type="Ixia.Aptixia.StackManager.ExternalPropertyManager" objectid="1f2452bf-e52a-4db2-ba47-e5cc8bf61b5e" version="6.70.420"> <properties type="ListNode"> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="145671ff-93a5-4ecc-8c83-59b2c3c67be9" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatLTEUEUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="9f07a941-ad2f-46b0-8c75-911862a21039" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">SixRdRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="a221ab5c-faae-4940-bfad-5d41d44f1427" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">L2tpRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d811442b-bfb8-42f0-bbf8-6bdb6fc9b66b" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DHCPServerRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="f252cff3-b919-4e74-9f62-9e9c5ab5d324" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MobileSubscribersRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="493ce043-b982-4a43-a2d4-619e51fbc5a6" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IPSecRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="500dfc8b-2e6a-401f-84c0-f6907f60c00e" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPSgsnS3RangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="693cb176-f3d8-4073-8a02-fabdc0bdd3fb" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPRange_SGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="ec983bf9-07f0-46b2-99a0-354114f42501" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EmulatedRouterRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="5d0f0eb8-40af-4292-8ff2-a57e7903601d" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">PppoxRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="653fae09-ba19-443c-8f8b-9483c0b86b9a" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPNGAPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="c886be8c-c207-4bb4-90d5-17be54556d58" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatRNCIuPSUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="00e75214-5166-406b-90e5-2b83567ae5cf" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPNGUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="50d10ee7-45ce-46d2-ae8d-ecd3b1806067" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange_S5S8_SGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="c2f310a4-6ea4-4459-be3b-f3b3365c590a" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPGRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="7e458bed-5e36-42d6-812d-3794be52766e" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPPcrfRange_S5S8_PGW</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="7d225fda-6432-4de3-9750-c19bbc957703" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DSLiteRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="e25dd669-ffc5-493d-a2b5-fd5627bf2ee8" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPSGSNRangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="7ac0b7d4-6df9-4e1f-86d2-f0a494b3f20b" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">SlaacRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="25699a2c-ab22-417b-9072-894523e98008" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="05f1053a-5774-409f-b07e-add07df64338" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">PSTNDigitalRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="482a10c3-0ac7-44d9-9fa9-b43ba3a9901d" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DHCPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="a0f03753-923d-4421-8c4f-0ed78f00fc44" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">AtmRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="fb5cd68e-b4b0-4fd4-ae18-4100c0035642" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatMMEApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="62677b6a-080e-4cc3-919b-71fa90ae410f" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatENodeBUuApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="2e0fd6e3-470e-48df-ab8d-cc21b9d80393" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">GTPSUERange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="175f3104-0d2a-44f9-b712-fed3b170f8cb" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IpV4V6Range</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d1f37e1e-db44-4bac-acb8-b242dee8e371" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MacRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="61ccdebc-84e6-464d-be14-2b3ddedab9d2" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">DualStackIPRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d0678cd8-998e-42ab-8f0d-bfcb5370eac2" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPUERange_S2a_TWAN</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="d8350364-51c6-4a1b-af9f-72c9c235a636" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatSGSNIuPSApnRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="613d02a1-db1e-415d-b4bb-8b73b4477cf4" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">IxCatENodeBSimUeRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="9a41f718-b55e-44c7-a0cc-b1fcf8204c20" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">S6dRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="4c26fe62-a63d-4c40-8e15-c58ad8fba8d0" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">UERangeBase</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="5c2ca63f-3335-4ab7-963e-440817448538" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">EGTPMmeS10RangeUe</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="51a5eccc-a68d-4730-8a48-32019c547c28" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">S6aRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="3010c4ad-f31e-4676-9e61-bb25cf9c1bbb" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">BmScRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="ef1677e4-f390-4a78-b61a-f7650cf5faea" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">MBmsGwRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> <Ixia.Aptixia.StackManager.ExternalPropertyInfo type="Ixia.Aptixia.StackManager.ExternalPropertyInfo" objectid="24322b98-7a2a-4d2d-a4ee-4cde0f0e8b64" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <targetType type="String">PptpRange</targetType> <valueType type="String">ExternalValueBoolean</valueType> <description type="String">Enable collection of interface statistics on this range</description> </Ixia.Aptixia.StackManager.ExternalPropertyInfo> </properties> <values type="ListNode"> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="6804ae67-3bd7-471b-8796-ee1e4773c2f1" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="a3559674-8d95-4020-90b3-b42eacaef105" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="7efcd429-2c48-41bd-bdc5-489dbfcfc49a" version="6.70.420"> <value type="Bool">0</value> </value> <enabled type="Bool">1</enabled> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="a63d8276-65bc-4bc2-8202-6461c6399ef9" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.IpV4V6Range" objectid="1d9bf537-0c3d-4fdf-9b85-0a622cc77649" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="09d7b134-2921-4759-bbdb-ff3a5a1966d7" version="6.70.420"> <value type="Bool">0</value> </value> <enabled type="Bool">1</enabled> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="0cd9f099-242e-4b03-965f-d343c60181e6" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.MacRange" objectid="3011c8a8-a9fd-4b76-a27d-91948113ed4f" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="503aa008-2481-419f-a223-c90b2c25c17e" version="6.70.420"> <value type="Bool">0</value> </value> <enabled type="Bool">0</enabled> </Ixia.Aptixia.StackManager.ExternalProperty> <Ixia.Aptixia.StackManager.ExternalProperty type="Ixia.Aptixia.StackManager.ExternalProperty" objectid="0b8d2c01-19ac-4f28-924e-660676d978da" version="6.70.420"> <propertyName type="String">Publish Statistics</propertyName> <target type="Ixia.Aptixia.StackManager.MacRange" objectid="f91c9f52-8150-4d0f-b657-498ed241835c" version="6.70.420" /> <value type="Ixia.Aptixia.StackManager.ExternalValueBoolean" objectid="41c694b3-bb55-48fe-9604-8b003540242f" version="6.70.420"> <value type="Bool">0</value> </value> <enabled type="Bool">0</enabled> </Ixia.Aptixia.StackManager.ExternalProperty> </values> </externalProperties> <availableNetworkTimelines type="ListNode" /> <typeSpecificData type="ListNode"> <Ixia.Aptixia.StackManager.MacSessionData type="Ixia.Aptixia.StackManager.MacSessionData" objectid="a9c7aa59-e015-4ffd-bb82-5d877ae9c1a8" version="6.70.420"> <duplicateCheckingScope type="Ixia.Aptixia.StackManager.MacSessionDataSkeleton+eMacValidationOptions">2</duplicateCheckingScope> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.MacSessionData> <Ixia.Aptixia.StackManager.IpSessionData type="Ixia.Aptixia.StackManager.IpSessionData" objectid="34a78d72-1fc5-4875-9fe1-b4db66b1b4c4" version="6.70.420"> <duplicateCheckingScope type="Ixia.Aptixia.StackManager.IpSessionDataSkeleton+eIpValidationOptions">2</duplicateCheckingScope> <enableGatewayArp type="Bool">0</enableGatewayArp> <gatewayArpRequestRate type="Int">300</gatewayArpRequestRate> <maxOutstandingGatewayArpRequests type="Int">300</maxOutstandingGatewayArpRequests> <ignoreUnresolvedIPs type="Bool">0</ignoreUnresolvedIPs> <sendAllRequests type="Bool">0</sendAllRequests> <individualARPTimeOut type="Int">500</individualARPTimeOut> <ixLoadRestObjectId type="Int">2</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IpSessionData> <Ixia.Aptixia.StackManager.IxLoadSessionData type="Ixia.Aptixia.StackManager.IxLoadSessionData" objectid="1e24447f-69f1-4030-8b2d-25a18c7160ca" version="1.0.0"> <portGroupList type="ListNode"> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="865be042-32d5-426a-9e75-0908c943801f" version="6.70.420" /> <Ixia.Aptixia.StackManager.PortGroup type="Ixia.Aptixia.StackManager.PortGroup" objectid="c4ecfc60-64ac-4dc2-9410-e0f58d84f229" version="6.70.420" /> </portGroupList> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IxLoadSessionData> <Ixia.Aptixia.StackManager.ImpairSessionData type="Ixia.Aptixia.StackManager.ImpairSessionData" objectid="94b53c2c-0747-41c2-838d-0e0e15f31766" version="6.70.13"> <profiles type="ListNode"> <Ixia.Aptixia.StackManager.ImpairProfile type="Ixia.Aptixia.StackManager.ImpairProfile" objectid="90dd3511-93c1-49fa-8e38-db774db9fe17" version="6.70.13"> <name type="String">DefaultProfile</name> <defaultp type="Bool">1</defaultp> <seed type="Int">0</seed> <addDelay type="Bool">1</addDelay> <delay type="Int">20</delay> <jitter type="Int">0</jitter> <addDrop type="Bool">0</addDrop> <drop type="Double">10</drop> <addDropSequence type="Bool">0</addDropSequence> <dropSequenceSkip type="Int">10</dropSequenceSkip> <dropSequenceLength type="Int">1</dropSequenceLength> <addReorder type="Bool">0</addReorder> <gap type="Int">10</gap> <reorder type="Int">20</reorder> <reorderLength type="Int">1</reorderLength> <addReorderPI type="Bool">0</addReorderPI> <reorderPISkip type="Int">10</reorderPISkip> <reorderPILength type="Int">1</reorderPILength> <reorderPIInterval type="Int">1</reorderPIInterval> <reorderPITimeout type="Int">1000</reorderPITimeout> <addDuplicate type="Bool">0</addDuplicate> <duplicate type="Double">10</duplicate> <addFragment type="Bool">0</addFragment> <fragment type="Double">10</fragment> <mtu type="Int">1000</mtu> <addFragmentSequence type="Bool">0</addFragmentSequence> <fragmentSequenceSkip type="Int">10</fragmentSequenceSkip> <fragmentSequenceLength type="Int">1</fragmentSequenceLength> <mtuSequence type="Int">1000</mtuSequence> <sendFragmentsInReverseOrder type="Bool">0</sendFragmentsInReverseOrder> <sendFirstFragmentOnly type="Bool">0</sendFirstFragmentOnly> <sendOverlappingFragments type="Bool">0</sendOverlappingFragments> <addBandwidth type="Bool">0</addBandwidth> <bandwidth type="Double">1</bandwidth> <bandwidthUnits type="String">mbps</bandwidthUnits> <addBandwidthIn type="Bool">0</addBandwidthIn> <bandwidthIn type="Double">1</bandwidthIn> <bandwidthUnitsIn type="String">mbps</bandwidthUnitsIn> <destinationIp type="String">any</destinationIp> <sourceIp type="String">any</sourceIp> <sourcePort type="Int">0</sourcePort> <destinationPort type="Int">0</destinationPort> <protocol type="String">any</protocol> <typeOfService type="String">any</typeOfService> <addTcpFlagsFilter type="Bool">0</addTcpFlagsFilter> <selectTcpFlags type="String">SYN;RST;ACK</selectTcpFlags> <expectTcpFlags type="String">SYN</expectTcpFlags> <impairOrder type="String">Delay;Drop;DropSeq;Reorder;ReorderPI;Duplicate;Fragment;FragmentSeq;Bandwidth</impairOrder> </Ixia.Aptixia.StackManager.ImpairProfile> </profiles> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.ImpairSessionData> <Ixia.Aptixia.StackManager.IPSecSessionData type="Ixia.Aptixia.StackManager.IPSecSessionData" objectid="bd2f0ea4-4278-49c8-9600-18cd2c8ed639" version="8.1.7"> <ipsecTunnelSetup type="Ixia.Aptixia.StackManager.IPSecTunnelSetup" objectid="1bacc8a0-dda0-4e0c-b013-4d8618dc80b6" version="8.1.7"> <tunnelSetupTimeout type="Int">30</tunnelSetupTimeout> <tunnelRetransmissionTimeout type="Int">30</tunnelRetransmissionTimeout> <numRetries type="Int">0</numRetries> <retryInterval type="Int">10</retryInterval> <retryDelay type="Int">10</retryDelay> <testType type="String">P2D</testType> <sendCiscoVid type="Bool">0</sendCiscoVid> <useMaxInitiationRate type="Bool">0</useMaxInitiationRate> <useMaxPendingTunnels type="Bool">0</useMaxPendingTunnels> <enableRekey type="Bool">1</enableRekey> <rekeyRetries type="Int">3</rekeyRetries> <rekeyFuzzPercentage type="Int">0</rekeyFuzzPercentage> <rekeyMargin type="Int">10</rekeyMargin> </ipsecTunnelSetup> <ipsecCertificates type="Ixia.Aptixia.StackManager.IPSecCertificates" objectid="2e324324-bf74-4ad3-afbb-62e44f01c31a" version="8.1.7"> <uniqueCert type="Bool">0</uniqueCert> <certSource type="String">kNewCert</certSource> <caURL type="String" /> <caDN type="String" /> <certSubjectDN type="String" /> <certSubjectAltDN type="String" /> <remoteIkeId type="String" /> <bitSize type="String">k512</bitSize> <saveCert type="Bool">1</saveCert> <cacheCertFolder type="String">C:\Program Files\Ixia\CachedCerts</cacheCertFolder> <certParentFolder type="String">C:\Program Files\Ixia\CachedCerts</certParentFolder> <certNumber type="String" /> <caCertNumber type="String" /> <earlyExpDate type="String" /> <lateExpDate type="String" /> <usePerRangeCertNameExp type="Bool">0</usePerRangeCertNameExp> <checkCrl type="Bool">0</checkCrl> <crlOverrideEnable type="Bool">0</crlOverrideEnable> <crlOverrideUrl type="String" /> <checkOcsp type="Bool">0</checkOcsp> <ocspOverrideEnable type="Bool">0</ocspOverrideEnable> <ocspOverrideUrl type="String" /> <unknownIsRevoked type="Bool">0</unknownIsRevoked> <certProto type="String">kSCEP</certProto> </ipsecCertificates> <ipsecCertManager type="Ixia.Aptixia.StackManager.IPSecCertManager" objectid="f3dc4ef0-e9a1-48a2-b69f-c5d2b485e897" version="8.1.7"> <caURL type="String" /> <caDN type="String">CN=RootCA,C=RO,L=Bucharest,O=Ixia,OU=IxLoad,IP:201.121.87.2,email:ixia@ixiacom.com</caDN> <certSubjectDN type="String">CN=IxiaVPN,C=RO,L=Bucharest,O=Ixia</certSubjectDN> <keyGenAlgo type="String">kRSA_512</keyGenAlgo> <cacheCertFolder type="String">C:\Program Files\Ixia\CachedCerts</cacheCertFolder> <caKeyFile type="String">C:\Program Files\Ixia\ca-priv.key</caKeyFile> <caCrtFile type="String">C:\Program Files\Ixia\ca-cert.crt</caCrtFile> <certNumber type="Int">1</certNumber> <certProto type="String">kSCEP</certProto> <createRootCA type="Bool">0</createRootCA> <uniqueCert type="Bool">0</uniqueCert> <descFilePath type="String">C:\Program Files\Ixia\CachedCerts\sample.desc</descFilePath> <useDescFile type="Bool">0</useDescFile> </ipsecCertManager> <eapSimTuples type="ListNode" /> <eapAkaTuples type="ListNode" /> <maxInitiationRate type="Int">50</maxInitiationRate> <maxPendingTunnels type="Int">50</maxPendingTunnels> <negotiationStartDelay type="Int">0</negotiationStartDelay> <teardownRate type="Int">10</teardownRate> <burstInitiation type="Bool">0</burstInitiation> <parallelInitiation type="Bool">0</parallelInitiation> <enableExtraPortLogging type="Bool">0</enableExtraPortLogging> <enableWildcardTsi type="Bool">0</enableWildcardTsi> <enableWildcardTsr type="Bool">0</enableWildcardTsr> <enablePlutoWildcardTsi type="Bool">0</enablePlutoWildcardTsi> <enablePlutoModeCfgWildcardTsr type="Bool">1</enablePlutoModeCfgWildcardTsr> <enablePlutoS2SWildcardTsr type="Bool">0</enablePlutoS2SWildcardTsr> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.IPSecSessionData> </typeSpecificData> <statViewManager type="Ixia.Aptixia.StackManager.StatViewManager" objectid="7256ce27-286c-475d-b198-09b4ae306f73" version="6.70.420"> <enableStats type="Bool">1</enableStats> <enableOverviewStats type="Bool">1</enableOverviewStats> <enablePerSessionStats type="Bool">1</enablePerSessionStats> </statViewManager> <waitForLinkUp type="Bool">0</waitForLinkUp> <overloadProtection type="Bool">1</overloadProtection> <ixLoadRestObjectId type="Int">1</ixLoadRestObjectId> </Ixia.Aptixia.StackManager.SMSession> </rpf></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"><?xml version="1.0" encoding="utf-16"?> <Config> <configs Version="5.0" /> </Config></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"><specify file></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"><specify file></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"><specify file></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"><specify file></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"><specify file></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"><specify file></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"><specify file></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"><specify file></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"><specify file></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"><specify file></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 <data> M>)SMG7MOVS@2P+^*D<,5>[BE+8J41*6/19ND;;!I$\1I=X'KH2"I4:*K(WDE M.8\[W'<_4I)MV9:=[.U672SFC]:2.#-\B#,_CBPSSWZXNYX,;B ODBQ]OD>' MSMX/+YZ-2UE^3. 6\F61/_2=H3-TF;MG!*"P5T^2HAS\"/?/]^2T3.X2.2QN MAE.K4920:ABVY'[*Y=04&>6#T_<71^\O!J,7S\[.C\;F\.7%\>G[]?//1X?' M%R]?G1S9@H/3=Z^.WQ\=+JHN%D>/:<!&Y2^>O<[AEYF1N1_<R,D,GN^Y>U5% MQ<U)=GF9I)?SZZ_EI("J["*YAO%]JE_!E;Q)LGPNX2Q*BU)>3\]RT$G5LJ:< M5>5'E[EIC!W6B_LIS,MH579JAGF2R>@LSTK094OW(I_!6L/>)E$$J354;+;Q M*)5J H>RE.,RRV%3X&PY.NUV\"[MG369!IW.RNFL7(SDN]FD3*:3];Y50H?C M!\3>R3L[[0K3OH-946;7;\P]NUK(^/,Z7R<3.)/EHN1@_].'PO3I4U303X>9 MGEU#6A:?CLUD,/^=F$'])(8.'5+''[)/YU"8VHM/;R\NSLC-ZY\^'Y_=\,_N M69:7Q6?7H8'C.>%GZKB"U?/AY01,T?QS8+PE+?;OBN3YWE593O='H]O;V^$M M&V;YY<AU'#KZ^=W)6%_!M21):J:#&>:]A5;TL%95Z6A>ZR'$TK2WN@,[SE[8 M]@\.SCX,[!":NYOHXMFH+; B?>(25DD6@]C,XH-)8H9L4(W!X[7&D)M)^SBM MBZL\FUU>F6E0&UB3'ZUV;.WT(,\:M\D!3.G:^;F,DNR-L3]=*TC2\H7[;&0_ MGHVV2M6=?YWEU[.)'$-9&@=;3/;_//G+W>%3\]_+IT]^F67ETX]U-*Q/]NL/ M.O3J@^\WI&T'&ME_+ O_N3S\[_*PCB$F@IS/TO5V/)F43U<"];QFISX8&+?* M(J/1%,S*F%"_/O[AR67YM-4R8ZJIY3B-,W,7$SE)_BUMS'DE+UL3O%9_]"QO M6K*<ZH_3KZ56VS@8V%9>?RZ;T;!S6IO0."W6Y6I)VY_W\AILJ3VF]N*H?;5; MYT"6<)GE]U;"QKR1C0H+W7;IIOY!?#F/1%9@-0I!\:7,II_N91Y97_S2&6Z& M^5U<5;9FJKNMD,_[8FI8M'%Y=5/K<%9U?S#:6OSVMIG/.V3&#\G89IRJ?UEJ MW4"Q2^IM<GDU,?_*K5(+-I7'ACME$B>06TE%E1(TC(DO&"<\9(I(JB2!V('( M =\13EB-R38#FU69>=6>,N:44J\VTBK:U+-W>7Q\: O'A!*/N)0PQAGS/1ZX MQ VH\"@/'$%$R'P6^AZA9L)7AENZG0TR$STO(3I-K82%$7$\XH07U-EWQ3X+ MAIY/.67B[XZWSYQY6U>TMMC-S.K'2 R,7^^GR:3QS=*L+1JWW7)#ZNCX3NJK M)(7YH!R;%=0).3NH)V^7Q .&7D:170I926I6E"X;4M\?FHXM]6(0SOZ^$J': M=YGF^^ &<C]R]%^IMQK+1MLL;[;A^.X]E+=9_F4>Q8W4<FE0&>L2V6'H'"8@ MBWI0JJ7&P*Z2!T<O5XVUQ'88:X42$^LN<WD]L&&A&'QW)_R_;2QHR)NU6K;' MC^.[<YB:D -YJUNL7L_38-[S#IEN/_[P;JSE!.K;YSB+8-2ZOJDXOFD5_ZA, M*+=J*U<[YVYW@/T]EWES/^H:OZKL,2!J :NN^G1JB;IE)AYDDXD)F';]7;$' M2FGN=%3/Y]6RK<HG(/,4(@MQ*Q?;=7G;P%KY5CNO)]EMM3 J.LVL%F^U8@*O ME:Q6=U:P"BTM,^OENPPU.=LN6^LBV\V9A"K3V>0X-3,[EAJZ+79*;35ZGLU* M.)?I9;>UM>(N,]=3&Z8N%M-E?>B[RK?-RYWSK9Z7T7UJ9ZU)E#O0NR+RT2XX M-X06+KYEU6BEZ\1ED5[_'YE]L]ZW'W5.WY'5M#-X&P^ZD^HZ(6\6]>:NS*[M M\X+5\ZJYZR)O\B0ZR-(XN32#$1N?-#(=UVQ]/U]/3.'B:/.YP2)SMTO+PJ;3 M=78=;4O:H\V</TOM6J99U<BUE/U+<_TXK1863<ZP6N69F9+F:I-R)Y"O)MVF MU0](C%,Y+:ZRTDC.:_C9)B++Q"2?QEU3RD;FX<OFJ<SR@=*PP^"@-+UJUB2_ M0JU9NF3UXG.><"CJQD"E1W3D,\(]"41%'B,NL(!YH1=S=YXUK693]0.N[GRD M[M*L@#>33,E)5\-?9=EDJ5PO^#84NNT6\[[5MWMU/-)R:;5F[;IXMU%M)Z2N M/+1M;USFIB%+D_-Q'1R,/U;66WI;#5=YQ0ZC'8X[M[U]B6@*+^!Z.C%IUV,: M/#<XU]EJU"ZBWD *N;2WX%T6P0/CVZG3;3Z;0FIF9/.L]('9L"*\TU[7C5NU MZ+0M[KY?R65J H'ID6&;#4\/V%P3WS*L,GTYG4[NCQ]KNQZ!+6J==/LU@6 3 M5DU06@UAXX^-QA@LIR&JGV8UL:R2?0^W1NS</JDT:6UZD667DXZ'J$;&3I'4 M^D%;O>I=_?#N(CLR"6@.Y]GMIOYOX&2E7C\W6Y)RQQ,])"82<S<Q&:<.59R1 M@$N7<.V'1*A($AEZU(E\CVE-D9A?EY@['!C)B>1$<O9$SO:W6DA.).=N<OJN MXP2<><0/G(!P#B$)(T9)+%U'.V'@J<!#<O9*SK8#(SF1G$C.KTK.]3<[?@LS MD9!_/D(R3S#&8TY\CU/"%?A$N2;!U%H&H:L"H9B/A.R!D.N.BFQ$-B(;OQ8; M[7L'\X<X9+!\/>H/B\?E4" ?^^2C&W#/I0XCD2<DX4)%1 DPN:3K1U10+5V. MSUZ_,A^W.2LB$A&)B.P'D:WEZ<(!$98(RQ58:E_$D@E!=,P] TNFB @T)8$* MN:"1$!!RA&6?L.QR6\0F8A.QV1,V<YD6LO[!Z+EQ#4PPD9EK7U$J;= (/@D] MSS!34D44"SAQ-*6N4DR)&)"9O3)SW6<1F A,!&;OP$16(BM761F'3L!BSR24 M3(2$^V#R2]=C) QDX )W7?#QIR/?BI6(2<0D8K(G3)Y(NT%0@ODD,G*-D=)W ME)(B)J$K L*%9$1*CY-(:ZI\JAP5,61DGXQ<^"H"$@&)@.P'D/3N[ON!>W<W MD&DT8.;S'(JI6:0B,9&8:\2,0L4A=!T2!X$VQ(P"HGQSZH7,"6+F:^V'2,P^ MB;G=>1&AB%!$:#\(K<Y>RV0RRY&:2,TU:HK(H^ &#J$T< EW7$U"#@%A6CDR M#$ +A=3LE9HK_HJ@1% B*/L!Y<'5+/TR.&JV>!Y\-U^M_@VAB=!<@:;#:,2% M%Q+A:X_PB$8D9&%(/.5)Z2HMW3! :/8)S:V^BP!%@") OQ5 J^X@/Y&?J_P$ M'V0@78-. "#<CR,B0^81%H344T' HF[%7QE?E9.S!"/B$?$8T_OQ!Z8DRQ- M 5^+12IV994BH(I1(#2FW%!1*!)R 212+&1.&+INA%EEKUGEFL<B+!&6",O^ M8(E?6B(IMY"2ASX(36C@*[N;CTO", 82A$+;%!*8'R,I^R8E?F>)F$1,]HM) M@X?!A_.3/RPA<3O8;P)(C]L_BLHH >F'A(<Z($I[,8EE0+4((59<(R#[!&3C MJ,A&9".R\:NRL?G+!+AI#V+R04QZL><Z4A!?:TVX#( H<!GQI>?Y@8I=C^++ MKWU@<KO/(C 1F C,WH&)K$16KOU0A-) @=B<DM!>* C(@1P(@%\Y0;4BP W M[?E6K$1,(B81DSUATD( $TJ$9 <D.0T#1SN<F+P2"(\%(\*CE%"/.8%R0D]0 MW#F]5T@NG141B8A$1/:#R,5&'^926B(F$9,KF*21)[60F@@:^X0KZA&E)"6" M"\^3@9*1PLW2>\7DJL,B*A&5B,I^4(F[#B U'T=-ES,E0D\3J3V37-JM[D(M M8A*X3FS_R+.G-":7O5(3=QU @") _W Q5T'D)\=_ 2F :0(B2\I)9P% 0D5 M:,*\4 BJ(]_1"OGY=?E9.3%%/"(>$8_]X!&W?T4F[F B=5@4 A"IPHAP"#A1 M'%Q"(53:"V-&8\PI>\TI<?M7!"6"\EN\_8K;\R J=Z R5+'G P\,*A4CW#/I MHY2A) [X+C@Q,-=W$95]HA*WYT%8(BR_&2PQJ412=I*2<1$SFT7&+BC"8QT1 MZ2F?""5B;FD9<TPJ>R<EYI2(2<1DOYC\';;G63VOZL0->_YTR(P#[OL0!T2[ MD4<X4Y0(%SS"5" <&L2*>_C=9*_(Q U[D)9(RUYI>7IFM<>#=U!>91&FE<C( MU5^-!$"CT%5$R# TC/0%44H 850Y0L6&DK@#02_O[R 3D8G(Q-^7B=5'4<7M MTW1R7YU16WZ2I%\@JLZ;VFI=<S@V/#1397E4=):?&))8 F:SZ<#V\OE>96UO M$24-$%;+#V8&,==[@RR/(*]X(;4VQD[@!B;/]]RJWVV%0XBEP4RQ4''65-9K ML.#?(5SUM))??H[3ZVF]:I#-3"INAM,:E& .K0"+:"VUP^VJ$;]+*^]L86Y MPA1J4UA-O>;\1N9U2YO 92XU:+$;KMS,KY>&Y\WU" J=)]-RB9T6<*R;7263 E*(=T,)I?&345M>N-X.8!A9;$J-WRWV4NVG[:CX6+OO@?3*V*E@ end </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 Binary files differnew file mode 100644 index 000000000..01269bee2 --- /dev/null +++ b/samples/vnf_samples/traffic_profiles/acl/acl_ipv4_profile_1flows.ixncfg 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() |