diff options
-rw-r--r-- | .gitignore | 10 | ||||
-rwxr-xr-x | ci/build-vsperf.sh | 4 | ||||
-rw-r--r-- | docs/release/release-notes/release-notes.rst | 34 | ||||
-rw-r--r-- | docs/testing/developer/devguide/results/results.rst | 42 | ||||
-rw-r--r-- | src/Makefile.src_cuse | 33 | ||||
-rwxr-xr-x | src/dpdk/Makefile | 5 | ||||
-rw-r--r-- | src/ovs/Makefile | 2 | ||||
-rwxr-xr-x | src/qemu/Makefile | 2 | ||||
-rw-r--r-- | src/vpp/Makefile | 2 | ||||
-rw-r--r-- | tools/opnfvdashboard/opnfvdashboard.py | 58 | ||||
-rwxr-xr-x | vsperf | 5 |
11 files changed, 83 insertions, 114 deletions
@@ -64,6 +64,16 @@ target/ /src/dpdk/dpdk/ /src/ovs/ovs/ /src/qemu/qemu/ +/src/vpp/vpp/ /src_cuse/ /src_vanilla/ .vagrant +tags + +# Ignore all files in l2fwd except those prefaced by "!" +/src/l2fwd +!/src/l2fwd/gen_debian_package.sh +!/src/l2fwd/l2fwd.c +!/src/l2fwd/LICENSE.txt +!/src/l2fwd/Makefile + diff --git a/ci/build-vsperf.sh b/ci/build-vsperf.sh index 30069c47..cee0e525 100755 --- a/ci/build-vsperf.sh +++ b/ci/build-vsperf.sh @@ -80,10 +80,10 @@ fi # Test report related configuration TEST_REPORT_PARTIAL="*_test_report.rst" -TEST_REPORT_DIR="${WORKSPACE}/docs/testing/developer/results" +TEST_REPORT_DIR="${WORKSPACE}/docs/testing/developer/devguide/results" TEST_REPORT_INDEX="${TEST_REPORT_DIR}/index.rst" TEST_REPORT_LINK_OLD="https://wiki.opnfv.org/wiki/vsperf_results" -TEST_REPORT_FILE="${WORKSPACE}/docs_output/testing/developer/results/index.html" +TEST_REPORT_FILE="${WORKSPACE}/docs_output/testing_developer_devguide_results/index.html" TEST_REPORT_TARBALL="vswitchperf_logs_${DATE}.tar.gz" if [[ "x${BRANCH}" == "xmaster" ]]; then diff --git a/docs/release/release-notes/release-notes.rst b/docs/release/release-notes/release-notes.rst index c2dff390..e4c5f6c8 100644 --- a/docs/release/release-notes/release-notes.rst +++ b/docs/release/release-notes/release-notes.rst @@ -2,6 +2,40 @@ .. http://creativecommons.org/licenses/by/4.0 .. (c) OPNFV, Intel Corporation, AT&T and others. +OPNFV Euphrates Release +======================= + +* Improvement of stepdriven testcases +* Support for graph plotting from vsperf results +* Support for vHost User client mode in OVS and VPP +* Support for DPDK 17.02 +* Support for dpdk driver NIC binding by drivectl tool +* Several bugfixes and small improvements + +* vSwitches + + * Support for VPP virtual switch + * OVS: Support for jumbo frames + +* Traffic Generators: + + * Support for Trex traffic generator + * Support for huge number of streams + * Ixia: L3, L4 or vlan headers can be turned off/on, support of 1 NIC connection + between DUT and Ixia, bugfixing + * MoonGen: fix multistream support + * Xena: option for final verification, JSON refactoring, support for xena + pairs topology and port removal options, bugfixes + +* Guest specific: + + * Support for additional QEMU cpu features + * Support for pinning of vCPU threads + +* Integration tests: + + * New VPP related testcases + * New multistream testcases focused on L3 and L4 performance of OVS and VPP OPNFV Danube Release ==================== diff --git a/docs/testing/developer/devguide/results/results.rst b/docs/testing/developer/devguide/results/results.rst index df9c52cb..0a0ab75d 100644 --- a/docs/testing/developer/devguide/results/results.rst +++ b/docs/testing/developer/devguide/results/results.rst @@ -7,32 +7,22 @@ OPNFV Test Results VSPERF CI jobs are run daily and sample results can be found at https://wiki.opnfv.org/display/vsperf/Vsperf+Results -The following example maps the results in the test dashboard to the appropriate -test case in the VSPERF Framework and specifies the metric the vertical/Y axis -is plotting. **Please note**, the presence of dpdk within a test name signifies -that the vswitch under test was OVS with DPDK, while its absence indicates that -the vswitch under test was stock OVS. +Testcase names shown in the dashboard are combination of orignal testcase +name from VSPERF framework and indication of used vswitch. -===================== ===================== ================== =============== - Dashboard Test Framework Test Metric Guest Interface -===================== ===================== ================== =============== -tput_ovsdpdk phy2phy_tput Throughput (FPS) N/A -tput_ovs phy2phy_tput Throughput (FPS) N/A -b2b_ovsdpdk back2back Back-to-back value N/A -b2b_ovs back2back Back-to-back value N/A -tput_mod_vlan_ovs phy2phy_tput_mod_vlan Throughput (FPS) N/A -tput_mod_vlan_ovsdpdk phy2phy_tput_mod_vlan Throughput (FPS) N/A -scalability_ovs phy2phy_scalability Throughput (FPS) N/A -scalability_ovsdpdk phy2phy_scalability Throughput (FPS) N/A -pvp_tput_ovsdpdkuser pvp_tput Throughput (FPS) vhost-user -pvp_tput_ovsvirtio pvp_tput Throughput (FPS) virtio-net -pvp_b2b_ovsdpdkuser pvp_back2back Back-to-back value vhost-user -pvp_b2b_ovsvirtio pvp_back2back Back-to-back value virtio-net -pvvp_tput_ovsdpdkuser pvvp_tput Throughput (FPS) vhost-user -pvvp_tput_ovsvirtio pvvp_tput Throughput (FPS) virtio-net -pvvp_b2b_ovsdpdkuser pvvp_back2back Throughput (FPS) vhost-user -pvvp_b2b_ovsvirtio pvvp_back2back Throughput (FPS) virtio-net -===================== ===================== ================== =============== + Example: -The loopback application in the VNF was used for PVP and PVVP scenarios was DPDK + Testcase ``phy2phy_tput`` is executed for three vSwitch types: ``OvsDpdkVhost``, + ``OvsVanilla`` and ``VppDpdkVhost``. In this case, following testcase names + will be used in the dashboard: ``phy2phy_tput_ovsdpdkvhost``, + ``phy2phy_tput_ovsvanilla`` and ``phy2phy_tput_vppdpdkvhost``. + +In case of RFC2544 Throughput test, the recorded metric is FPS (frames per +second) without packet loss. For RFC2544 Back2Back test, the recorded metric +is back-to-back value (number of frames) without packet loss. + +The loopback application in the VNF used for PVP and PVVP scenarios was DPDK testpmd. + +Guest interface types are ``vhost-user`` for ``OvsDpdkVhost`` and ``VppDpdkVhost`` +and ``virtio-net`` for ``OvsVanilla``. diff --git a/src/Makefile.src_cuse b/src/Makefile.src_cuse deleted file mode 100644 index 0ddac4cb..00000000 --- a/src/Makefile.src_cuse +++ /dev/null @@ -1,33 +0,0 @@ -# Top Makefile to build upstream packages. -# - -# Copyright 2015 OPNFV -# -# 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. - -# -# Contributors: -# Aihua Li, Huawei Technologies. - -include mk/master.mk - -export VHOST_USER - -# specify upstream package as SUBDIRS - common terms as suggest by gnu-make -SUBDIRS = -SUBDIRS += dpdk -SUBDIRS += ovs -ovs: dpdk -WITH_LINUX = -VHOST_USER = n -include mk/make-subsys.mk diff --git a/src/dpdk/Makefile b/src/dpdk/Makefile index 69671169..4b4330d7 100755 --- a/src/dpdk/Makefile +++ b/src/dpdk/Makefile @@ -99,9 +99,6 @@ ifdef CONFIG_FILE_BASE $(AT)cd `dirname $(CONFIG_FILE_BASE)` && git checkout `basename $(CONFIG_FILE_BASE)` && cd - endif $(AT)echo "VHOST_USER = $(VHOST_USER)" -ifeq ($(VHOST_USER),n) - $(AT)cd $(WORK_DIR)/lib/librte_vhost/eventfd_link; make -endif @echo "Make done" install: $(INSTALL_TARGET) @@ -126,7 +123,7 @@ sanity: @echo "Make sanity in $(WORK_DIR) (stub) " $(WORK_DIR): - $(AT)git clone $(DPDK_URL) + $(AT)git clone $(DPDK_URL) dpdk $(TAG_DONE_FLAG): $(WORK_DIR) $(AT)cd $(WORK_DIR); git checkout $(DPDK_TAG) diff --git a/src/ovs/Makefile b/src/ovs/Makefile index ee15c521..e3adc2f8 100644 --- a/src/ovs/Makefile +++ b/src/ovs/Makefile @@ -111,7 +111,7 @@ boot $(WORK_DIR)/configure: boot $(WORK_DIR)/configure: $(TAG_DONE_FLAG) $(WORK_DIR): - $(AT)git clone $(OVS_URL) + $(AT)git clone $(OVS_URL) ovs $(AT)mkdir -p $(OVS_VANILLA) $(AT)cp -rf ./* $(OVS_VANILLA) diff --git a/src/qemu/Makefile b/src/qemu/Makefile index 5f5e941f..b105496c 100755 --- a/src/qemu/Makefile +++ b/src/qemu/Makefile @@ -68,7 +68,7 @@ sanity: $(WORK_DIR)/configure: $(TAG_DONE_FLAG) $(WORK_DIR): - $(AT)git clone $(QEMU_URL) + $(AT)git clone $(QEMU_URL) qemu $(TAG_DONE_FLAG): $(WORK_DIR) $(AT)cd $(WORK_DIR); git checkout $(QEMU_TAG) diff --git a/src/vpp/Makefile b/src/vpp/Makefile index de50d941..d3146f46 100644 --- a/src/vpp/Makefile +++ b/src/vpp/Makefile @@ -66,7 +66,7 @@ sanity: $(WORK_DIR)/configure: $(TAG_DONE_FLAG) $(WORK_DIR): - $(AT)git clone $(VPP_URL) + $(AT)git clone $(VPP_URL) vpp $(TAG_DONE_FLAG): $(WORK_DIR) $(AT)cd vpp; git checkout $(VPP_TAG) diff --git a/tools/opnfvdashboard/opnfvdashboard.py b/tools/opnfvdashboard/opnfvdashboard.py index c24b9f8c..cf2fd1b0 100644 --- a/tools/opnfvdashboard/opnfvdashboard.py +++ b/tools/opnfvdashboard/opnfvdashboard.py @@ -40,13 +40,14 @@ def _push_results(reader, int_data): db_url = int_data['db_url'] url = db_url + "/results" casename = "" - version_ovs = "" + version_vswitch = "" version_dpdk = "" version = "" allowed_pkt = ["64", "128", "512", "1024", "1518"] details = {"64": '', "128": '', "512": '', "1024": '', "1518": ''} test_start = None test_stop = None + vswitch = None for row_reader in reader: if allowed_pkt.count(row_reader['packet_size']) == 0: @@ -58,8 +59,10 @@ def _push_results(reader, int_data): if test_start is None: test_start = row_reader['start_time'] test_stop = row_reader['stop_time'] + # CI job executes/reports TCs per vswitch type + vswitch = row_reader['vswitch'] - casename = _generate_test_name(row_reader['id'], int_data) + casename = "{}_{}".format(row_reader['id'], row_reader['vswitch'].lower()) if "back2back" in row_reader['id']: details[row_reader['packet_size']] = row_reader['b2b_frames'] else: @@ -68,16 +71,19 @@ def _push_results(reader, int_data): # Create version field with open(int_data['pkg_list'], 'r') as pkg_file: for line in pkg_file: - if "OVS_TAG" in line: - version_ovs = line.replace(' ', '') - version_ovs = version_ovs.replace('OVS_TAG?=', '') + if "OVS_TAG" in line and vswitch.startswith('Ovs'): + version_vswitch = line.replace(' ', '') + version_vswitch = "OVS " + version_vswitch.replace('OVS_TAG?=', '') + if "VPP_TAG" in line and vswitch.startswith('Vpp'): + version_vswitch = line.replace(' ', '') + version_vswitch = "VPP " + version_vswitch.replace('VPP_TAG?=', '') if "DPDK_TAG" in line: - if int_data['vanilla'] is False: + # DPDK_TAG is not used by VPP, it downloads its onw DPDK version + if vswitch == "OvsDpdkVhost": version_dpdk = line.replace(' ', '') - version_dpdk = version_dpdk.replace('DPDK_TAG?=', '') - else: - version_dpdk = "not used" - version = "OVS " + version_ovs.replace('\n', '') + " DPDK " + version_dpdk.replace('\n', '') + version_dpdk = " DPDK {}".format( + version_dpdk.replace('DPDK_TAG?=', '')) + version = version_vswitch.replace('\n', '') + version_dpdk.replace('\n', '') # Build body body = {"project_name": "vsperf", @@ -97,35 +103,3 @@ def _push_results(reader, int_data): logging.debug("opnfv url: %s", db_url) logging.debug("the body sent to opnfv") logging.debug(body) - -def _generate_test_name(testcase, int_data): - """ - the method generates testcase name for releng - """ - vanilla = int_data['vanilla'] - res_name = "" - - names = {'phy2phy_tput': ["tput_ovsdpdk", "tput_ovs"], - 'back2back': ["b2b_ovsdpdk", "b2b_ovs"], - 'phy2phy_tput_mod_vlan': ["tput_mod_vlan_ovsdpdk", "tput_mod_vlan_ovs"], - 'phy2phy_cont': ["cont_ovsdpdk", "cont_ovs"], - 'pvp_cont': ["pvp_cont_ovsdpdkuser", "pvp_cont_ovsvirtio"], - 'pvvp_cont': ["pvvp_cont_ovsdpdkuser", "pvvp_cont_ovsvirtio"], - 'phy2phy_scalability': ["scalability_ovsdpdk", "scalability_ovs"], - 'pvp_tput': ["pvp_tput_ovsdpdkuser", "pvp_tput_ovsvirtio"], - 'pvp_back2back': ["pvp_b2b_ovsdpdkuser", "pvp_b2b_ovsvirtio"], - 'pvvp_tput': ["pvvp_tput_ovsdpdkuser", "pvvp_tput_ovsvirtio"], - 'pvvp_back2back': ["pvvp_b2b_ovsdpdkuser", "pvvp_b2b_ovsvirtio"], - 'phy2phy_cpu_load': ["cpu_load_ovsdpdk", "cpu_load_ovs"], - 'phy2phy_mem_load': ["mem_load_ovsdpdk", "mem_load_ovs"]} - - for name, name_list in names.items(): - if name != testcase: - continue - if vanilla is True: - res_name = name_list[1] - else: - res_name = name_list[0] - break - - return res_name @@ -707,15 +707,12 @@ def main(): opnfv_url = settings.getValue('OPNFV_URL') pkg_list = settings.getValue('PACKAGE_LIST') - int_data = {'vanilla': False, - 'pod': pod_name, + int_data = {'pod': pod_name, 'criteria': "PASS", 'build_tag': get_build_tag(), 'installer': installer_name, 'pkg_list': pkg_list, 'db_url': opnfv_url} - if str(settings.getValue('VSWITCH')).endswith('Vanilla'): - int_data['vanilla'] = True opnfvdashboard.results2opnfv_dashboard(results_path, int_data) # cleanup before exit |