From 7d7259ab1a065f0d1f849b29270514eacd3a1efe Mon Sep 17 00:00:00 2001 From: Peter Mikus Date: Thu, 25 Jul 2019 11:09:23 +0000 Subject: VPPD: Dot1Q Change-Id: I0d3c925ea4a6896a0df98db6ddaf4238e6291bf1 Signed-off-by: Peter Mikus --- resources/libraries/bash/function/common.sh | 16 ++++++- resources/libraries/bash/function/device.sh | 34 ++++++++++++++- resources/libraries/python/topology.py | 28 ++++++++++++ .../performance/performance_configuration.robot | 18 -------- resources/libraries/robot/shared/interfaces.robot | 50 ++++++++++++++++++++-- resources/topology_schemas/topology.sch.yaml | 5 ++- 6 files changed, 126 insertions(+), 25 deletions(-) (limited to 'resources') diff --git a/resources/libraries/bash/function/common.sh b/resources/libraries/bash/function/common.sh index 751d994c09..a03e90422c 100644 --- a/resources/libraries/bash/function/common.sh +++ b/resources/libraries/bash/function/common.sh @@ -959,7 +959,7 @@ function select_vpp_device_tags () { set -exuo pipefail case "${TEST_CODE}" in - # Select specific performance tests based on jenkins job type variable. + # Select specific device tests based on jenkins job type variable. * ) if [[ -z "${TEST_TAG_STRING-}" ]]; then # If nothing is specified, we will run pre-selected tests by @@ -973,6 +973,20 @@ function select_vpp_device_tags () { ;; esac + # Blacklisting certain tags per topology. + # + # Reasons for blacklisting: + # - avf - AVF is not possible to run on enic driver of VirtualBox. + # - vhost - VirtualBox does not support nesting virtualization on Intel CPU. + case "${TEST_CODE}" in + *"1n-vbox"*) + test_tag_array+=("!avf") + test_tag_array+=("!vhost") + ;; + *) + ;; + esac + TAGS=() # We will prefix with devicetest to prevent running other tests diff --git a/resources/libraries/bash/function/device.sh b/resources/libraries/bash/function/device.sh index e31ead734a..ce88ec8c46 100644 --- a/resources/libraries/bash/function/device.sh +++ b/resources/libraries/bash/function/device.sh @@ -305,11 +305,13 @@ function get_available_interfaces () { TG_PCIDEVS=() TG_NETMACS=() TG_DRIVERS=() + TG_VLANS=() # DUT1 side of connections. DUT1_NETDEVS=() DUT1_PCIDEVS=() DUT1_NETMACS=() DUT1_DRIVERS=() + DUT1_VLANS=() # Find the first ${device_count} number of available TG Linux network # VF device names. Only allowed VF PCI IDs are filtered. @@ -350,17 +352,21 @@ function get_available_interfaces () { get_pci_addr get_mac_addr get_krn_driver + get_vlan_filter TG_PCIDEVS+=(${PCI_ADDR}) TG_NETMACS+=(${MAC_ADDR}) TG_DRIVERS+=(${KRN_DRIVER}) + TG_VLANS+=(${VLAN_ID}) done for NETDEV in "${DUT1_NETDEVS[@]}"; do get_pci_addr get_mac_addr get_krn_driver + get_vlan_filter DUT1_PCIDEVS+=(${PCI_ADDR}) DUT1_NETMACS+=(${MAC_ADDR}) DUT1_DRIVERS+=(${KRN_DRIVER}) + DUT1_VLANS+=(${VLAN_ID}) done # We need at least two interfaces for TG/DUT1 for building topology. @@ -433,6 +439,24 @@ function get_pci_addr () { } +function get_vlan_filter () { + + # Get VLAN stripping filter from PF searched by mac adress. + # + # Variables read: + # - MAC_ADDR - MAC address of VF. + # Variables set: + # - VLAN_ID - VLAN ids. + + set -exuo pipefail + + # Sed regular expression pattern. + exp="s/^.*vlan ([[:digit:]]+).*$/\1/" + VLAN_ID=$(ip link | grep vlan | grep ${MAC_ADDR} | sed -re "${exp}") || true + VLAN_ID="${VLAN_ID:-0}" +} + + function installed () { # Check if the given utility is installed. Fail if not installed. @@ -481,12 +505,16 @@ function read_env_variables () { DCR_UUIDS+=([dut1]="${CSIT_DUT1_UUID}") TG_PCIDEVS=("${CSIT_TG_INTERFACES_PORT1_PCI}") TG_DRIVERS=("${CSIT_TG_INTERFACES_PORT1_DRV}") + TG_VLANS+=("${CSIT_TG_INTERFACES_PORT1_VLAN}") TG_PCIDEVS+=("${CSIT_TG_INTERFACES_PORT2_PCI}") TG_DRIVERS+=("${CSIT_TG_INTERFACES_PORT2_DRV}") + TG_VLANS+=("${CSIT_TG_INTERFACES_PORT2_VLAN}") DUT1_PCIDEVS=("${CSIT_DUT1_INTERFACES_PORT1_PCI}") DUT1_DRIVERS=("${CSIT_DUT1_INTERFACES_PORT1_DRV}") + DUT1_VLANS+=("${CSIT_DUT1_INTERFACES_PORT1_VLAN}") DUT1_PCIDEVS+=("${CSIT_DUT1_INTERFACES_PORT2_PCI}") DUT1_DRIVERS+=("${CSIT_DUT1_INTERFACES_PORT2_DRV}") + DUT1_VLANS+=("${CSIT_DUT1_INTERFACES_PORT2_VLAN}") } @@ -527,15 +555,19 @@ function set_env_variables () { CSIT_TG_INTERFACES_PORT1_MAC="${TG_NETMACS[0]}" CSIT_TG_INTERFACES_PORT1_PCI="${TG_PCIDEVS[0]}" CSIT_TG_INTERFACES_PORT1_DRV="${TG_DRIVERS[0]}" + CSIT_TG_INTERFACES_PORT1_VLAN="${TG_VLANS[0]}" CSIT_TG_INTERFACES_PORT2_MAC="${TG_NETMACS[1]}" CSIT_TG_INTERFACES_PORT2_PCI="${TG_PCIDEVS[1]}" CSIT_TG_INTERFACES_PORT2_DRV="${TG_DRIVERS[1]}" + CSIT_TG_INTERFACES_PORT2_VLAN="${TG_VLANS[1]}" CSIT_DUT1_INTERFACES_PORT1_MAC="${DUT1_NETMACS[0]}" CSIT_DUT1_INTERFACES_PORT1_PCI="${DUT1_PCIDEVS[0]}" CSIT_DUT1_INTERFACES_PORT1_DRV="${DUT1_DRIVERS[0]}" + CSIT_DUT1_INTERFACES_PORT1_VLAN="${DUT1_VLANS[0]}" CSIT_DUT1_INTERFACES_PORT2_MAC="${DUT1_NETMACS[1]}" CSIT_DUT1_INTERFACES_PORT2_PCI="${DUT1_PCIDEVS[1]}" CSIT_DUT1_INTERFACES_PORT2_DRV="${DUT1_DRIVERS[1]}" + CSIT_DUT1_INTERFACES_PORT2_VLAN="${DUT1_VLANS[1]}" set +a } @@ -577,8 +609,6 @@ function start_topology_containers () { # Mount vfio to be able to bind to see binded interfaces. We cannot use # --device=/dev/vfio as this does not see newly binded interfaces. dcr_stc_params+="--volume /dev/vfio:/dev/vfio " - # Mount nested_vm image to be able to run VM tests. - dcr_stc_params+="--volume /var/lib/vm/vhost-nested.img:/var/lib/vm/vhost-nested.img " # Mount docker.sock to be able to use docker deamon of the host. dcr_stc_params+="--volume /var/run/docker.sock:/var/run/docker.sock " # Mount /opt/boot/ where VM kernel and initrd are located. diff --git a/resources/libraries/python/topology.py b/resources/libraries/python/topology.py index b06cf7dc4e..394dc9df58 100644 --- a/resources/libraries/python/topology.py +++ b/resources/libraries/python/topology.py @@ -197,6 +197,19 @@ class Topology(object): """ node['interfaces'][iface_key]['pci_address'] = str(pci_address) + @staticmethod + def update_interface_vlan(node, iface_key, vlan): + """Update VLAN on the interface from the node. + + :param node: Node to update VLAN on. + :param iface_key: Topology key of the interface. + :param vlan: VLAN ID. + :type node: dict + :type iface_key: str + :type vlan: str + """ + node['interfaces'][iface_key]['vlan'] = int(vlan) + @staticmethod def update_interface_vhost_socket(node, iface_key, vhost_socket): """Update vhost socket name on the interface from the node. @@ -695,6 +708,21 @@ class Topology(object): except KeyError: return None + @staticmethod + def get_interface_vlan(node, iface_key): + """Get interface vlan. + + :param node: Node to get interface driver on. + :param iface_key: Interface key from topology file. + :type node: dict + :type iface_key: str + :returns: Return interface vlan or None if not found. + """ + try: + return node['interfaces'][iface_key].get('vlan') + except KeyError: + return None + @staticmethod def get_node_interfaces(node): """Get all node interfaces. diff --git a/resources/libraries/robot/performance/performance_configuration.robot b/resources/libraries/robot/performance/performance_configuration.robot index 3f5538d3ad..6e65e26d8e 100644 --- a/resources/libraries/robot/performance/performance_configuration.robot +++ b/resources/libraries/robot/performance/performance_configuration.robot @@ -114,24 +114,6 @@ | | | ... | VPP Set Interface MTU | ${nodes['${dut}']} | ${${dut}_if1_2} | | All VPP Interfaces Ready Wait | ${nodes} -| Initialize AVF interfaces -| | [Documentation] -| | ... | Initialize AVF interfaces on each DUT. Interfaces are brought up. -| | ... -| | ${duts}= | Get Matches | ${nodes} | DUT* -| | :FOR | ${dut} | IN | @{duts} -| | | ${if1_pci}= | Get Interface PCI Addr | ${nodes['${dut}']} -| | | ... | ${${dut}_if1_vf0} -| | | ${if2_pci}= | Get Interface PCI Addr | ${nodes['${dut}']} -| | | ... | ${${dut}_if2_vf0} -| | | ${dut_eth_vf_if1}= | VPP Create AVF Interface | ${nodes['${dut}']} -| | | ... | ${if1_pci} | ${rxq_count_int} -| | | ${dut_eth_vf_if2}= | VPP Create AVF Interface | ${nodes['${dut}']} -| | | ... | ${if2_pci} | ${rxq_count_int} -| | | Set Test Variable | ${${dut}_if1} | ${dut_eth_vf_if1} -| | | Set Test Variable | ${${dut}_if2} | ${dut_eth_vf_if2} -| | Set interfaces in path up - | Initialize IPSec in 3-node circular topology | | [Documentation] | | ... | Set UP state on VPP interfaces in path on nodes in 3-node circular diff --git a/resources/libraries/robot/shared/interfaces.robot b/resources/libraries/robot/shared/interfaces.robot index d24b2fba3c..50dec59442 100644 --- a/resources/libraries/robot/shared/interfaces.robot +++ b/resources/libraries/robot/shared/interfaces.robot @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Cisco and/or its affiliates. +# Copyright (c) 2019 Cisco and/or its affiliates. # 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: @@ -82,6 +82,44 @@ | | Set Test Variable | ${prev_layer} | if | | Set interfaces in path up +| Initialize layer avf on node +| | [Documentation] +| | ... | Initialize AVF interfaces on DUT. Interfaces are brought up. +| | ... +| | ... | *Arguments:* +| | ... | - dut - DUT node. Type: string +| | ... +| | ... | *Example:* +| | ... +| | ... | \| Initialize layer avf on node \| DUT1 \| +| | ... +| | [Arguments] | ${dut} +| | ... +| | ${dut_str}= | Convert To Lowercase | ${dut} +| | ${if1_vlan}= | Get Interface Vlan | ${nodes['${dut}']} | ${${dut}_if1} +| | ${if2_vlan}= | Get Interface Vlan | ${nodes['${dut}']} | ${${dut}_if2} +| | Set Test Variable | ${${dut_str}_vlan1} | ${if1_vlan} +| | Set Test Variable | ${${dut_str}_vlan2} | ${if2_vlan} +| | ${if1_pci}= | Get Interface PCI Addr | ${nodes['${dut}']} +| | ... | ${${dut}_if1_vf0} +| | ${if2_pci}= | Get Interface PCI Addr | ${nodes['${dut}']} +| | ... | ${${dut}_if2_vf0} +| | ${dut_eth_vf_if1}= | VPP Create AVF Interface | ${nodes['${dut}']} +| | ... | ${if1_pci} | ${rxq_count_int} +| | ${dut_eth_vf_if2}= | VPP Create AVF Interface | ${nodes['${dut}']} +| | ... | ${if2_pci} | ${rxq_count_int} +| | Set Test Variable | ${${dut_str}_if1} | ${dut_eth_vf_if1} +| | Set Test Variable | ${${dut_str}_if2} | ${dut_eth_vf_if2} + +| Initialize AVF interfaces +| | [Documentation] +| | ... | Initialize AVF interfaces on each DUT. Interfaces are brought up. +| | ... +| | :FOR | ${dut} | IN | @{duts} +| | | Initialize layer avf on node | ${dut} +| | Set Test Variable | ${prev_layer} | vf +| | Set interfaces in path up + | Initialize layer bonding on node | | [Documentation] | | ... | Bonded interface and variables to be created on across east and @@ -152,8 +190,14 @@ | | ... | | ${dut_str}= | Convert To Lowercase | ${dut} | | :FOR | ${id} | IN RANGE | 1 | ${count} + 1 -| | | ${if1_vlan}= | Evaluate | ${100} + ${id} - ${1} -| | | ${if2_vlan}= | Evaluate | ${200} + ${id} - ${1} +| | | ${if1_vlan}= | Run Keyword If | ${${dut_str}_vlan1} +| | | ... | Set Variable | ${${dut_str}_vlan1} +| | | ... | ELSE +| | | ... | Evaluate | ${100} + ${id} - ${1} +| | | ${if2_vlan}= | Run Keyword If | ${${dut_str}_vlan2} +| | | ... | Set Variable | ${${dut_str}_vlan2} +| | | ... | ELSE +| | | ... | Evaluate | ${200} + ${id} - ${1} | | | ${if1_name} | ${if1_index}= | Run Keyword If | | | ... | ${create} or ${id} == ${1} | | | ... | Create Vlan Subinterface diff --git a/resources/topology_schemas/topology.sch.yaml b/resources/topology_schemas/topology.sch.yaml index 6f7404c0dd..37478058fe 100644 --- a/resources/topology_schemas/topology.sch.yaml +++ b/resources/topology_schemas/topology.sch.yaml @@ -60,7 +60,10 @@ schema;type_interfaces: model: type: str enum: [Cisco-VIC-1227, Cisco-VIC-1385, Intel-X520-DA2, - Intel-X710, Intel-XL710] + Intel-X710, Intel-XL710, Intel-XXV710] + vlan: + type: int + required: no schema;type_interface_tg: &type_interface_tg type: map -- cgit 1.2.3-korg