fix(core): TG export
[csit.git] / resources / libraries / robot / shared / suite_setup.robot
index d5cc583..c0ba082 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2019 Cisco and/or its affiliates.
+# Copyright (c) 2022 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:
 *** Settings ***
 | Library | resources.libraries.python.DPDK.DPDKTools
 | Library | resources.libraries.python.InterfaceUtil
+| Library | resources.libraries.python.NGINX.NGINXTools
+| Library | resources.tools.ab.ABTools
+| Library | resources.libraries.python.Iperf3
 | Library | resources.libraries.python.NodePath
 | Library | resources.libraries.python.topology.Topology
 | Library | resources.libraries.python.TrafficGenerator
-| Library | resources.tools.wrk.wrk
-| ...
+| Variables | resources/libraries/python/Constants.py
+|
 | Documentation | Suite setup keywords.
 
 *** Keywords ***
-| Setup suite single link
+| Create suite topology variables
 | | [Documentation]
-| | ... | Common suite setup for single link tests.
+| | ... | Create suite topology variables
+| |
+| | ... | _NOTE:_ This KW sets various suite variables based on filtered
+| | ... | topology. All variables are set with also backward compatibility
+| | ... | format dut{m}_if{n} (where the value type is string).
+| | ... | List type allows to access physical interfaces in same way as
+| | ... | virtual interface (e.g. SRIOV). This keeps abstracted compatibility
+| | ... | between existing L1 and L2 KWs library and underlaying physical
+| | ... | topology.
+| |
+| | ... | - duts - List of DUT nodes (name as seen in topology file).
+| | ... | - duts_count - Number of DUT nodes.
+| | ... | - int - Interfacy type (layer).
+| | ... | Type: string
+| | ... | - dut{n} - DUTx node.
+| | ... | Type: dictionary
+| | ... | - dut{m}_pf{n} - Nth interface of Mth DUT.
+| | ... | Type: list
+| | ... | - dut{m}_pf{n}_mac - Nth interface of Mth DUT - MAC address.
+| | ... | Type: list
+| | ... | - dut{m}_pf{n}_vlan - Nth interface of Mth DUT - VLAN id.
+| | ... | Type: list
+| | ... | - dut{m}_pf{n}_pci - Nth interface of Mth DUT - PCI address.
+| | ... | Type: list
+| | ... | - dut{m}_pf{n}_ip4_addr - Nth interface of Mth DUT - IPv4 address.
+| | ... | Type: list
+| | ... | - dut{m}_pf{n}_ip4_prefix - Nth interface of Mth DUT - IPv4 prefix.
+| | ... | Type: list
+| |
+| | ... | *Arguments:*
+| | ... | - @{actions} - Additional setup action. Type: list
+| |
+| | [Arguments] | @{actions}
+| |
+| | ${variables}= | Get Dictionary Keys | ${topology_info}
+| | FOR | ${variable} | IN | @{variables}
+| | | ${value}= | Get From Dictionary | ${topology_info} | ${variable}
+| | | Set Suite Variable | ${${variable}} | ${value}
+| | END
+| | FOR | ${action} | IN | @{actions}
+| | | Run Keyword | Additional Suite setup Action For ${action}
+| | END
+
+| Setup suite topology interfaces
+| | [Documentation]
+| | ... | Common suite setup for one to multiple link tests.
 | | ... |
-| | ... | Compute path for testing on two given nodes in circular topology
+| | ... | Compute path for testing on given topology nodes in circular topology
 | | ... | based on interface model provided as an argument and set
 | | ... | corresponding suite variables.
-| | ...
-| | ... | _NOTE:_ This KW sets following suite variables:
-| | ... | - duts - List of DUT nodes
-| | ... | - duts_count - Number of DUT nodes.
-| | ... | - tg - TG node
-| | ... | - tg_if1 - 1st TG interface towards DUT.
-| | ... | - tg_if1_mac - 1st TG interface MAC address.
-| | ... | - tg_if2 - 2nd TG interface towards DUT.
-| | ... | - tg_if2_mac - 2nd TG interface MAC address.
-| | ... | - dut{n} - DUTx node
-| | ... | - dut{n}_if1 - 1st DUT interface.
-| | ... | - dut{n}_if1_mac - 1st DUT interface MAC address.
-| | ... | - dut{n}_if2 - 2nd DUT interface.
-| | ... | - dut{n}_if2_mac - 2nd DUT interface MAC address.
-| | ...
+| |
 | | ... | *Arguments:*
 | | ... | - ${actions} - Additional setup action. Type: list
