X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Frobot%2Fshared%2Fdefault.robot;h=891ef2192c4717014514b8bf1648ce90fe9d8a80;hp=0a3efc285a31eb27ba1cb43e1f1e85d195e18259;hb=f0e964d35af36f0923c6ae0421e74d94022cadba;hpb=14a71b74b414df7616ccb5ada3d50ecb90d96bae diff --git a/resources/libraries/robot/shared/default.robot b/resources/libraries/robot/shared/default.robot index 0a3efc285a..891ef2192c 100644 --- a/resources/libraries/robot/shared/default.robot +++ b/resources/libraries/robot/shared/default.robot @@ -1,4 +1,4 @@ -# Copyright (c) 2020 Cisco and/or its affiliates. +# Copyright (c) 2021 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: @@ -20,10 +20,10 @@ | Library | OperatingSystem | Library | String | +| Library | resources.libraries.python.Adl | Library | resources.libraries.python.Classify | Library | resources.libraries.python.CpuUtils | Library | resources.libraries.python.CoreDumpUtil -| Library | resources.libraries.python.Cop | Library | resources.libraries.python.DUTSetup | Library | resources.libraries.python.L2Util | Library | resources.libraries.python.InterfaceUtil @@ -34,17 +34,18 @@ | Library | resources.libraries.python.PapiHistory | Library | resources.libraries.python.SchedUtils | Library | resources.libraries.python.Tap +| Library | resources.libraries.python.Tap.TapFeatureMask | Library | resources.libraries.python.TestConfig | Library | resources.libraries.python.TGSetup | Library | resources.libraries.python.topology.Topology | Library | resources.libraries.python.Trace +| Library | resources.libraries.python.VhostUser.VirtioFeatureMask | Library | resources.libraries.python.VppCounters | Library | resources.libraries.python.VPPUtil | | Resource | resources/libraries/robot/lb/load_balancer.robot | Resource | resources/libraries/robot/crypto/ipsec.robot | Resource | resources/libraries/robot/features/acl.robot -| Resource | resources/libraries/robot/features/gbp.robot | Resource | resources/libraries/robot/features/policer.robot | Resource | resources/libraries/robot/ip/ip4.robot | Resource | resources/libraries/robot/ip/ip6.robot @@ -58,7 +59,6 @@ | Resource | resources/libraries/robot/overlay/lisp.robot | Resource | resources/libraries/robot/overlay/lispgpe.robot | Resource | resources/libraries/robot/overlay/lisp_api.robot -| Resource | resources/libraries/robot/performance/performance_limits.robot | Resource | resources/libraries/robot/performance/performance_utils.robot | Resource | resources/libraries/robot/shared/interfaces.robot | Resource | resources/libraries/robot/shared/container.robot @@ -70,17 +70,63 @@ | Resource | resources/libraries/robot/shared/traffic.robot | Resource | resources/libraries/robot/shared/vm.robot +*** Variables *** +| ${cpu_alloc_str}= | ${0} + *** Keywords *** +# TODO: Sort keywords alphabetically. + +| Call Resetter +| | [Documentation] +| | ... | Check for a presence of test variable \${resetter}. +| | ... | If it exists (and not None), call the resetter (as a Python callable). +| | ... | This is usually used to reset any state on DUT before next trial. +| | +| | ... | TODO: Move to a more specific library if needed. +| | +| | ... | *Example:* +| | +| | ... | \| Call Resetter \| +| | +| | ${resetter} = | Get Resetter +| | # See http://robotframework.org/robotframework/3.1.2/libraries/BuiltIn.html +| | # #Evaluating%20expressions for $variable (without braces) syntax. +| | # Parens are there to perform the call. +| | Run Keyword If | $resetter | Evaluate | $resetter() + +| Workers From Physical Cores +| | [Documentation] +| | ... | Convert from core count to worker count. +| | +| | ... | This just calls CpuUtils.worker_count_from_cores_and_smt keyword +| | ... | with the global \${smt_used} value. +| | ... | See documentation there. +| | +| | ... | *Arguments:* +| | ... | - phy_cores - Number of physical cores to convert from. Type: integer. +| | +| | ... | *Return value:* +| | ... | - Number of workers active on the given number of cores. +| | +| | ... | *Example:* +| | +| | ... | \| \${dp_workers} = \| Workers from Physical Cores \| \${1} \| +| | +| | [Arguments] | ${phy_cores} +| | +| | Run Keyword And Return | Worker Count From Cores And Smt +| | ... | phy_cores=${phy_cores} | smt_used=${smt_used} + | Configure crypto device on all DUTs | | [Documentation] | Verify if Crypto QAT device virtual functions are | | ... | initialized on all DUTs. If parameter force_init is set to True, then | | ... | try to initialize/disable. | | | | ... | *Arguments:* -| | ... | - crypto_type - Crypto device type - HW_DH895xcc or HW_C3xxx. -| | ... | Type: string, default value: HW_DH895xcc -| | ... | - numvfs - Number of VFs to initialize, 0 - disable the VFs -| | ... | Type: integer, default value: ${32} +| | ... | - crypto_type - Crypto device type - HW_DH895xcc or HW_C3xxx; default +| | ... | value: HW_DH895xcc. Type: string +| | ... | - numvfs - Number of VFs to initialize, 0 - disable the VFs; default +| | ... | value: ${32} Type: integer | | ... | - force_init - Force to initialize. Type: boolean | | | | ... | *Example:* @@ -127,7 +173,7 @@ | | [Arguments] | ${dutx} | ${dut_keys} | | | | FOR | ${key} | IN | @{dut_keys} -| | | ${found_key} | ${value}= | Run Keyword and Ignore Error +| | | ${found_key} | ${value}= | Run Keyword And Ignore Error | | | ... | Dictionaries Should Be Equal | ${nodes['${key}']} | ${dutx} | | | Run Keyword If | '${found_key}' == 'PASS' | EXIT FOR LOOP | | END @@ -142,20 +188,22 @@ | | FOR | ${dut} | IN | @{duts} | | | Import Library | resources.libraries.python.VppConfigGenerator | | | ... | WITH NAME | ${dut} -| | | Run keyword | ${dut}.Set Node | ${nodes['${dut}']} | node_key=${dut} -| | | Run keyword | ${dut}.Add Unix Log -| | | Run keyword | ${dut}.Add Unix CLI Listen -| | | Run keyword | ${dut}.Add Unix Nodaemon -| | | Run keyword | ${dut}.Add Unix Coredump -| | | Run keyword | ${dut}.Add Socksvr | ${SOCKSVR_PATH} -| | | Run keyword | ${dut}.Add Heapsize | 4G -| | | Run keyword | ${dut}.Add Statseg size | 4G -| | | Run keyword | ${dut}.Add Statseg Per Node Counters | on -| | | Run keyword | ${dut}.Add Plugin | disable | default -| | | Run keyword | ${dut}.Add Plugin | enable | @{plugins_to_enable} -| | | Run keyword | ${dut}.Add IP6 Hash Buckets | 2000000 -| | | Run keyword | ${dut}.Add IP6 Heap Size | 4G -| | | Run keyword | ${dut}.Add IP Heap Size | 4G +| | | Run Keyword | ${dut}.Set Node | ${nodes['${dut}']} | node_key=${dut} +| | | Run Keyword | ${dut}.Add Unix Log +| | | Run Keyword | ${dut}.Add Unix CLI Listen +| | | Run Keyword | ${dut}.Add Unix Nodaemon +| | | Run Keyword | ${dut}.Add Unix Coredump +| | | Run Keyword | ${dut}.Add Socksvr | ${SOCKSVR_PATH} +| | | Run Keyword | ${dut}.Add Main Heap Size | ${${heap_size_mult}*${2}}G +| | | Run Keyword | ${dut}.Add Main Heap Page Size | 2M +| | | Run Keyword | ${dut}.Add Statseg Size | 2G +| | | Run Keyword | ${dut}.Add Statseg Page Size | 2M +| | | Run Keyword | ${dut}.Add Statseg Per Node Counters | on +| | | Run Keyword | ${dut}.Add Plugin | disable | default +| | | Run Keyword | ${dut}.Add Plugin | enable | @{plugins_to_enable} +| | | Run Keyword | ${dut}.Add IP6 Hash Buckets | 2000000 +| | | Run Keyword | ${dut}.Add IP6 Heap Size | 4G +| | | Run Keyword | ${dut}.Add Graph Node Variant | ${GRAPH_NODE_VARIANT} | | END | Add worker threads to all DUTs @@ -187,45 +235,114 @@ | | ${txd_count_int}= | Set variable | ${txd} | | FOR | ${dut} | IN | @{duts} | | | ${numa}= | Get interfaces numa node -| | | ... | ${nodes['${dut}']} | @{${dut}_pf_pci} +| | | ... | ${nodes['${dut}']} | @{${dut}_pf_keys} | | | ${smt_used}= | Is SMT enabled | ${nodes['${dut}']['cpuinfo']} | | | ${skip_cnt}= | Set variable | ${CPU_CNT_SYSTEM} | | | ${cpu_main}= | Cpu list per node str | ${nodes['${dut}']} | ${numa} | | | ... | skip_cnt=${skip_cnt} | cpu_cnt=${CPU_CNT_MAIN} | | | ${skip_cnt}= | Evaluate | ${CPU_CNT_SYSTEM} + ${CPU_CNT_MAIN} -| | | ${cpu_wt}= | Run keyword if | ${cpu_count_int} > 0 | +| | | ${cpu_wt}= | Run Keyword If | ${cpu_count_int} > 0 | | | | ... | Cpu list per node str | ${nodes['${dut}']} | ${numa} | | | ... | skip_cnt=${skip_cnt} | cpu_cnt=${cpu_count_int} | | | ... | smt_used=${smt_used} -| | | ${thr_count_int}= | Run keyword if | ${smt_used} +| | | ${thr_count_int}= | Run Keyword If | ${smt_used} | | | ... | Evaluate | int(${cpu_count_int}*2) | | | ... | ELSE | Set variable | ${thr_count_int} -| | | ${rxq_count_int}= | Run keyword if | ${rx_queues} +| | | ${rxq_ratio} = | Get Variable Value | \${rxq_ratio} | ${2} +| | | ${rxq_count_int}= | Run Keyword If | ${rx_queues} | | | ... | Set variable | ${rx_queues} -| | | ... | ELSE | Evaluate | int(${thr_count_int}/2) -| | | ${rxq_count_int}= | Run keyword if | ${rxq_count_int} == 0 +| | | ... | ELSE | Evaluate | int(${thr_count_int}/${rxq_ratio}) +| | | ${rxq_count_int}= | Run Keyword If | ${rxq_count_int} == 0 | | | ... | Set variable | ${1} | | | ... | ELSE | Set variable | ${rxq_count_int} | | | Run Keyword | ${dut}.Add CPU Main Core | ${cpu_main} -| | | Run keyword if | ${cpu_count_int} > 0 +| | | Run Keyword If | ${cpu_count_int} > 0 | | | ... | ${dut}.Add CPU Corelist Workers | ${cpu_wt} -| | | Run keyword if | ${smt_used} -| | | ... | Run keyword | ${dut}.Add Buffers Per Numa | ${215040} | ELSE -| | | ... | Run keyword | ${dut}.Add Buffers Per Numa | ${107520} -| | | ${ipsec} | Get Match Count | ${TEST TAGS} | IPSEC -| | | ... | case_insensitive=True -| | | Run keyword if | ${ipsec} and ${jumbo} -| | | ... | ${dut}.Add Buffers Default Data Size | 9200 -| | | Run keyword if | ${thr_count_int} > 1 +| | | Run Keyword If | ${smt_used} +| | | ... | Run Keyword | ${dut}.Add Buffers Per Numa | ${215040} | ELSE +| | | ... | Run Keyword | ${dut}.Add Buffers Per Numa | ${107520} +| | | Run Keyword If | ${thr_count_int} > 1 | | | ... | Set Tags | MTHREAD | ELSE | Set Tags | STHREAD | | | Set Tags | ${thr_count_int}T${cpu_count_int}C | | END +| | ${cpu_alloc_str}= | Catenate | SEPARATOR=, | ${cpu_alloc_str} | ${cpu_main} +| | ${cpu_alloc_str}= | Catenate | SEPARATOR=, | ${cpu_alloc_str} | ${cpu_wt} | | Set Test Variable | ${smt_used} -| | Set Test Variable | ${thr_count_int} +| | Set Test Variable | ${cpu_alloc_str} | | Set Test Variable | ${cpu_count_int} +| | Set Test Variable | ${thr_count_int} +| | Set Test Variable | ${rxd_count_int} +| | Set Test Variable | ${txd_count_int} | | Set Test Variable | ${rxq_count_int} + +| Add worker threads for GSO tests to all DUTs +| | [Documentation] | Setup worker threads in vpp startup configuration on all +| | ... | DUTs. Based on the SMT configuration of DUT if enabled keyword will +| | ... | automatically map also the sibling logical cores. +| | ... | Keyword will automatically set the appropriate test TAGs in format +| | ... | mTnC, where m=logical_core_count and n=physical_core_count. +| | ... | RXQ are computed automatically by dividing thread count with number 2 +| | ... | (TODO: Add division by actual number of interfaces). User can manually +| | ... | override RX, RXD, TXD parameters if needed. +| | +| | ... | *Arguments:* +| | ... | - phy_cores - Number of physical cores to use. Type: integer +| | ... | - rx_queues - Number of RX queues. Type: integer +| | ... | - rxd - Number of RX descriptors. Type: integer +| | ... | - txd - Number of TX descriptors. Type: integer +| | +| | ... | *Example:* +| | +| | ... | \| Add worker threads for GSO tests to all DUTs \| ${1} \| ${1} \| +| | +| | [Arguments] | ${phy_cores} | ${rx_queues}=${None} | ${rxd}=${None} +| | ... | ${txd}=${None} +| | +| | ${cpu_count_int} | Convert to Integer | ${phy_cores} +| | ${thr_count_int} | Convert to Integer | ${phy_cores} +| | ${rxd_count_int}= | Set variable | ${rxd} +| | ${txd_count_int}= | Set variable | ${txd} +| | FOR | ${dut} | IN | @{duts} +| | | ${numa}= | Get interfaces numa node +| | | ... | ${nodes['${dut}']} | @{${dut}_pf_keys} +| | | ${smt_used}= | Set variable | ${False} +| | | ${skip_cnt}= | Set variable | ${CPU_CNT_SYSTEM} +| | | ${cpu_main}= | Cpu list per node str | ${nodes['${dut}']} | ${numa} +| | | ... | skip_cnt=${skip_cnt} | cpu_cnt=${CPU_CNT_MAIN} +| | | ${skip_cnt}= | Evaluate | ${CPU_CNT_SYSTEM} + ${CPU_CNT_MAIN} +| | | ${cpu_wt}= | Run Keyword If | ${cpu_count_int} > 0 | +| | | ... | Cpu list per node str | ${nodes['${dut}']} | ${numa} +| | | ... | skip_cnt=${skip_cnt} | cpu_cnt=${cpu_count_int} +| | | ... | smt_used=${smt_used} +| | | ${thr_count_int}= | Run Keyword If | ${smt_used} +| | | ... | Evaluate | int(${cpu_count_int}*2) +| | | ... | ELSE | Set variable | ${thr_count_int} +| | | ${rxq_ratio} = | Get Variable Value | \${rxq_ratio} | ${2} +| | | ${rxq_count_int}= | Run Keyword If | ${rx_queues} +| | | ... | Set variable | ${rx_queues} +| | | ... | ELSE | Evaluate | int(${thr_count_int}/${rxq_ratio}) +| | | ${rxq_count_int}= | Run Keyword If | ${rxq_count_int} == 0 +| | | ... | Set variable | ${1} +| | | ... | ELSE | Set variable | ${rxq_count_int} +| | | Run Keyword | ${dut}.Add CPU Main Core | ${cpu_main} +| | | Run Keyword If | ${cpu_count_int} > 0 +| | | ... | ${dut}.Add CPU Corelist Workers | ${cpu_wt} +| | | Run Keyword If | ${smt_used} +| | | ... | Run Keyword | ${dut}.Add Buffers Per Numa | ${215040} | ELSE +| | | ... | Run Keyword | ${dut}.Add Buffers Per Numa | ${107520} +| | | Run Keyword If | ${thr_count_int} > 1 +| | | ... | Set Tags | MTHREAD | ELSE | Set Tags | STHREAD +| | | Set Tags | ${thr_count_int}T${cpu_count_int}C +| | END +| | ${cpu_alloc_str}= | Catenate | SEPARATOR=, | ${cpu_alloc_str} | ${cpu_main} +| | ${cpu_alloc_str}= | Catenate | SEPARATOR=, | ${cpu_alloc_str} | ${cpu_wt} +| | Set Test Variable | ${smt_used} +| | Set Test Variable | ${cpu_alloc_str} +| | Set Test Variable | ${cpu_count_int} +| | Set Test Variable | ${thr_count_int} | | Set Test Variable | ${rxd_count_int} | | Set Test Variable | ${txd_count_int} +| | Set Test Variable | ${rxq_count_int} | Add DPDK VLAN strip offload switch off between DUTs | | [Documentation] @@ -248,15 +365,44 @@ | Add NAT to all DUTs | | [Documentation] | Add NAT configuration to all DUTs. | | +| | ... | *Arguments:* +| | ... | - nat_mode - NAT mode; default value: deterministic. Type: string +| | +| | ... | *Example:* +| | +| | ... | \| Add NAT to all DUTs \| nat_mode=endpoint-dependent \| +| | +| | [Arguments] | ${nat_mode}=deterministic +| | +| | FOR | ${dut} | IN | @{duts} +| | | Run Keyword | ${dut}.Add NAT | value=${nat_mode} +| | END + +| Add NAT max translations per thread to all DUTs +| | [Documentation] | Add NAT maximum number of translations per thread +| | ... | configuration. +| | +| | ... | *Arguments:* +| | ... | - max_translations_per_thread - NAT maximum number of translations per +| | ... | thread. Type: string +| | +| | ... | *Example:* +| | +| | ... | \| Add NAT translation memory to all DUTs \ +| | ... | \| max_translations_per_thread=2048 \| +| | +| | [Arguments] | ${max_translations_per_thread}=1024 +| | | | FOR | ${dut} | IN | @{duts} -| | | Run keyword | ${dut}.Add NAT +| | | Run Keyword | ${dut}.Add NAT max translations per thread +| | | ... | value=${max_translations_per_thread} | | END | Write startup configuration on all VPP DUTs | | [Documentation] | Write VPP startup configuration without restarting VPP. | | | | FOR | ${dut} | IN | @{duts} -| | | Run keyword | ${dut}.Write Config +| | | Run Keyword | ${dut}.Write Config | | END | Apply startup configuration on all VPP DUTs @@ -273,12 +419,12 @@ | | [Arguments] | ${with_trace}=${False} | | | | FOR | ${dut} | IN | @{duts} -| | | Run keyword | ${dut}.Apply Config +| | | Run Keyword | ${dut}.Apply Config | | END | | Save VPP PIDs | | Enable Coredump Limit VPP on All DUTs | ${nodes} | | Update All Interface Data On All Nodes | ${nodes} | skip_tg=${True} -| | Run keyword If | ${with_trace} | VPP Enable Traces On All Duts | ${nodes} +| | Run Keyword If | ${with_trace} | VPP Enable Traces On All Duts | ${nodes} | Apply startup configuration on VPP DUT | | [Documentation] | Write VPP startup configuration and restart VPP DUT. @@ -289,13 +435,13 @@ | | | | [Arguments] | ${dut} | ${with_trace}=${False} | | -| | Run keyword | ${dut}.Apply Config +| | Run Keyword | ${dut}.Apply Config | | Save VPP PIDs on DUT | ${dut} | | Enable Coredump Limit VPP on DUT | ${nodes['${dut}']} | | ${dutnode}= | Copy Dictionary | ${nodes} | | Keep In Dictionary | ${dutnode} | ${dut} | | Update All Interface Data On All Nodes | ${dutnode} | skip_tg=${True} -| | Run keyword If | ${with_trace} | VPP Enable Traces On Dut +| | Run Keyword If | ${with_trace} | VPP Enable Traces On Dut | | ... | ${nodes['${dut}']} | Save VPP PIDs @@ -338,7 +484,7 @@ | | ${err_msg}= | Catenate | ${SUITE NAME} - ${TEST NAME} | | ... | \nThe VPP PIDs are not equal!\nTest Setup VPP PIDs: | | ... | ${setup_vpp_pids}\nTest Teardown VPP PIDs: ${teardown_vpp_pids} -| | ${rc} | ${msg}= | Run keyword and ignore error +| | ${rc} | ${msg}= | Run Keyword And Ignore Error | | ... | Dictionaries Should Be Equal | | ... | ${setup_vpp_pids} | ${teardown_vpp_pids} | | Run Keyword And Return If | '${rc}'=='FAIL' | Log | ${err_msg}