diff options
author | Bindya Narayan <bindya.narayan@intel.com> | 2017-05-30 15:09:10 +0530 |
---|---|---|
committer | Bindya N <bindya.narayan@intel.com> | 2017-07-24 17:20:23 +0530 |
commit | 11a136fdbdc2a0440092a212ea21c58d50c39aad (patch) | |
tree | 2dc9e7509092ec98814327492142107778b56cd0 | |
parent | f32f0fe4bfb370d7336e890c0c12322d2be2d587 (diff) |
Setup OVS-DPDK Standalone Context
This patch performs following tasks
- getting dpdk_nic_bind path
- setup ovs,dpdk ports,vhostuserports,
- creation of vm,
- apache2 licence
- test cases for ovsdpdk
- Changes to standalone context - update unit test cases
Change-Id: I54e4062eb440b8677625e4abe6e0579d9fd54d41
Signed-off-by: Bindya N <bindya.narayan@intel.com>
-rw-r--r-- | samples/vnf_samples/nsut/ping/tc_ping_ovs_dpdk_context.yaml | 42 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/nodes_duplicate_sample_new.yaml | 86 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/nodes_duplicate_sample_ovs.yaml | 63 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/nodes_sample_new_sriov.yaml | 82 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/nodes_sample_ovs.yaml | 104 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/nodes_sample_ovsdpdk.yaml | 104 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/ovs_sample_password.yaml | 104 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/ovs_sample_ssh_key.yaml | 69 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/ovs_sample_write_to_file.txt | 1 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/test_ovsdpdk.py | 328 | ||||
-rw-r--r-- | tests/unit/benchmark/contexts/test_standalone.py | 462 | ||||
-rw-r--r-- | yardstick/benchmark/contexts/ovsdpdk.py | 369 | ||||
-rw-r--r-- | yardstick/benchmark/contexts/sriov.py | 3 | ||||
-rw-r--r-- | yardstick/benchmark/contexts/standalone.py | 50 |
14 files changed, 1727 insertions, 140 deletions
diff --git a/samples/vnf_samples/nsut/ping/tc_ping_ovs_dpdk_context.yaml b/samples/vnf_samples/nsut/ping/tc_ping_ovs_dpdk_context.yaml new file mode 100644 index 000000000..7654b0f96 --- /dev/null +++ b/samples/vnf_samples/nsut/ping/tc_ping_ovs_dpdk_context.yaml @@ -0,0 +1,42 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- +schema: "yardstick:task:0.1" + +scenarios: +- + type: NSPerf + traffic_profile: ../../traffic_profiles/fixed.yaml + topology: ping_tg_topology.yaml # TODO: look in relative path where the tc.yaml is found + + nodes: # This section is copied from pod.xml or resolved via Heat + tg__1: trafficgen_1.yardstick + vnf__1: vnf.yardstick + + vnf_options: + tg__1: + target_ip: pingvnf__1.xe0.local_ip # TODO: resolve to config vars + vnf__1: + target_ip: pinggen__1.xe1.local_ip # TODO: resolve to config vars + runner: + type: Duration + duration: 10 + +context: + type: Standalone + name: yardstick + nfvi_type: Ovsdpdk + vm_deploy: True + file: /etc/yardstick/nodes/pod_ovs.yaml diff --git a/tests/unit/benchmark/contexts/nodes_duplicate_sample_new.yaml b/tests/unit/benchmark/contexts/nodes_duplicate_sample_new.yaml index 48f4065a2..306915ca1 100644 --- a/tests/unit/benchmark/contexts/nodes_duplicate_sample_new.yaml +++ b/tests/unit/benchmark/contexts/nodes_duplicate_sample_new.yaml @@ -1,43 +1,7 @@ -# Copyright (c) 2016-2017 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - nodes: - - name: trafficgen_1 - role: TrafficGen - ip: 10.123.123.123 - user: root - auth_type: password - password: password - interfaces: - xe0: # logical name from topology.yaml and vnfd.yaml - vpci: "0000:03:00.0" - driver: ixgbe - dpdk_port_num: 0 - local_ip: "152.16.100.20" - netmask: "255.255.255.0" - local_mac: "00:00:00:00:00:00" - xe1: # logical name from topology.yaml and vnfd.yaml - vpci: "0000:03:00.1" - driver: ixgbe - dpdk_port_num: 1 - local_ip: "152.16.100.21" - netmask: "255.255.255.0" - local_mac: "00:00:00:00:00:00" -- name: sriov - role: Sriov + role: Sriov1 ip: 10.123.123.122 user: root auth_type: password @@ -50,10 +14,9 @@ nodes: - "0000:06:00.1" phy_driver: i40e # kernel driver images: "/var/lib/libvirt/images/ubuntu1.img" - - name: sriov - role: Sriov + role: Sriov1 ip: 10.123.123.111 user: root auth_type: password @@ -65,48 +28,5 @@ nodes: - "0000:06:00.0" - "0000:06:00.1" phy_driver: i40e # kernel driver - images: "/var/lib/libvirt/images/ubuntu1.img" - -- - name: vnf - role: vnf - ip: 10.123.123.121 - user: root - auth_type: password - password: password - host: 10.123.123.121 #BM host == ip, SRIOV & ovs-dpdk host == compute node. - interfaces: - xe0: # logical name from topology.yaml and vnfd.yaml - vpci: "0000:06:00.0" - driver: i40e - dpdk_port_num: 0 - local_ip: "152.16.100.19" - netmask: "255.255.255.0" - local_mac: "00:00:00:00:00:00" + images: "/var/lib/libvirt/images/ubuntu1.img" - xe1: # logical name from topology.yaml and vnfd.yaml - vpci: "0000:06:00.1" - driver: i40e - dpdk_port_num: 1 - local_ip: "152.16.40.19" - netmask: "255.255.255.0" - local_mac: "00:00:00:00:00:00" - routing_table: - - network: "152.16.100.20" - netmask: "255.255.255.0" - gateway: "152.16.100.20" - if: "xe0" - - network: "152.16.40.20" - netmask: "255.255.255.0" - gateway: "152.16.40.20" - if: "xe1" - nd_route_tbl: - - network: "0064:ff9b:0:0:0:0:9810:6414" - netmask: "112" - gateway: "0064:ff9b:0:0:0:0:9810:6414" - if: "xe0" - - network: "0064:ff9b:0:0:0:0:9810:2814" - netmask: "112" - gateway: "0064:ff9b:0:0:0:0:9810:2814" - if: "xe1" - diff --git a/tests/unit/benchmark/contexts/nodes_duplicate_sample_ovs.yaml b/tests/unit/benchmark/contexts/nodes_duplicate_sample_ovs.yaml new file mode 100644 index 000000000..65449c91c --- /dev/null +++ b/tests/unit/benchmark/contexts/nodes_duplicate_sample_ovs.yaml @@ -0,0 +1,63 @@ +# 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. +nodes: +- + name: ovs + role: test + ip: 10.223.197.222 + user: root + auth_type: password + password: intel123 + vpath: "/usr/local/" + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure ovs + - "0000:06:00.0" + - "0000:06:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu1.img" +- + name: ovs + role: test + ip: 10.223.197.112 + user: root + auth_type: password + password: intel123 + vpath: "/usr/local/" + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure ovs + - "0000:06:00.0" + - "0000:06:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu1.img" + diff --git a/tests/unit/benchmark/contexts/nodes_sample_new_sriov.yaml b/tests/unit/benchmark/contexts/nodes_sample_new_sriov.yaml new file mode 100644 index 000000000..55ff2e778 --- /dev/null +++ b/tests/unit/benchmark/contexts/nodes_sample_new_sriov.yaml @@ -0,0 +1,82 @@ +nodes: +- + name: trafficgen_1 + role: TrafficGen + ip: 10.123.123.123 + user: root + auth_type: password + password: password + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.0" + driver: ixgbe + dpdk_port_num: 0 + local_ip: "152.16.100.20" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:00" + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.1" + driver: ixgbe + dpdk_port_num: 1 + local_ip: "152.16.100.21" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:00" +- + name: sriov + role: Sriov1 + ip: 10.123.123.122 + user: root + auth_type: password + password: password + vf_macs: + - "00:00:00:00:00:00" + - "00:00:00:00:00:00" + phy_ports: # Physical ports to configure sriov + - "0000:06:00.0" + - "0000:06:00.1" + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu1.img" + +- + name: vnf + role: vnf + ip: 10.123.123.121 + user: root + auth_type: password + password: password + host: 10.123.123.121 #BM host == ip, SRIOV & ovs-dpdk host == compute node. + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:06:00.0" + driver: i40e + dpdk_port_num: 0 + local_ip: "152.16.100.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:00" + + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:06:00.1" + driver: i40e + dpdk_port_num: 1 + local_ip: "152.16.40.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:00" + routing_table: + - network: "152.16.100.20" + netmask: "255.255.255.0" + gateway: "152.16.100.20" + if: "xe0" + - network: "152.16.40.20" + netmask: "255.255.255.0" + gateway: "152.16.40.20" + if: "xe1" + nd_route_tbl: + - network: "0064:ff9b:0:0:0:0:9810:6414" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:6414" + if: "xe0" + - network: "0064:ff9b:0:0:0:0:9810:2814" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:2814" + if: "xe1" + diff --git a/tests/unit/benchmark/contexts/nodes_sample_ovs.yaml b/tests/unit/benchmark/contexts/nodes_sample_ovs.yaml new file mode 100644 index 000000000..b1da1ea9f --- /dev/null +++ b/tests/unit/benchmark/contexts/nodes_sample_ovs.yaml @@ -0,0 +1,104 @@ +# 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. + +nodes: +- + name: trafficgen_1 + role: TrafficGen + ip: 10.223.197.182 + user: root + auth_type: password + password: intel123 + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.0" + driver: ixgbe + dpdk_port_num: 0 + local_ip: "152.16.100.20" + netmask: "255.255.255.0" + local_mac: "90:e2:ba:77:ce:68" + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.1" + driver: ixgbe + dpdk_port_num: 1 + local_ip: "152.16.100.21" + netmask: "255.255.255.0" + local_mac: "90:e2:ba:77:ce:69" +- + name: ovs + role: Ovsdpdk + ip: 10.223.197.222 + user: root + auth_type: password + password: intel123 + vpath: "/usr/local/" + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure ovs + - "0000:06:00.0" + - "0000:06:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu1.img" + +- + name: vnf + role: vnf + ip: 10.223.197.155 + user: root + auth_type: password + password: intel123 + host: 10.223.197.140 + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:04.0" + driver: virtio-pci + dpdk_port_num: 0 + local_ip: "152.16.100.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:03" + + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:05.0" + driver: virtio-pci + dpdk_port_num: 1 + local_ip: "152.16.40.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:04" + routing_table: + - network: "152.16.100.20" + netmask: "255.255.255.0" + gateway: "152.16.100.20" + if: "xe0" + - network: "152.16.40.20" + netmask: "255.255.255.0" + gateway: "152.16.40.20" + if: "xe1" + nd_route_tbl: + - network: "0064:ff9b:0:0:0:0:9810:6414" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:6414" + if: "xe0" + - network: "0064:ff9b:0:0:0:0:9810:2814" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:2814" + if: "xe1" diff --git a/tests/unit/benchmark/contexts/nodes_sample_ovsdpdk.yaml b/tests/unit/benchmark/contexts/nodes_sample_ovsdpdk.yaml new file mode 100644 index 000000000..c02849a05 --- /dev/null +++ b/tests/unit/benchmark/contexts/nodes_sample_ovsdpdk.yaml @@ -0,0 +1,104 @@ +# 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. + +nodes: +- + name: trafficgen_1 + role: TrafficGen + ip: 10.223.197.182 + user: root + auth_type: password + password: intel123 + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.0" + driver: ixgbe + dpdk_port_num: 0 + local_ip: "152.16.100.20" + netmask: "255.255.255.0" + local_mac: "90:e2:ba:77:ce:68" + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.1" + driver: ixgbe + dpdk_port_num: 1 + local_ip: "152.16.100.21" + netmask: "255.255.255.0" + local_mac: "90:e2:ba:77:ce:69" +- + name: ovs + role: Ovsdpdk1 + ip: 10.223.197.222 + user: root + auth_type: password + password: intel123 + vpath: "/usr/local/" + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure ovs + - "0000:06:00.0" + - "0000:06:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu1.img" + +- + name: vnf + role: vnf + ip: 10.223.197.155 + user: root + auth_type: password + password: intel123 + host: 10.223.197.140 + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:04.0" + driver: virtio-pci + dpdk_port_num: 0 + local_ip: "152.16.100.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:03" + + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:05.0" + driver: virtio-pci + dpdk_port_num: 1 + local_ip: "152.16.40.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:04" + routing_table: + - network: "152.16.100.20" + netmask: "255.255.255.0" + gateway: "152.16.100.20" + if: "xe0" + - network: "152.16.40.20" + netmask: "255.255.255.0" + gateway: "152.16.40.20" + if: "xe1" + nd_route_tbl: + - network: "0064:ff9b:0:0:0:0:9810:6414" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:6414" + if: "xe0" + - network: "0064:ff9b:0:0:0:0:9810:2814" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:2814" + if: "xe1" diff --git a/tests/unit/benchmark/contexts/ovs_sample_password.yaml b/tests/unit/benchmark/contexts/ovs_sample_password.yaml new file mode 100644 index 000000000..b1da1ea9f --- /dev/null +++ b/tests/unit/benchmark/contexts/ovs_sample_password.yaml @@ -0,0 +1,104 @@ +# 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. + +nodes: +- + name: trafficgen_1 + role: TrafficGen + ip: 10.223.197.182 + user: root + auth_type: password + password: intel123 + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.0" + driver: ixgbe + dpdk_port_num: 0 + local_ip: "152.16.100.20" + netmask: "255.255.255.0" + local_mac: "90:e2:ba:77:ce:68" + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.1" + driver: ixgbe + dpdk_port_num: 1 + local_ip: "152.16.100.21" + netmask: "255.255.255.0" + local_mac: "90:e2:ba:77:ce:69" +- + name: ovs + role: Ovsdpdk + ip: 10.223.197.222 + user: root + auth_type: password + password: intel123 + vpath: "/usr/local/" + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure ovs + - "0000:06:00.0" + - "0000:06:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu1.img" + +- + name: vnf + role: vnf + ip: 10.223.197.155 + user: root + auth_type: password + password: intel123 + host: 10.223.197.140 + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:04.0" + driver: virtio-pci + dpdk_port_num: 0 + local_ip: "152.16.100.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:03" + + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:00:05.0" + driver: virtio-pci + dpdk_port_num: 1 + local_ip: "152.16.40.19" + netmask: "255.255.255.0" + local_mac: "00:00:00:00:00:04" + routing_table: + - network: "152.16.100.20" + netmask: "255.255.255.0" + gateway: "152.16.100.20" + if: "xe0" + - network: "152.16.40.20" + netmask: "255.255.255.0" + gateway: "152.16.40.20" + if: "xe1" + nd_route_tbl: + - network: "0064:ff9b:0:0:0:0:9810:6414" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:6414" + if: "xe0" + - network: "0064:ff9b:0:0:0:0:9810:2814" + netmask: "112" + gateway: "0064:ff9b:0:0:0:0:9810:2814" + if: "xe1" diff --git a/tests/unit/benchmark/contexts/ovs_sample_ssh_key.yaml b/tests/unit/benchmark/contexts/ovs_sample_ssh_key.yaml new file mode 100644 index 000000000..896ec33bb --- /dev/null +++ b/tests/unit/benchmark/contexts/ovs_sample_ssh_key.yaml @@ -0,0 +1,69 @@ +############################################################################## +# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- +# Sample config file about the POD information, including the +# name/IP/user/ssh key of Bare Metal and Controllers/Computes +# +# The options of this config file include: +# name: the name of this node +# role: node's role, support role: Master/Controller/Comupte/BareMetal +# ip: the node's IP address +# user: the username for login +# key_filename:the path of the private key file for login + +nodes: +- + name: trafficgen_1 + role: TrafficGen + ip: 10.10.10.10 + auth_type: ssh_key + user: root + ssh_port: 22 + key_filename: /root/.ssh/id_rsa + interfaces: + xe0: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.0" + driver: ixgbe + dpdk_port_num: 0 + local_ip: "152.16.100.20" + netmask: "255.255.255.0" + local_mac: "90:e2:ba:77:ce:68" + xe1: # logical name from topology.yaml and vnfd.yaml + vpci: "0000:03:00.1" + driver: ixgbe + dpdk_port_num: 1 + local_ip: "152.16.100.21" + netmask: "255.255.255.0" + local_mac: "90:e2:ba:77:ce:69" +- + name: ovs + role: Ovsdpdk + ip: 10.223.197.222 + auth_type: ssh_key + user: root + ssh_port: 22 + key_filename: /root/.ssh/id_rsa + vpath: "/usr/local/" + vports: + - dpdkvhostuser0 + - dpdkvhostuser1 + vports_mac: + - "00:00:00:00:00:03" + - "00:00:00:00:00:04" + phy_ports: # Physical ports to configure ovs + - "0000:06:00.0" + - "0000:06:00.1" + flow: + - ovs-ofctl add-flow br0 in_port=1,action=output:3 + - ovs-ofctl add-flow br0 in_port=3,action=output:1 + - ovs-ofctl add-flow br0 in_port=4,action=output:2 + - ovs-ofctl add-flow br0 in_port=2,action=output:4 + phy_driver: i40e # kernel driver + images: "/var/lib/libvirt/images/ubuntu1.img" + diff --git a/tests/unit/benchmark/contexts/ovs_sample_write_to_file.txt b/tests/unit/benchmark/contexts/ovs_sample_write_to_file.txt new file mode 100644 index 000000000..f0eec86f6 --- /dev/null +++ b/tests/unit/benchmark/contexts/ovs_sample_write_to_file.txt @@ -0,0 +1 @@ +some content
\ No newline at end of file diff --git a/tests/unit/benchmark/contexts/test_ovsdpdk.py b/tests/unit/benchmark/contexts/test_ovsdpdk.py new file mode 100644 index 000000000..125e475af --- /dev/null +++ b/tests/unit/benchmark/contexts/test_ovsdpdk.py @@ -0,0 +1,328 @@ +# Copyright (c) 2016-2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +import os +import mock +import unittest + +from yardstick.benchmark.contexts import ovsdpdk +from yardstick.benchmark.contexts.ovsdpdk import Ovsdpdk + +NIC_INPUT = { + 'interface': {}, + 'vports_mac': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], + 'pci': ['0000:06:00.0', '0000:06:00.1'], + 'phy_driver': 'i40e'} +DRIVER = "i40e" +NIC_DETAILS = { + 'interface': {0: 'enp6s0f0', 1: 'enp6s0f1'}, + 'vports_mac': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], + 'pci': ['0000:06:00.0', '0000:06:00.1'], + 'phy_driver': 'i40e'} + +CORRECT_FILE_PATH = "/etc/yardstick/nodes/pod_ovs.yaml" +WRONG_FILE_PATH = "/etc/yardstick/wrong.yaml" +SAMPLE_FILE = "ovs_sample_write_to_file.txt" + +OVS = [{ + 'auth_type': 'ssh_key', + 'name': 'ovs', + 'ssh_port': 22, + 'ip': '10.10.10.11', + 'key_filename': '/root/.ssh/id_rsa', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'vpath': '/usr/local/', + 'role': 'Ovsdpdk', + 'user': 'root', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'flow': ['ovs-ofctl add-flow br0 in_port=1,action=output:3', + 'ovs-ofctl add-flow br0 in_port=3,action=output:1', + 'ovs-ofctl add-flow br0 in_port=4,action=output:2', + 'ovs-ofctl add-flow br0 in_port=2,action=output:4'], + 'phy_driver': 'i40e', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + +OVS_PASSWORD = [{ + 'auth_type': 'password', + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.10.10.11', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'flow': ['ovs-ofctl add-flow br0 in_port=1,action=output:3', + 'ovs-ofctl add-flow br0 in_port=3,action=output:1', + 'ovs-ofctl add-flow br0 in_port=4,action=output:2', + 'ovs-ofctl add-flow br0 in_port=2,action=output:4'], + 'phy_driver': 'i40e', + 'password': 'password', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + +#vfnic = "i40evf" +PCIS = ['0000:06:00.0', '0000:06:00.1'] + + +class OvsdpdkTestCase(unittest.TestCase): + + NODES_SAMPLE_SSH = "ovs_sample_ssh_key.yaml" + NODES_SAMPLE_PASSWORD = "ovs_sample_password.yaml" + + def setUp(self): + self.test_context = ovsdpdk.Ovsdpdk() + + def test_construct(self): + self.assertIsNone(self.test_context.name) + self.assertIsNone(self.test_context.file_path) + self.assertEqual(self.test_context.nodes, []) + self.assertEqual(self.test_context.ovs, []) + self.assertFalse(self.test_context.vm_deploy) + self.assertTrue(self.test_context.first_run) + self.assertEqual(self.test_context.user, "") + self.assertEqual(self.test_context.ssh_ip, "") + self.assertEqual(self.test_context.passwd, "") + self.assertEqual(self.test_context.ssh_port, "") + self.assertEqual(self.test_context.auth_type, "") + + def test_init(self): + self.test_context.parse_pod_and_get_data = mock.Mock() + self.test_context.file_path = CORRECT_FILE_PATH + self.test_context.init() + self.assertIsNone(self.test_context.init()) + + def test_successful_init_with_ssh(self): + CORRECT_FILE_PATH = self._get_file_abspath(self.NODES_SAMPLE_SSH) + self.test_context.parse_pod_and_get_data(CORRECT_FILE_PATH) + + def test_successful_init_with_password(self): + CORRECT_FILE_PATH = self._get_file_abspath(self.NODES_SAMPLE_PASSWORD) + self.test_context.parse_pod_and_get_data(CORRECT_FILE_PATH) + + def test_unsuccessful_init(self): + self.assertRaises( + IOError, + lambda: self.test_context.parse_pod_and_get_data(WRONG_FILE_PATH)) + + def test_ssh_connection(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + + @mock.patch('yardstick.network_services.utils.provision_tool', return_value="b") + def test_ssh_connection(self, mock_prov): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, "b", "")) + ssh.return_value = ssh_mock + mock_prov.provision_tool = mock.Mock() + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS_PASSWORD + self.assertIsNone(ovs_obj.ssh_remote_machine()) + + @mock.patch('yardstick.network_services.utils.provision_tool', return_value="b") + def test_ssh_connection_ssh_key(self, mock_prov): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(1, "b", "")) + ssh.return_value = ssh_mock + mock_prov.provision_tool = mock.Mock() + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS + ovs_obj.key_filename = '/root/.ssh/id_rsa' + self.assertIsNone(ovs_obj.ssh_remote_machine()) + + def test_get_nic_details(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "eth0 eth1", "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.ovs = OVS + ovs_obj.connection = ssh_mock + self.assertIsNotNone(ovs_obj.get_nic_details()) + + def test_install_req_libs(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.first_run = True + ovs_obj.connection = ssh_mock + self.assertIsNone(ovs_obj.install_req_libs()) + + def test_setup_ovs(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS + self.assertIsNone(ovs_obj.setup_ovs({"eth0 eth1"})) + + def test_start_ovs_serverswitch(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS + self.assertIsNone(ovs_obj.start_ovs_serverswitch()) + + def test_setup_ovs_bridge(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS + self.assertIsNone(ovs_obj.setup_ovs_bridge()) + + def test_add_oflows(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS + self.assertIsNone(ovs_obj.add_oflows()) + + def test_setup_ovs_context_vm_already_present(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS + mock_ovs = mock.Mock() + ssh_mock.put = mock.Mock() + ovs_obj.check_output = mock.Mock(return_value=(0, "vm1")) + self.assertIsNone(ovs_obj.setup_ovs_context( + PCIS, + NIC_DETAILS, + DRIVER)) + + @mock.patch( + 'yardstick.benchmark.contexts.ovsdpdk', + return_value="Domain vm1 created from /tmp/vm_ovs.xml") + def test_is_vm_created(self, NIC_INPUT): + 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.put = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + mock_ovs = mock.Mock() + ret_create = mock.Mock() + pcis = NIC_DETAILS['pci'] + driver = NIC_DETAILS['phy_driver'] + self.assertIsNotNone( + mock_ovs.ovs_obj.setup_ovs_context( + pcis, + NIC_DETAILS, + driver)) + + def test_check_output(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + cmd = "command" + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + self.assertIsNotNone(ovs_obj.check_output(cmd, None)) + + def test_split_cpu_list_available(self): + with mock.patch("itertools.chain") as iter1: + iter1 = mock.Mock() + print("{0}".format(iter1)) + ovs_obj = ovsdpdk.Ovsdpdk() + self.assertIsNotNone(ovs_obj.split_cpu_list('0,5')) + + def test_split_cpu_list_null(self): + with mock.patch("itertools.chain") as iter1: + iter1 = mock.Mock() + print("{0}".format(iter1)) + ovs_obj = ovsdpdk.Ovsdpdk() + self.assertEqual(ovs_obj.split_cpu_list([]), []) + + def test_destroy_vm_successful(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS + ovs_obj.check_output = mock.Mock(return_value=(0, "vm1")) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "0 i40e")) + ssh_mock.execute = \ + mock.Mock(return_value=(0, "0 i40e")) + self.assertIsNone(ovs_obj.destroy_vm()) + + def test_destroy_vm_unsuccessful(self): + with mock.patch("yardstick.ssh.SSH") as ssh: + ssh_mock = mock.Mock(autospec=ssh.SSH) + ssh_mock.execute = \ + mock.Mock(return_value=(0, {}, "")) + ssh.return_value = ssh_mock + ovs_obj = ovsdpdk.Ovsdpdk() + ovs_obj.connection = ssh_mock + ovs_obj.ovs = OVS + ovs_obj.check_output = mock.Mock(return_value=(1, {})) + self.assertIsNone(ovs_obj.destroy_vm()) + + def test_read_from_file(self): + CORRECT_FILE_PATH = self._get_file_abspath(self.NODES_SAMPLE_PASSWORD) + ovs_obj = ovsdpdk.Ovsdpdk() + self.assertIsNotNone(ovs_obj.read_from_file(CORRECT_FILE_PATH)) + + def test_write_to_file(self): + ovs_obj = ovsdpdk.Ovsdpdk() + self.assertIsNone(ovs_obj.write_to_file(SAMPLE_FILE, "some content")) + + 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 + +if __name__ == '__main__': + unittest.main() diff --git a/tests/unit/benchmark/contexts/test_standalone.py b/tests/unit/benchmark/contexts/test_standalone.py index ee25bb33b..1fc740393 100644 --- a/tests/unit/benchmark/contexts/test_standalone.py +++ b/tests/unit/benchmark/contexts/test_standalone.py @@ -21,81 +21,138 @@ from __future__ import absolute_import import os import unittest import mock + from yardstick.benchmark.contexts import standalone from yardstick.benchmark.contexts import sriov +from yardstick.benchmark.contexts import ovsdpdk MOCKS = { 'yardstick.benchmark.contexts': mock.MagicMock(), 'yardstick.benchmark.contexts.sriov': mock.MagicMock(), + 'yardstick.benchmark.contexts.ovsdpdk': mock.MagicMock(), 'yardstick.benchmark.contexts.standalone': mock.MagicMock(), } +@mock.patch('yardstick.benchmark.contexts.ovsdpdk.time') +@mock.patch('yardstick.benchmark.contexts.standalone.time') +@mock.patch('yardstick.benchmark.contexts.sriov.time') class StandaloneContextTestCase(unittest.TestCase): - NODES_SAMPLE = "nodes_sample_new.yaml" + NODES_SAMPLE_SRIOV = "nodes_sample_new_sriov.yaml" NODES_DUPLICATE_SAMPLE = "nodes_duplicate_sample_new.yaml" + NODES_SAMPLE_OVSDPDK = "nodes_sample_ovs.yaml" + NODES_SAMPLE_OVSDPDK_ROLE = "nodes_sample_ovsdpdk.yaml" + NODES_DUPLICATE_OVSDPDK = "nodes_duplicate_sample_ovs.yaml" + def setUp(self): self.test_context = standalone.StandaloneContext() - def test_construct(self): + def test_construct(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): self.assertIsNone(self.test_context.name) self.assertIsNone(self.test_context.file_path) self.assertEqual(self.test_context.nodes, []) self.assertEqual(self.test_context.nfvi_node, []) - def test_unsuccessful_init(self): + def test_unsuccessful_init(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): attrs = { 'name': 'foo', 'file': self._get_file_abspath("error_file") } self.assertRaises(IOError, self.test_context.init, attrs) - def test_successful_init(self): - attrs = { + def test_successful_init_sriov(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): + attrs_sriov = { 'name': 'sriov', 'file': self._get_file_abspath(self.NODES_SAMPLE) } - self.test_context.nfvi_node = [{ 'name': 'sriov', 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], - 'ip': '10.123.123.122', + 'ip': '10.223.197.140', 'role': 'Sriov', 'user': 'root', 'images': '/var/lib/libvirt/images/ubuntu1.img', 'phy_driver': 'i40e', - 'password': 'password', + 'password': 'intel123', 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] self.test_context.get_nfvi_obj = mock.Mock() - self.test_context.init(attrs) + self.test_context.init(attrs_sriov) self.assertEqual(self.test_context.name, "sriov") - self.assertEqual(len(self.test_context.nodes), 3) + self.assertEqual(len(self.test_context.nodes), 2) self.assertEqual(len(self.test_context.nfvi_node), 2) self.assertEqual(self.test_context.nfvi_node[0]["name"], "sriov") - def test__get_server_with_dic_attr_name(self): - attrs = { + def test_successful_init_ovs(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): + attrs_ovs = { + 'name': 'ovs', + 'file': self._get_file_abspath(self.NODES_SAMPLE_OVSDPDK) + } + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'password', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + self.test_context.get_nfvi_obj = mock.Mock() + self.test_context.init(attrs_ovs) + self.assertEqual(self.test_context.name, "ovs") + self.assertEqual(len(self.test_context.nodes), 2) + self.assertEqual(len(self.test_context.nfvi_node), 2) + self.assertEqual(self.test_context.nfvi_node[0]["name"], "ovs") + + def test__get_server_with_dic_attr_name_sriov(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): + attrs_sriov = { 'name': 'foo', 'file': self._get_file_abspath(self.NODES_SAMPLE) } self.test_context.nfvi_node = [{ 'name': 'sriov', 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], - 'ip': '10.123.123.122', + 'ip': '10.223.197.140', 'role': 'Sriov', 'user': 'root', 'images': '/var/lib/libvirt/images/ubuntu1.img', 'phy_driver': 'i40e', - 'password': 'password', + 'password': 'intel123', 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] - self.test_context.init(attrs) + self.test_context.init(attrs_sriov) attr_name = {'name': 'foo.bar'} result = self.test_context._get_server(attr_name) self.assertEqual(result, None) - def test__get_server_not_found(self): + def test__get_server_with_dic_attr_name_ovs(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): + attrs_ovs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE_OVSDPDK) + } + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'intel123', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + self.test_context.init(attrs_ovs) + attr_name = {'name': 'foo.bar'} + result = self.test_context._get_server(attr_name) + self.assertEqual(result, None) + + def test__get_server_not_found_sriov(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): attrs = { 'name': 'foo', 'file': self._get_file_abspath(self.NODES_SAMPLE) @@ -103,7 +160,7 @@ class StandaloneContextTestCase(unittest.TestCase): self.test_context.nfvi_node = [{ 'name': 'sriov', 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], - 'ip': '10.123.123.122', + 'ip': '10.223.197.140', 'role': 'Sriov', 'user': 'root', 'images': '/var/lib/libvirt/images/ubuntu1.img', @@ -115,7 +172,32 @@ class StandaloneContextTestCase(unittest.TestCase): result = self.test_context._get_server(attr_name) self.assertEqual(result, None) - def test__get_server_duplicate(self): + def test__get_server_not_found_ovs(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE_OVSDPDK) + } + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'password', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + self.test_context.init(attrs) + attr_name = 'bar.foo' + result = self.test_context._get_server(attr_name) + self.assertEqual(result, None) + + + + def test__get_server_duplicate_sriov(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): attrs = { 'name': 'foo', 'file': self._get_file_abspath(self.NODES_DUPLICATE_SAMPLE) @@ -123,62 +205,134 @@ class StandaloneContextTestCase(unittest.TestCase): self.test_context.nfvi_node = [{ 'name': 'sriov', 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], - 'ip': '10.123.123.122', + 'ip': '10.223.197.140', 'role': 'Sriov', 'user': 'root', 'images': '/var/lib/libvirt/images/ubuntu1.img', 'phy_driver': 'i40e', 'password': 'password', 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + self.test_context.get_nfvi_obj = mock.Mock(return_value="sriov") self.test_context.init(attrs) attr_name = 'sriov.foo' + # self.test_context.name = "sriov" + self.assertRaises(ValueError, self.test_context._get_server, attr_name) + + def test__get_server_duplicate_ovs(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_DUPLICATE_OVSDPDK) + } + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'intel123', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + self.test_context.get_nfvi_obj = mock.Mock(return_value="OvsDpdk") + self.test_context.init(attrs) + + attr_name = 'ovs.foo' self.assertRaises( ValueError, self.test_context._get_server, attr_name) - - def test__get_server_found(self): + def test__get_server_found_sriov(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): attrs = { - 'name': 'sriov', - 'file': self._get_file_abspath(self.NODES_SAMPLE) + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE_SRIOV) } self.test_context.nfvi_node = [{ 'name': 'sriov', 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], - 'ip': '10.123.123.122', + 'ip': '10.223.197.140', 'role': 'Sriov', 'user': 'root', 'images': '/var/lib/libvirt/images/ubuntu1.img', 'phy_driver': 'i40e', - 'password': 'password', + 'password': 'intel123', 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + self.test_context.get_nfvi_obj = mock.Mock(return_value="OvsDpdk") self.test_context.init(attrs) - attr_name = 'sriov.sriov' + attr_name = 'sriov.foo' result = self.test_context._get_server(attr_name) self.assertEqual(result['ip'], '10.123.123.122') - self.assertEqual(result['name'], 'sriov.sriov') + self.assertEqual(result['name'], 'sriov.foo') self.assertEqual(result['user'], 'root') - def test_deploy(self): + def test__get_server_found_ovs(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): attrs = { 'name': 'foo', - 'file': self._get_file_abspath(self.NODES_SAMPLE) + 'file': self._get_file_abspath(self.NODES_SAMPLE_OVSDPDK_ROLE) } + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'password', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + self.test_context.get_nfvi_obj = mock.Mock(return_value="OvsDpdk") + self.test_context.init(attrs) + attr_name = 'ovs.foo' + result = self.test_context._get_server(attr_name) + self.assertEqual(result['ip'], '10.223.197.222') + self.assertEqual(result['name'], 'ovs.foo') + self.assertEqual(result['user'], 'root') + def test__deploy_unsuccessful(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): + self.test_context.vm_deploy = False + + def test__deploy_sriov_firsttime(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE) + } self.test_context.nfvi_node = [{ 'name': 'sriov', 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], - 'ip': '10.123.123.122', + 'ip': '10.223.197.140', 'role': 'Sriov', 'user': 'root', 'images': '/var/lib/libvirt/images/ubuntu1.img', 'phy_driver': 'i40e', - 'password': 'password', + 'password': 'intel123', 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + MYSRIOV = [{ + 'name': 'sriov', + 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], + 'ip': '10.223.197.140', + 'role': 'Sriov', + 'user': 'root', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'intel123', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + self.test_context.vm_deploy = True + self.test_context.get_nfvi_obj = mock.MagicMock() self.test_context.init(attrs) + self.test_context.nfvi_obj.sriov = MYSRIOV self.test_context.nfvi_obj.ssh_remote_machine = mock.Mock() self.test_context.nfvi_obj.first_run = True + self.test_context.nfvi_obj.install_req_libs() self.test_context.nfvi_obj.get_nic_details = mock.Mock() PORTS = ['0000:06:00.0', '0000:06:00.1'] NIC_DETAILS = { @@ -194,27 +348,228 @@ class StandaloneContextTestCase(unittest.TestCase): print("{0}".format(result)) self.assertIsNone(self.test_context.deploy()) - def test_undeploy(self): + def test__deploy_sriov_notfirsttime(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): attrs = { 'name': 'foo', 'file': self._get_file_abspath(self.NODES_SAMPLE) } + self.test_context.nfvi_node = [{ 'name': 'sriov', 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], - 'ip': '10.123.123.122', + 'ip': '10.223.197.140', 'role': 'Sriov', 'user': 'root', 'images': '/var/lib/libvirt/images/ubuntu1.img', 'phy_driver': 'i40e', + 'password': 'intel123', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + MYSRIOV = [{ + 'name': 'sriov', + 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], + 'ip': '10.223.197.140', + 'role': 'Sriov', + 'user': 'root', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'intel123', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + self.test_context.vm_deploy = True + self.test_context.get_nfvi_obj = mock.MagicMock() + self.test_context.init(attrs) + self.test_context.nfvi_obj.sriov = MYSRIOV + self.test_context.nfvi_obj.ssh_remote_machine = mock.Mock() + self.test_context.nfvi_obj.first_run = False + self.test_context.nfvi_obj.get_nic_details = mock.Mock() + PORTS = ['0000:06:00.0', '0000:06:00.1'] + NIC_DETAILS = { + 'interface': {0: 'enp6s0f0', 1: 'enp6s0f1'}, + 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], + 'pci': ['0000:06:00.0', '0000:06:00.1'], + 'phy_driver': 'i40e'} + DRIVER = 'i40e' + result = self.test_context.nfvi_obj.setup_sriov_context( + PORTS, + NIC_DETAILS, + DRIVER) + print("{0}".format(result)) + self.assertIsNone(self.test_context.deploy()) + + def test__deploy_ovs_firsttime(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE_OVSDPDK) + } + + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'password', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + MYOVS = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', 'password': 'password', + 'flow': ['ovs-ofctl add-flow br0 in_port=1,action=output:3', + 'ovs-ofctl add-flow br0 in_port=3,action=output:1' + 'ovs-ofctl add-flow br0 in_port=4,action=output:2' + 'ovs-ofctl add-flow br0 in_port=2,action=output:4'], 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + self.test_context.vm_deploy = True + self.test_context.get_nfvi_obj = mock.MagicMock() + self.test_context.init(attrs) + self.test_context.ovs = MYOVS + self.test_context.nfvi_obj.ssh_remote_machine = mock.Mock() + self.test_context.nfvi_obj.first_run = True + self.test_context.nfvi_obj.install_req_libs() + self.test_context.nfvi_obj.get_nic_details = mock.Mock() + PORTS = ['0000:06:00.0', '0000:06:00.1'] + NIC_DETAILS = { + 'interface': {0: 'enp6s0f0', 1: 'enp6s0f1'}, + 'vports_mac': ['00:00:00:00:00:05', '00:00:00:00:00:06'], + 'pci': ['0000:06:00.0', '0000:06:00.1'], + 'phy_driver': 'i40e'} + DRIVER = 'i40e' + + self.test_context.nfvi_obj.setup_ovs = mock.Mock() + self.test_context.nfvi_obj.start_ovs_serverswitch = mock.Mock() + self.test_context.nfvi_obj.setup_ovs_bridge = mock.Mock() + self.test_context.nfvi_obj.add_oflows = mock.Mock() + + # self.test_context.nfvi_obj.setup_ovs(PORTS) + # self.test_context.nfvi_obj.start_ovs_serverswitch() + # self.test_context.nfvi_obj.setup_ovs_bridge() + # self.test_context.nfvi_obj.add_oflows() + + result = self.test_context.nfvi_obj.setup_ovs_context( + PORTS, + NIC_DETAILS, + DRIVER) + print("{0}".format(result)) + self.assertIsNone(self.test_context.deploy()) + + def test__deploy_ovs_notfirsttime(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE_OVSDPDK) + } + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'password', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + MYOVS = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'password', + 'flow': ['ovs-ofctl add-flow br0 in_port=1,action=output:3', + 'ovs-ofctl add-flow br0 in_port=3,action=output:1' + 'ovs-ofctl add-flow br0 in_port=4,action=output:2' + 'ovs-ofctl add-flow br0 in_port=2,action=output:4'], + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + + self.test_context.vm_deploy = True + self.test_context.get_nfvi_obj = mock.MagicMock() + self.test_context.init(attrs) + self.test_context.ovs = MYOVS + self.test_context.nfvi_obj.ssh_remote_machine = mock.Mock() + self.test_context.nfvi_obj.first_run = False + self.test_context.nfvi_obj.get_nic_details = mock.Mock() + PORTS = ['0000:06:00.0', '0000:06:00.1'] + NIC_DETAILS = { + 'interface': {0: 'enp6s0f0', 1: 'enp6s0f1'}, + 'vports_mac': ['00:00:00:00:00:05', '00:00:00:00:00:06'], + 'pci': ['0000:06:00.0', '0000:06:00.1'], + 'phy_driver': 'i40e'} + DRIVER = 'i40e' + + self.test_context.nfvi_obj.setup_ovs(PORTS) + self.test_context.nfvi_obj.start_ovs_serverswitch() + self.test_context.nfvi_obj.setup_ovs_bridge() + self.test_context.nfvi_obj.add_oflows() + + result = self.test_context.nfvi_obj.setup_ovs_context( + PORTS, + NIC_DETAILS, + DRIVER) + print("{0}".format(result)) + self.assertIsNone(self.test_context.deploy()) + + def test_undeploy_sriov(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE) + } + self.test_context.nfvi_node = [{ + 'name': 'sriov', + 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], + 'ip': '10.223.197.140', + 'role': 'Sriov', + 'user': 'root', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'intel123', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + self.test_context.get_nfvi_obj = mock.MagicMock() + self.test_context.init(attrs) + self.test_context.nfvi_obj.destroy_vm = mock.Mock() + self.assertIsNone(self.test_context.undeploy()) + + def test_undeploy_ovs(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): + attrs = { + 'name': 'foo', + 'file': self._get_file_abspath(self.NODES_SAMPLE_OVSDPDK) + } + + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'password', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + self.test_context.get_nfvi_obj = mock.MagicMock() self.test_context.init(attrs) self.test_context.nfvi_obj.destroy_vm = mock.Mock() self.assertIsNone(self.test_context.undeploy()) - def test_get_nfvi_obj(self): + def test_get_nfvi_obj_sriov(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): with mock.patch('yardstick.benchmark.contexts.sriov'): attrs = { 'name': 'sriov', @@ -226,12 +581,12 @@ class StandaloneContextTestCase(unittest.TestCase): self.test_context.nfvi_node = [{ 'name': 'sriov', 'vf_macs': ['00:00:00:71:7d:25', '00:00:00:71:7d:26'], - 'ip': '10.123.123.122', + 'ip': '10.223.197.140', 'role': 'Sriov', 'user': 'root', 'images': '/var/lib/libvirt/images/ubuntu1.img', 'phy_driver': 'i40e', - 'password': 'password', + 'password': 'intel123', 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] self.test_context.get_nfvi_obj = mock.MagicMock() self.test_context.init(attrs) @@ -239,11 +594,39 @@ class StandaloneContextTestCase(unittest.TestCase): return_value=sriov.Sriov) self.assertIsNotNone(self.test_context.get_nfvi_obj()) - def test_get_context_impl_correct_obj(self): + def test_get_nfvi_obj_ovs(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): + with mock.patch('yardstick.benchmark.contexts.ovsdpdk'): + attrs = { + 'name': 'ovs', + 'file': self._get_file_abspath(self.NODES_SAMPLE_OVSDPDK) + } + self.test_context.init(attrs) + self.test_context.nfvi_obj.file_path = self._get_file_abspath( + self.NODES_SAMPLE) + self.test_context.nfvi_node = [{ + 'name': 'ovs', + 'vports_mac': ['00:00:00:00:00:03', '00:00:00:00:00:04'], + 'ip': '10.223.197.140', + 'role': 'Ovsdpdk', + 'user': 'root', + 'vpath': '/usr/local/', + 'images': '/var/lib/libvirt/images/ubuntu1.img', + 'phy_driver': 'i40e', + 'password': 'password', + 'phy_ports': ['0000:06:00.0', '0000:06:00.1']}] + self.test_context.get_nfvi_obj = mock.MagicMock() + self.test_context.init(attrs) + self.test_context.get_context_impl = mock.Mock( + return_value=ovsdpdk.Ovsdpdk) + self.assertIsNotNone(self.test_context.get_nfvi_obj()) + + def test_get_context_impl_correct_obj(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): with mock.patch.dict("sys.modules", MOCKS): self.assertIsNotNone(self.test_context.get_context_impl('Sriov')) - def test_get_context_impl_wrong_obj(self): + def test_get_context_impl_wrong_obj(self, mock_sriov_time, mock_standlalone_time, + mock_ovsdpdk_time): with mock.patch.dict("sys.modules", MOCKS): self.assertRaises( ValueError, @@ -254,7 +637,7 @@ class StandaloneContextTestCase(unittest.TestCase): file_path = os.path.join(curr_path, filename) return file_path - def test__get_network(self): + def test__get_network(self, mock_sriov_time, mock_standlalone_time, mock_ovsdpdk_time): network1 = { 'name': 'net_1', 'vld_id': 'vld111', @@ -300,3 +683,4 @@ class StandaloneContextTestCase(unittest.TestCase): self.assertDictEqual(result, expected) if __name__ == '__main__': unittest.main() + diff --git a/yardstick/benchmark/contexts/ovsdpdk.py b/yardstick/benchmark/contexts/ovsdpdk.py new file mode 100644 index 000000000..86610305e --- /dev/null +++ b/yardstick/benchmark/contexts/ovsdpdk.py @@ -0,0 +1,369 @@ +# 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 yaml +import time +import glob +import itertools +import logging +from yardstick import ssh +from yardstick.benchmark.contexts.standalone import StandaloneContext + +BIN_PATH = "/opt/isb_bin/" +DPDK_NIC_BIND = "dpdk_nic_bind.py" + +log = logging.getLogger(__name__) + +VM_TEMPLATE = """ +<domain type='kvm'> + <name>vm1</name> + <uuid>18230c0c-635d-4c50-b2dc-a213d30acb34</uuid> + <memory unit='KiB'>20971520</memory> + <currentMemory unit="KiB">20971520</currentMemory> + <memoryBacking> + <hugepages/> + </memoryBacking> + <vcpu placement='static'>20</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <features> + <acpi/> + <apic/> + </features> + <cpu match="exact" mode='host-model'> + <model fallback='allow'/> + <topology sockets='1' cores='10' threads='2'/> + </cpu> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2' cache='none'/> + <source file="{vm_image}"/> + <target dev='vda' bus='virtio'/> + <address bus="0x00" domain="0x0000" + function="0x0" slot="0x04" type="pci" /> + </disk> + <!--disk type='dir' device='disk'> + <driver name='qemu' type='fat'/> + <source dir='/opt/isb_bin/dpdk'/> + <target dev='vdb' bus='virtio'/> + <readonly/> + </disk--> + <interface type="bridge"> + <mac address="00:00:00:ab:cd:ef" /> + <source bridge="br-int" /> + </interface> + <interface type='vhostuser'> + <mac address='00:00:00:00:00:01'/> + <source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser0' mode='client'/> + <model type='virtio'/> + <driver queues='4'> + <host mrg_rxbuf='off'/> + </driver> + </interface> + <interface type='vhostuser'> + <mac address='00:00:00:00:00:02'/> + <source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser1' mode='client'/> + <model type='virtio'/> + <driver queues='4'> + <host mrg_rxbuf='off'/> + </driver> + </interface> + <serial type='pty'> + <target port='0'/> + </serial> + <console type='pty'> + <target type='serial' port='0'/> + </console> + <graphics autoport="yes" listen="0.0.0.0" port="1" type="vnc" /> + </devices> +</domain> +""" + + +class Ovsdpdk(StandaloneContext): + def __init__(self): + self.name = None + self.file_path = None + self.nodes = [] + self.vm_deploy = False + self.ovs = [] + self.first_run = True + self.dpdk_nic_bind = BIN_PATH + DPDK_NIC_BIND + self.user = "" + self.ssh_ip = "" + self.passwd = "" + self.ssh_port = "" + self.auth_type = "" + + def init(self): + '''initializes itself''' + log.debug("In init") + self.parse_pod_and_get_data() + + def parse_pod_and_get_data(self, file_path): + self.file_path = file_path + print("parsing pod file: {0}".format(self.file_path)) + try: + with open(self.file_path) as stream: + cfg = yaml.load(stream) + except IOError: + print("File {0} does not exist".format(self.file_path)) + raise + + self.ovs.extend([node for node in cfg["nodes"] + if node["role"] == "Ovsdpdk"]) + self.user = self.ovs[0]['user'] + self.ssh_ip = self.ovs[0]['ip'] + if self.ovs[0]['auth_type'] == "password": + self.passwd = self.ovs[0]['password'] + else: + self.ssh_port = self.ovs[0]['ssh_port'] + self.key_filename = self.ovs[0]['key_filename'] + + def ssh_remote_machine(self): + if self.ovs[0]['auth_type'] == "password": + self.connection = ssh.SSH( + self.user, + self.ssh_ip, + password=self.passwd) + self.connection.wait() + else: + if self.ssh_port is not None: + ssh_port = self.ssh_port + else: + ssh_port = ssh.DEFAULT_PORT + self.connection = ssh.SSH( + self.user, + self.ssh_ip, + port=ssh_port, + key_filename=self.key_filename) + self.connection.wait() + + def get_nic_details(self): + nic_details = {} + nic_details['interface'] = {} + nic_details['pci'] = self.ovs[0]['phy_ports'] + nic_details['phy_driver'] = self.ovs[0]['phy_driver'] + nic_details['vports_mac'] = self.ovs[0]['vports_mac'] + # Make sure that ports are bound to kernel drivers e.g. i40e/ixgbe + for i, _ in enumerate(nic_details['pci']): + err, out, _ = self.connection.execute( + "{dpdk_nic_bind} --force -b {driver} {port}".format( + dpdk_nic_bind=self.dpdk_nic_bind, + driver=self.ovs[0]['phy_driver'], + port=self.ovs[0]['phy_ports'][i])) + err, out, _ = self.connection.execute( + "lshw -c network -businfo | grep '{port}'".format( + port=self.ovs[0]['phy_ports'][i])) + a = out.split()[1] + err, out, _ = self.connection.execute( + "ip -s link show {interface}".format( + interface=out.split()[1])) + nic_details['interface'][i] = str(a) + print("{0}".format(nic_details)) + return nic_details + + def install_req_libs(self): + if self.first_run: + err, out, _ = self.connection.execute("apt-get update") + print("{0}".format(out)) + err, out, _ = self.connection.execute( + "apt-get -y install qemu-kvm libvirt-bin") + print("{0}".format(out)) + err, out, _ = self.connection.execute( + "apt-get -y install libvirt-dev bridge-utils numactl") + print("{0}".format(out)) + self.first_run = False + + def setup_ovs(self, vpcis): + self.connection.execute("/usr/bin/chmod 0666 /dev/vfio/*") + self.connection.execute("/usr/bin/chmod a+x /dev/vfio") + self.connection.execute("pkill -9 ovs") + self.connection.execute("ps -ef | grep ovs | grep -v grep | " + "awk '{print $2}' | xargs -r kill -9") + self.connection.execute("killall -r 'ovs*'") + self.connection.execute( + "mkdir -p {0}/etc/openvswitch".format(self.ovs[0]["vpath"])) + self.connection.execute( + "mkdir -p {0}/var/run/openvswitch".format(self.ovs[0]["vpath"])) + self.connection.execute( + "rm {0}/etc/openvswitch/conf.db".format(self.ovs[0]["vpath"])) + self.connection.execute( + "ovsdb-tool create {0}/etc/openvswitch/conf.db " + "{0}/share/openvswitch/" + "vswitch.ovsschema".format(self.ovs[0]["vpath"])) + self.connection.execute("modprobe vfio-pci") + self.connection.execute("chmod a+x /dev/vfio") + self.connection.execute("chmod 0666 /dev/vfio/*") + for vpci in vpcis: + self.connection.execute( + "/opt/isb_bin/dpdk_nic_bind.py " + "--bind=vfio-pci {0}".format(vpci)) + + def start_ovs_serverswitch(self): + self.connection.execute("mkdir -p /usr/local/var/run/openvswitch") + self.connection.execute( + "ovsdb-server --remote=punix:" + "/usr/local/var/run/openvswitch/db.sock --pidfile --detach") + self.connection.execute( + "ovs-vsctl --no-wait set " + "Open_vSwitch . other_config:dpdk-init=true") + self.connection.execute( + "ovs-vsctl --no-wait set " + "Open_vSwitch . other_config:dpdk-lcore-mask=0x3") + self.connection.execute( + "ovs-vsctl --no-wait set " + "Open_vSwitch . other_config:dpdk-socket-mem='2048,0'") + self.connection.execute( + "ovs-vswitchd unix:{0}/" + "var/run/openvswitch/db.sock --pidfile --detach " + "--log-file=/var/log/openvswitch/" + "ovs-vswitchd.log".format( + self.ovs[0]["vpath"])) + self.connection.execute( + "ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=2C") + + def setup_ovs_bridge(self): + self.connection.execute("ovs-vsctl del-br br0") + self.connection.execute( + "rm -rf /usr/local/var/run/openvswitch/dpdkvhostuser*") + self.connection.execute( + "ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev") + self.connection.execute( + "ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk") + self.connection.execute( + "ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk") + self.connection.execute( + "ovs-vsctl add-port br0 dpdkvhostuser0 -- set Interface " + "dpdkvhostuser0 type=dpdkvhostuser") + self.connection.execute("ovs-vsctl add-port br0 dpdkvhostuser1 " + "-- set Interface dpdkvhostuser1 " + "type=dpdkvhostuser") + self.connection.execute( + "chmod 0777 {0}/var/run/" + "openvswitch/dpdkvhostuser*".format(self.ovs[0]["vpath"])) + + def add_oflows(self): + self.connection.execute("ovs-ofctl del-flows br0") + for flow in self.ovs[0]["flow"]: + self.connection.execute(flow) + self.connection.execute("ovs-ofctl dump-flows br0") + self.connection.execute( + "ovs-vsctl set Interface dpdk0 options:n_rxq=4") + self.connection.execute( + "ovs-vsctl set Interface dpdk1 options:n_rxq=4") + + def setup_ovs_context(self, pcis, nic_details, host_driver): + + ''' 1: Setup vm_ovs.xml to launch VM.''' + cfg_ovs = '/tmp/vm_ovs.xml' + vm_ovs_xml = VM_TEMPLATE.format(vm_image=self.ovs[0]["images"]) + with open(cfg_ovs, 'w') as f: + f.write(vm_ovs_xml) + + ''' 2: Create and start the VM''' + self.connection.put(cfg_ovs, cfg_ovs) + time.sleep(10) + err, out = self.check_output("virsh list --name | grep -i vm1") + if out == "vm1": + print("VM is already present") + else: + ''' FIXME: launch through libvirt''' + print("virsh create ...") + err, out, _ = self.connection.execute( + "virsh create /tmp/vm_ovs.xml") + time.sleep(10) + print("err : {0}".format(err)) + print("{0}".format(_)) + print("out : {0}".format(out)) + + ''' 3: Tuning for better performace.''' + self.pin_vcpu(pcis) + self.connection.execute( + "echo 1 > /sys/module/kvm/parameters/" + "allow_unsafe_assigned_interrupts") + self.connection.execute( + "echo never > /sys/kernel/mm/transparent_hugepage/enabled") + print("After tuning performance ...") + + ''' This is roughly compatible with check_output function in subprocess + module which is only available in python 2.7.''' + def check_output(self, cmd, stderr=None): + '''Run a command and capture its output''' + err, out, _ = self.connection.execute(cmd) + return err, out + + def read_from_file(self, filename): + data = "" + with open(filename, 'r') as the_file: + data = the_file.read() + return data + + def write_to_file(self, filename, content): + with open(filename, 'w') as the_file: + the_file.write(content) + + def pin_vcpu(self, pcis): + nodes = self.get_numa_nodes() + print("{0}".format(nodes)) + num_nodes = len(nodes) + for i in range(0, 10): + self.connection.execute( + "virsh vcpupin vm1 {0} {1}".format( + i, nodes[str(num_nodes - 1)][i])) + + def get_numa_nodes(self): + nodes_sysfs = glob.iglob("/sys/devices/system/node/node*") + nodes = {} + for node_sysfs in nodes_sysfs: + num = os.path.basename(node_sysfs).replace("node", "") + with open(os.path.join(node_sysfs, "cpulist")) as cpulist_file: + cpulist = cpulist_file.read().strip() + print("cpulist: {0}".format(cpulist)) + nodes[num] = self.split_cpu_list(cpulist) + print("nodes: {0}".format(nodes)) + return nodes + + def split_cpu_list(self, cpu_list): + if cpu_list: + ranges = cpu_list.split(',') + bounds = ([int(b) for b in r.split('-')] for r in ranges) + range_objects =\ + (range(bound[0], bound[1] + 1 if len(bound) == 2 + else bound[0] + 1) for bound in bounds) + + return sorted(itertools.chain.from_iterable(range_objects)) + else: + return [] + + def destroy_vm(self): + host_driver = self.ovs[0]['phy_driver'] + err, out = self.check_output("virsh list --name | grep -i vm1") + print("{0}".format(out)) + if err == 0: + self.connection.execute("virsh shutdown vm1") + self.connection.execute("virsh destroy vm1") + self.check_output("rmmod {0}".format(host_driver))[1].splitlines() + self.check_output("modprobe {0}".format(host_driver))[ + 1].splitlines() + else: + print("error : ", err) diff --git a/yardstick/benchmark/contexts/sriov.py b/yardstick/benchmark/contexts/sriov.py index 5dc27bfae..da143cc4b 100644 --- a/yardstick/benchmark/contexts/sriov.py +++ b/yardstick/benchmark/contexts/sriov.py @@ -134,6 +134,7 @@ class Sriov(StandaloneContext): self.auth_type = "" def init(self): + log.debug("In init") self.parse_pod_and_get_data(self.file_path) def parse_pod_and_get_data(self, file_path): @@ -146,8 +147,6 @@ class Sriov(StandaloneContext): log.error("File {0} does not exist".format(self.file_path)) raise - self.nodes.extend([node for node in cfg["nodes"] - if node["role"] != "Sriov"]) self.sriov.extend([node for node in cfg["nodes"] if node["role"] == "Sriov"]) self.user = self.sriov[0]['user'] diff --git a/yardstick/benchmark/contexts/standalone.py b/yardstick/benchmark/contexts/standalone.py index e921437d6..2bc1f3755 100644 --- a/yardstick/benchmark/contexts/standalone.py +++ b/yardstick/benchmark/contexts/standalone.py @@ -18,6 +18,7 @@ import logging import errno import collections import yaml +import time from yardstick.benchmark.contexts.base import Context from yardstick.common.constants import YARDSTICK_ROOT_PATH @@ -74,20 +75,24 @@ class StandaloneContext(Context): else: raise - self.nodes.extend(cfg["nodes"]) - self.nfvi_node.extend([node for node in cfg["nodes"] - if node["role"] == "nfvi_node"]) - # add optional static network definition - self.networks.update(cfg.get("networks", {})) + self.vm_deploy = attrs.get("vm_deploy", True) + self.nodes.extend([node for node in cfg["nodes"] + if str(node["role"]) != "Sriov" and + str(node["role"]) != "Ovsdpdk"]) for node in cfg["nodes"]: if str(node["role"]) == "Sriov": self.nfvi_node.extend([node for node in cfg["nodes"] if str(node["role"]) == "Sriov"]) - if str(node["role"]) == "ovs-dpdk": + if str(node["role"]) == "Ovsdpdk": + self.nfvi_node.extend([node for node in cfg["nodes"] + if str(node["role"]) == "Ovsdpdk"]) LOG.info("{0}".format(node["role"])) else: LOG.debug("Node role is other than SRIOV and OVS") self.nfvi_obj = self.get_nfvi_obj() + # add optional static network definition + self.networks.update(cfg.get("networks", {})) + self.nfvi_obj = self.get_nfvi_obj() LOG.debug("Nodes: %r", self.nodes) LOG.debug("NFVi Node: %r", self.nfvi_node) LOG.debug("Networks: %r", self.networks) @@ -96,21 +101,39 @@ class StandaloneContext(Context): """don't need to deploy""" # Todo: NFVi deploy (sriov, vswitch, ovs etc) based on the config. + if not self.vm_deploy: + return + + # Todo: NFVi deploy (sriov, vswitch, ovs etc) based on the config. self.nfvi_obj.ssh_remote_machine() if self.nfvi_obj.first_run is True: self.nfvi_obj.install_req_libs() nic_details = self.nfvi_obj.get_nic_details() print("{0}".format(nic_details)) - self.nfvi_obj.setup_sriov_context( - self.nfvi_obj.sriov[0]['phy_ports'], - nic_details, - self.nfvi_obj.sriov[0]['phy_driver']) - pass + + if self.nfvi_node[0]["role"] == "Sriov": + self.nfvi_obj.setup_sriov_context( + self.nfvi_obj.sriov[0]['phy_ports'], + nic_details, + self.nfvi_obj.sriov[0]['phy_driver']) + if self.nfvi_node[0]["role"] == "Ovsdpdk": + self.nfvi_obj.setup_ovs(self.nfvi_obj.ovs[0]["phy_ports"]) + self.nfvi_obj.start_ovs_serverswitch() + time.sleep(5) + self.nfvi_obj.setup_ovs_bridge() + self.nfvi_obj.add_oflows() + self.nfvi_obj.setup_ovs_context( + self.nfvi_obj.ovs[0]['phy_ports'], + nic_details, + self.nfvi_obj.ovs[0]['phy_driver']) + pass def undeploy(self): """don't need to undeploy""" + if not self.vm_deploy: + return # Todo: NFVi undeploy (sriov, vswitch, ovs etc) based on the config. # self.nfvi_obj = self.get_nfvi_obj() self.nfvi_obj.ssh_remote_machine() @@ -123,16 +146,12 @@ class StandaloneContext(Context): Keyword arguments: attr_name -- A name for a server listed in nodes config file """ - if isinstance(attr_name, collections.Mapping): return None - if self.name != attr_name.split(".")[1]: return None - node_name = attr_name.split(".")[0] matching_nodes = (n for n in self.nodes if n["name"] == node_name) - try: # A clone is created in order to avoid affecting the # original one. @@ -147,7 +166,6 @@ class StandaloneContext(Context): else: raise ValueError("Duplicate nodes!!! Nodes: %s %s", (matching_nodes, duplicate)) - node["name"] = attr_name return node |