-| | ...
+| |
 | | [Arguments] | @{actions}
-| | ...
+| |
+| | Start Suite Setup Export
 | | ${nic_model_list}= | Create list | ${nic_name}
-| | Append Node | ${nodes['TG']}
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Append Node | ${nodes['${dut}']} | filter_list=${nic_model_list}
-| | Append Node | ${nodes['TG']}
-| | Compute Path | always_same_link=${FALSE}
-| | ${tg_if1} | ${tg}= | Next Interface
-| | :FOR | ${dut} | IN | @{duts}
-| | | ${dutx_if1} | ${dutx}= | Next Interface
-| | | ${dutx_if2} | ${dutx}= | Next Interface
-| | | ${dutx_if1_mac}= | Get Interface MAC | ${dutx} | ${dutx_if1}
-| | | ${dutx_if2_mac}= | Get Interface MAC | ${dutx} | ${dutx_if2}
-| | | ${dut_str}= | Convert To Lowercase | ${dut}
-| | | Set Suite Variable | ${${dut_str}} | ${dutx}
-| | | Set Suite Variable | ${${dut_str}_if1} | ${dutx_if1}
-| | | Set Suite Variable | ${${dut_str}_if2} | ${dutx_if2}
-| | | Set Suite Variable | ${${dut_str}_if1_mac} | ${dutx_if1_mac}
-| | | Set Suite Variable | ${${dut_str}_if2_mac} | ${dutx_if2_mac}
-| | ${tg_if2} | ${tg}= | Next Interface
-| | ${tg_if1_mac}= | Get Interface MAC | ${tg} | ${tg_if1}
-| | ${tg_if2_mac}= | Get Interface MAC | ${tg} | ${tg_if2}
-| | ${duts_count}= | Get Length | ${duts}
-| | Set Suite Variable | ${duts}
-| | Set Suite Variable | ${duts_count}
-| | Set Suite Variable | ${tg}
-| | Set Suite Variable | ${tg_if1}
-| | Set Suite Variable | ${tg_if1_mac}
-| | Set Suite Variable | ${tg_if2}
-| | Set Suite Variable | ${tg_if2_mac}
-| | :FOR | ${action} | IN | @{actions}
-| | | Run Keyword | Additional Suite setup Action For ${action}
+| | &{info}= | Compute Circular Topology
+| | ... | ${nodes} | filter_list=${nic_model_list} | nic_pfs=${nic_pfs}
+| | ... | always_same_link=${False} | topo_has_tg=${True}
+| | Set suite variable | &{topology_info} | &{info}
+| | Create suite topology variables | @{actions}
+| | Finalize Suite Setup Export
 
-| Setup suite double link
+| Setup suite topology interfaces with no TG
 | | [Documentation]
-| | ... | Common suite setup for double link tests.
+| | ... | Common suite setup for single link tests with no traffic generator
+| | ... | node.
 | | ... |
-| | ... | Compute path for testing on three given nodes in circular topology
-| | ... | with double link between DUTs based on interface model provided as an
-| | ... | argument and set corresponding suite variables.
-| | ...
+| | ... | Compute path for testing on given topology nodes in circular topology
+| | ... | based on interface model provided as an argument and set
+| | ... | corresponding suite variables.
+| |
 | | ... | *Arguments:*
 | | ... | - ${actions} - Additional setup action. Type: list
-| | ...
-| | ... | _NOTE:_ This KW sets following suite variables:
-| | ... | - duts - List of DUT nodes
-| | ... | - duts_count - Number of DUT nodes.
-| | ... | - tg - TG node
-| | ... | - tg_if1 - 1st TG interface towards DUT.
-| | ... | - tg_if1 - 1st TG interface MAC address.
-| | ... | - tg_if2 - 2nd TG interface towards DUT.
-| | ... | - tg_if2 - 2nd TG interface MAC address.
-| | ... | - dut1 - DUT1 node
-| | ... | - dut1_if1 - DUT1 interface towards TG.
-| | ... | - dut1_if2_1 - DUT1 interface 1 towards DUT2.
-| | ... | - dut1_if2_2 - DUT1 interface 2 towards DUT2.
-| | ... | - dut2 - DUT2 node
-| | ... | - dut2_if1_1 - DUT2 interface 1 towards DUT1.
-| | ... | - dut2_if1_2 - DUT2 interface 2 towards DUT1.
-| | ... | - dut2_if2 - DUT2 interface towards TG.
-| | ...
+| |
 | | [Arguments] | @{actions}
-| | ...
+| |
+| | Start Suite Setup Export
 | | ${nic_model_list}= | Create list | ${nic_name}
-| | # Compute path TG - DUT1 with single link in between
-| | Append Node | ${nodes['TG']}
-| | Append Node | ${nodes['DUT1']} | filter_list=${nic_model_list}
-| | Append Node | ${nodes['TG']}
-| | Compute Path
-| | ${tg_if1} | ${tg}= | Next Interface
-| | ${dut1_if1} | ${dut1}= | Next Interface
-| | # Compute path TG - DUT2 with single link in between
-| | Clear Path
-| | Append Node | ${nodes['TG']}
-| | Append Node | ${nodes['DUT2']} | filter_list=${nic_model_list}
-| | Append Node | ${nodes['TG']}
-| | Compute Path
-| | ${tg_if2} | ${tg}= | Next Interface
-| | ${dut2_if2} | ${dut2}= | Next Interface
-| | # Compute path DUT1 - DUT2 with double link in between
-| | Clear Path
-| | Append Node | ${nodes['DUT1']} | filter_list=${nic_model_list}
-| | Append Node | ${nodes['DUT2']} | filter_list=${nic_model_list}
-| | Append Node | ${nodes['DUT1']} | filter_list=${nic_model_list}
-| | Compute Path | always_same_link=${FALSE}
-| | ${dut1_if2_1} | ${dut1}= | First Interface
-| | ${dut1_if2_2} | ${dut1}= | Last Interface
-| | ${dut2_if1_1} | ${dut2}= | First Ingress Interface
-| | ${dut2_if1_2} | ${dut2}= | Last Egress Interface
-| | ${tg_if1_mac}= | Get Interface MAC | ${tg} | ${tg_if1}
-| | ${tg_if2_mac}= | Get Interface MAC | ${tg} | ${tg_if2}
-| | ${duts_count}= | Set Variable | 2
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | # Set suite variables
-| | Set Suite Variable | ${duts}
-| | Set Suite Variable | ${duts_count}
-| | Set Suite Variable | ${tg}
-| | Set Suite Variable | ${tg_if1}
-| | Set Suite Variable | ${tg_if1_mac}
-| | Set Suite Variable | ${tg_if2}
-| | Set Suite Variable | ${tg_if2_mac}
-| | Set Suite Variable | ${dut1}
-| | Set Suite Variable | ${dut1_if1}
-| | Set Suite Variable | ${dut1_if2_1}
-| | Set Suite Variable | ${dut1_if2_2}
-| | Set Suite Variable | ${dut2}
-| | Set Suite Variable | ${dut2_if1_1}
-| | Set Suite Variable | ${dut2_if1_2}
-| | Set Suite Variable | ${dut2_if2}
-| | :FOR | ${action} | IN | @{actions}
-| | | Run Keyword | Additional Suite setup Action For ${action}
+| | &{info}= | Compute Circular Topology
+| | ... | ${nodes} | filter_list=${nic_model_list} | nic_pfs=${nic_pfs}
+| | ... | always_same_link=${True} | topo_has_tg=${False}
+| | Set suite variable | &{topology_info} | &{info}
+| | Create suite topology variables | @{actions}
+| | Finalize Suite Setup Export
 
-| Additional Suite Setup Action For performance
+| Setup suite topology interfaces with no DUT
 | | [Documentation]
-| | ... | Additional Setup for suites which uses performance measurement.
-| | ...
-| | Run Keyword If | ${duts_count} == 1
-| | ... | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
-| | ... | ${dut1} | ${dut1_if1} | ${dut1} | ${dut1_if2} | ${osi_layer}
-| | Run Keyword If | ${duts_count} == 2
-| | ... | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
-| | ... | ${dut1} | ${dut1_if1} | ${dut2} | ${dut2_if2} | ${osi_layer}
+| | ... | Common suite setup for single link tests with no device under test
+| | ... | node.
+| | ... |
+| | ... | Compute path for testing on given topology nodes in circular topology
+| | ... | based on interface model provided as an argument and set
+| | ... | corresponding suite variables.
+| |
+| | ... | *Arguments:*
+| | ... | - ${actions} - Additional setup action. Type: list
+| |
+| | [Arguments] | @{actions}
+| |
+| | Start Suite Setup Export
+| | ${nic_model_list}= | Create list | ${nic_name}
+| | &{info}= | Compute Circular Topology
+| | ... | ${nodes} | filter_list=${nic_model_list} | nic_pfs=${nic_pfs}
+| | ... | always_same_link=${True} | topo_has_tg=${True} | topo_has_dut=${False}
+| | Set suite variable | &{topology_info} | &{info}
+| | Create suite topology variables | @{actions}
+| | Finalize Suite Setup Export
 
 | Additional Suite Setup Action For scapy
 | | [Documentation]
 | | ... | Additional Setup for suites which uses scapy as Traffic generator.
-| | ...
-| | Set Interface State | ${tg} | ${tg_if1} | up
-| | Set Interface State | ${tg} | ${tg_if2} | up
+| |
+| | Export TG Type And Version | scapy | 2.4.3
+| | FOR | ${dut} | IN | @{duts}
+| | | Set Suite Variable | ${${dut}_vf1} | ${${dut}_${int}1}
+| | | Set Suite Variable | ${${dut}_vf2} | ${${dut}_${int}2}
+| | END
+| | Set Interface State | ${tg} | ${TG_pf1}[0] | up
+| | Set Interface State | ${tg} | ${TG_pf2}[0] | up
 
 | Additional Suite Setup Action For dpdk
 | | [Documentation]
 | | ... | Additional Setup for suites which uses dpdk.
-| | ...
-| | :FOR | ${dut} | IN | @{duts}
-| | | ${dut_str}= | Convert To Lowercase | ${dut}
-| | | Initialize DPDK Environment | ${nodes['${dut}']}
-| | | ... | ${${dut_str}_if1} | ${${dut_str}_if2}
+| |
+| | ${version} = | Get Dpdk Version | ${nodes}[DUT1]
+| | Export Dut Type And Version | dpdk | ${version}
+| | FOR | ${dut} | IN | @{duts}
+| | | Initialize DPDK Framework | ${nodes['${dut}']}
+| | | ... | ${${dut}_${int}1}[0] | ${${dut}_${int}2}[0] | ${nic_driver}
+| | END
 
-| Additional Suite Setup Action For performance_avf
+| Additional Suite Setup Action For performance vf
 | | [Documentation]
-| | ... | Additional Setup for suites which uses performance measurement over
-| | ... | SRIOV AVF.
-| | ...
-| | :FOR | ${dut} | IN | @{duts}
-| | | ${if1_avf_arr}= | Init AVF interface | ${nodes['${dut}']} | ${${dut}_if1}
-| | | ... | numvfs=${1} | osi_layer=${osi_layer}
-| | | ${if2_avf_arr}= | Init AVF interface | ${nodes['${dut}']} | ${${dut}_if2}
-| | | ... | numvfs=${1} | osi_layer=${osi_layer}
-# Currently only one AVF is supported.
-| | | Set Suite Variable | ${${dut}_if1_vf0} | ${if1_avf_arr[0]}
-| | | Set Suite Variable | ${${dut}_if2_vf0} | ${if2_avf_arr[0]}
-| | Run Keyword If | ${duts_count} == 1
-| | ... | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
-| | ... | ${dut1} | ${dut1_if1_vf0} | ${dut1} | ${dut1_if2_vf0} | ${osi_layer}
-| | Run Keyword If | ${duts_count} == 2
-| | ... | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
-| | ... | ${dut1} | ${dut1_if1_vf0} | ${dut2} | ${dut2_if2_vf0} | ${osi_layer}
+| | ... | Additional Setup for suites which uses performance measurement for
+| | ... | single DUT (inner loop).
+| |
+| | ... | *Arguments:*
+| | ... | - dut - DUT node. Type: string
+| |
+| | ... | *Example:*
+| |
+| | ... | \| Additional Suite Setup Action For performance vf \| DUT1 \|
+| |
+| | [Arguments] | ${dut}
+| |
+| | FOR | ${pf} | IN RANGE | 1 | ${nic_pfs} + 1
+| | | ${_vf}=
+| | | ... | Run Keyword | Init interface
+| | | ... | ${nodes['${dut}']} | ${${dut}_pf${pf}}[0] | driver=${nic_driver}
+| | | ... | numvfs=${nic_vfs} | osi_layer=${osi_layer}
+| | | ${_mac}=
+| | | ... | Create List | ${EMPTY}
+| | | ${_ip4_addr}=
+| | | ... | Create List | ${EMPTY}
+| | | ${_ip4_prefix}=
+| | | ... | Create List | ${EMPTY}
+| | | ${_pci}=
+| | | ... | Create List | ${EMPTY}
+| | | ${_vlan}=
+| | | ... | Create List | ${EMPTY}
+| | | Set Suite Variable
+| | | ... | ${${dut}_prevf${pf}} | ${_vf}
+| | | Set Suite Variable
+| | | ... | ${${dut}_prevf${pf}_ip4_addr} | ${_ip4_addr}
+| | | Set Suite Variable
+| | | ... | ${${dut}_prevf${pf}_ip4_prefix} | ${_ip4_prefix}
+| | | Set Suite Variable
+| | | ... | ${${dut}_prevf${pf}_mac} | ${_mac}
+| | | Set Suite Variable
+| | | ... | ${${dut}_prevf${pf}_pci} | ${_pci}
+| | | Set Suite Variable
+| | | ... | ${${dut}_prevf${pf}_vlan} | ${_vlan}
+| | END
+| | Set Suite Variable
+| | ... | ${int} | prevf
+
+| Additional Suite Setup Action For performance pf
+| | [Documentation]
+| | ... | Additional Setup for suites which uses performance measurement for
+| | ... | single DUT (inner loop).
+| |
+| | ... | *Arguments:*
+| | ... | - dut - DUT node. Type: string
+| |
+| | ... | *Example:*
+| |
+| | ... | \| Additional Suite Setup Action For performance pf \| DUT1 \|
+| |
+| | [Arguments] | ${dut}
+| |
+| | FOR | ${pf} | IN RANGE | 1 | ${nic_pfs} + 1
+| | | Run Keyword | Init interface
+| | | ... | ${nodes['${dut}']} | ${${dut}_pf${pf}}[0] | driver=${nic_driver}
+| | | ... | numvfs=${0} | osi_layer=${osi_layer}
+| | END
 
-| Additional Suite Setup Action For avf
+| Additional Suite Setup Action For performance
 | | [Documentation]
-| | ... | Additional Setup for suites which uses SRIOV AVF.
-| | ...
-| | :FOR | ${dut} | IN | @{duts}
-# Currently only one AVF is supported.
-| | | Set Suite Variable | ${${dut}_if1_vf0} | ${${dut}_if1}
-| | | Set Suite Variable | ${${dut}_if2_vf0} | ${${dut}_if2}
+| | ... | Additional Setup for suites which uses performance measurement.
+| |
+| | FOR | ${dut} | IN | @{duts}
+| | | Run Keyword If | ${nic_vfs} > 0
+| | | ... | Additional Suite Setup Action For performance vf | ${dut}
+| | | ... | ELSE
+| | | ... | Additional Suite Setup Action For performance pf | ${dut}
+| | END
+| | ${type} = | Get TG Type | ${nodes}[TG]
+| | ${version} = | Get TG Version | ${nodes}[TG]
+| | Export TG Type And Version | ${type} | ${version}
+| | Initialize traffic generator
+| | ... | ${tg} | ${TG_pf1}[0] | ${TG_pf2}[0]
+| | ... | ${dut1} | ${DUT1_${int}1}[0]
+| | ... | ${dut${duts_count}} | ${DUT${duts_count}_${int}2}[0]
+| | ... | ${osi_layer}
+
+| Additional Suite Setup Action For performance_tg_nic
+| | [Documentation]
+| | ... | Additional Setup for suites which uses performance measurement
+| | ... | for L1 cross connect tests
+| |
+| | ${type} = | Get TG Type | ${nodes}[TG]
+| | ${version} = | Get TG Version | ${nodes}[TG]
+| | Export Dut Type And Version | ${type} | ${version}
+| | Export TG Type And Version | ${type} | ${version}
+| | Initialize traffic generator
+| | ... | ${tg} | ${TG_pf1}[0] | ${TG_pf2}[0]
+| | ... | ${tg} | ${TG_pf2}[0]
+| | ... | ${tg} | ${TG_pf1}[0]
+| | ... | ${osi_layer}
+
+| Additional Suite Setup Action For iPerf3
+| | [Documentation]
+| | ... | Additional Setup for suites which uses performance measurement over
+| | ... | iPerf3.
+| |
+| | ${type} = | Get iPerf Type | ${nodes}[TG]
+| | ${version} = | Get iPerf Version | ${nodes}[TG]
+| | Export TG Type And Version | ${type} | ${version}
 
 | Additional Suite Setup Action For ipsechw
 | | [Documentation]
 | | ... | Additional Setup for suites which uses QAT HW.
-| | ...
+| |
 | | ${numvfs}= | Set Variable If
 | | ... | '${crypto_type}' == 'HW_DH895xcc' | ${32}
 | | ... | '${crypto_type}' == 'HW_C3xxx' | ${16}
 | | ... | force_init=${True}
 | | Configure kernel module on all DUTs | vfio_pci | force_load=${True}
 
-| Additional Suite Setup Action For wrk
+| Additional Suite Setup Action For nginx
+| | [Documentation]
+| | ... | Additional Setup for suites which uses Nginx.
+| |
+| | Install NGINX framework on all DUTs | ${nodes} | ${packages_dir}
+| | ... |  ${nginx_version}
+
+| Additional Suite Setup Action For vppecho
+| | [Documentation]
+| | ... | Additional Setup for suites which uses performance measurement over
+| | ... | VPP Echo.
+| |
+| | Export DUT Type And Version | ${DUT_TYPE} | ${DUT_VERSION}
+
+| Additional Suite Setup Action For ab
 | | [Documentation]
-| | ... | Additional Setup for suites which uses WRK TG.
-| | ...
+| | ... | Additional Setup for suites which uses ab TG.
+| |
 | | Iface update numa node | ${tg}
-# Make sure TRex is stopped
 | | ${running}= | Is TRex running | ${tg}
 | | Run keyword if | ${running}==${True} | Teardown traffic generator | ${tg}
 | | ${curr_driver}= | Get PCI dev driver | ${tg}
 | | Run keyword if | '${curr_driver}'!='${None}'
 | | ... | PCI Driver Unbind | ${tg} |
 | | ... | ${tg['interfaces']['${tg_if1}']['pci_address']}
-# Bind tg_if1 to driver specified in the topology
 | | ${driver}= | Get Variable Value | ${tg['interfaces']['${tg_if1}']['driver']}
 | | PCI Driver Bind | ${tg}
 | | ... | ${tg['interfaces']['${tg_if1}']['pci_address']} | ${driver}
-# Set IP on tg_if1
 | | ${intf_name}= | Get Linux interface name | ${tg}
 | | ... | ${tg['interfaces']['${tg_if1}']['pci_address']}
-| | Set Linux interface IP | ${tg} | ${intf_name} | 192.168.10.1 | 24
-| | Set Linux interface IP | ${tg} | ${intf_name} | 192.168.20.1 | 24
-| | Set Linux interface IP | ${tg} | ${intf_name} | 192.168.30.1 | 24
-| | Set Linux interface IP | ${tg} | ${intf_name} | 192.168.40.1 | 24
-| | Set Linux interface IP | ${tg} | ${intf_name} | 192.168.50.1 | 24
-| | Set Linux interface IP | ${tg} | ${intf_name} | 192.168.60.1 | 24
-| | Set Linux interface IP | ${tg} | ${intf_name} | 192.168.70.1 | 24
-| | Set Linux interface IP | ${tg} | ${intf_name} | 192.168.80.1 | 24
-| | Set Linux interface up | ${tg} | ${intf_name}
-| | Check wrk | ${tg}
+| | FOR | ${ip_addr} | IN | @{ab_ip_addrs}
+| | | ${ip_addr_on_intf}= | Linux interface has IP | ${tg} | ${intf_name}
+| | | ... | ${ip_addr} | ${ab_ip_prefix}
+| | | Run Keyword If | ${ip_addr_on_intf}==${False} | Set Linux interface IP
+| | | ... | ${tg} | ${intf_name} | ${ip_addr} | ${ab_ip_prefix}
+| | END
+| | Set Linux interface up | ${nodes}[TG] | ${intf_name}
+| | Check AB | ${tg}
+| | ${type} = | Get AB Type | ${nodes}[TG]
+| | ${version} = | Get AB Version | ${nodes}[TG]
+| | Export TG Type And Version | ${type} | ${version}