aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries
diff options
context:
space:
mode:
authorPeter Mikus <pmikus@cisco.com>2019-06-18 20:31:48 +0000
committerPeter Mikus <pmikus@cisco.com>2019-06-21 12:13:05 +0000
commit6871d4e7f6ed43ce0bb003cb08e88b2581a474eb (patch)
tree1ffdf006911d88de247d7dd0fc37818032c20461 /resources/libraries
parent8ded937abab242f2e096f83423e1dcecd1ecf722 (diff)
Align suite/test teardown/setup
+ Phase I - aligning FUNC/PERF Change-Id: I46b1e43687ddb29f5ed3c6335fe1baf21ec02822 Signed-off-by: Peter Mikus <pmikus@cisco.com>
Diffstat (limited to 'resources/libraries')
-rw-r--r--resources/libraries/robot/crypto/ipsec.robot29
-rw-r--r--resources/libraries/robot/l2/l2_bridge_domain.robot37
-rw-r--r--resources/libraries/robot/performance/performance_setup.robot251
-rw-r--r--resources/libraries/robot/shared/default.robot39
-rw-r--r--resources/libraries/robot/shared/qemu.robot51
-rw-r--r--resources/libraries/robot/shared/suite_teardown.robot47
-rw-r--r--resources/libraries/robot/shared/test_teardown.robot127
-rw-r--r--resources/libraries/robot/vm/qemu.robot86
8 files changed, 232 insertions, 435 deletions
diff --git a/resources/libraries/robot/crypto/ipsec.robot b/resources/libraries/robot/crypto/ipsec.robot
index b571fcd6ca..135881f83e 100644
--- a/resources/libraries/robot/crypto/ipsec.robot
+++ b/resources/libraries/robot/crypto/ipsec.robot
@@ -250,34 +250,5 @@
| | ...
| | [Arguments] | ${ip_version}
| | ...
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Import Library | resources.libraries.python.VppConfigGenerator
-| | | ... | WITH NAME | ${dut}
-| | | Run keyword | ${dut}.Set Node | ${nodes['${dut}']}
-| | | Run keyword | ${dut}.Set Vpp Startup Conf Backup
-| | | Run keyword | ${dut}.Set Vpp Logfile | /tmp/vpp.log
-| | | Run keyword | ${dut}.Add Unix Nodaemon
-| | | Run keyword | ${dut}.Add Unix Log
-| | | Run keyword | ${dut}.Add Unix Coredump
-| | | Run keyword | ${dut}.Add Unix CLI Listen | /run/vpp/cli.sock
-| | | Run keyword | ${dut}.Add Unix Gid
-| | | Run keyword | ${dut}.Add Api Segment Gid
-| | | ${socket_id}= | Set Variable | ${0}
-| | | ${sw_dev_count}= | Set Variable | ${1}
-| | | Run keyword | ${dut}.Add DPDK SW Cryptodev | aesni_mb | ${socket_id}
-| | | ... | ${sw_dev_count}
-| | | Run keyword | ${dut}.Add DPDK SW Cryptodev | aesni_gcm | ${socket_id}
-| | | ... | ${sw_dev_count}
-| | Write startup configuration on all VPP DUTs
| | Set up VPP device test
| | Run Keyword | Configure topology for ${ip_version} IPsec testing
-
-| Tear down IPSec SW device functional test
-| | [Documentation]
-| | ... | Tear down IPSec SW device functional test.
-| | ...
-| | ${duts}= | Get Matches | ${nodes} | DUT*
-| | :FOR | ${dut} | IN | @{duts}
-| | | Run keyword | ${dut}.Restore Config
-| | Tear down VPP device test
diff --git a/resources/libraries/robot/l2/l2_bridge_domain.robot b/resources/libraries/robot/l2/l2_bridge_domain.robot
index b69d449a10..fda211508b 100644
--- a/resources/libraries/robot/l2/l2_bridge_domain.robot
+++ b/resources/libraries/robot/l2/l2_bridge_domain.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:
@@ -202,41 +202,6 @@
| | ${mac}= | Get Interface Mac | ${dest_node} | ${dest_node_if}
| | Vpp Add L2fib Entry | ${vpp_node} | ${mac} | ${vpp_node_if} | ${bd_id}
-| Configure VM for vhost L2BD forwarding
-| | [Documentation] | Setup QEMU and start VM with two vhost interfaces.
-| | ...
-| | ... | *Arguments:*
-| | ... | - ${dut_node} - DUT node to start VM on. Type: dictionary
-| | ... | - ${sock1} - Socket path for first Vhost-User interface. Type: string
-| | ... | - ${sock2} - Socket path for second Vhost-User interface. Type: string
-| | ... | - ${qemu_name} - Qemu instance name by which the object will be
-| | ... | accessed (Optional). Type: string
-| | ...
-| | ... | _NOTE:_ This KW sets following test case variable:
-| | ... | - ${${qemu_name}} - VM node info. Type: dictionary
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Configure VM for vhost L2BD forwarding \| ${nodes['DUT1']} \
-| | ... | \| /tmp/sock1 \| /tmp/sock2 \|
-| | ... | \| Configure VM for vhost L2BD forwarding \| ${nodes['DUT2']} \
-| | ... | \| /tmp/sock1 \| /tmp/sock2 \| qemu_instance_2 \|
-| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${qemu_name}=vm_node
-| | Import Library | resources.libraries.python.QemuUtils | node=${dut_node} |
-| | ... | WITH NAME | ${qemu_name}
-| | Set Test Variable | ${${qemu_name}} | ${None}
-| | Run Keyword | ${qemu_name}.Qemu Add Vhost User If | ${sock1}
-| | Run Keyword | ${qemu_name}.Qemu Add Vhost User If | ${sock2}
-| | ${vm}= | Run keyword | ${qemu_name}.Qemu Start
-| | ${br}= | Set Variable | br0
-| | ${vhost1}= | Get Vhost User If Name By Sock | ${vm} | ${sock1}
-| | ${vhost2}= | Get Vhost User If Name By Sock | ${vm} | ${sock2}
-| | Linux Add Bridge | ${vm} | ${br} | ${vhost1} | ${vhost2}
-| | Set Interface State | ${vm} | ${vhost1} | up | if_type=name
-| | Set Interface State | ${vm} | ${vhost2} | up | if_type=name
-| | Set Interface State | ${vm} | ${br} | up | if_type=name
-| | Set Test Variable | ${${qemu_name}} | ${vm}
-
| Configure vhost interfaces for L2BD forwarding
| | [Documentation] | Create two Vhost-User interfaces on defined VPP node.
| | ...
diff --git a/resources/libraries/robot/performance/performance_setup.robot b/resources/libraries/robot/performance/performance_setup.robot
index 9350c65beb..3e27c18d6a 100644
--- a/resources/libraries/robot/performance/performance_setup.robot
+++ b/resources/libraries/robot/performance/performance_setup.robot
@@ -200,36 +200,6 @@
| | Set Suite Variable | ${dut2_if1_2}
| | Set Suite Variable | ${dut2_if2}
-| Tear down guest VM
-| | [Documentation]
-| | ... | Stop all qemu processes running on nodes.
-| | ...
-| | Run Keyword | vnf_manager.Kill All VMs
-
-| Tear down guest VM with dpdk-testpmd
-| | [Documentation]
-| | ... | Stop all qemu processes with dpdk-testpmd running on ${dut_node}.
-| | ... | Argument is dictionary of all qemu nodes running with its names.
-| | ... | Dpdk-testpmd is stopped gracefully with printing stats.
-| | ...
-| | ... | *Arguments:*
-| | ... | - dut_node - Node where to clean qemu. Type: dictionary
-| | ... | - dut_vm_refs - VM references on node. Type: dictionary
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Tear down guest VM with dpdk-testpmd \| ${node['DUT1']} \
-| | ... | \| ${dut_vm_refs} \|
-| | ...
-| | [Arguments] | ${dut_node} | ${dut_vm_refs}
-| | ${vms_number}= | Get Length | ${dut_vm_refs}
-| | ${index}= | Set Variable | ${0}
-| | :FOR | ${vm_name} | IN | @{dut_vm_refs}
-| | | ${vm}= | Get From Dictionary | ${dut_vm_refs} | ${vm_name}
-| | | ${index}= | Evaluate | ${index} + 1
-| | | Dpdk Testpmd Stop | ${vm}
-| | | Run Keyword If | '${index}' == '${vms_number}' | ${vm_name}.Qemu Kill All
-
# Suite setups
| Set up 2-node performance topology with DUT's NIC model
@@ -581,20 +551,6 @@
| | Set Linux interface up | ${tg} | ${intf_name}
| | Install wrk | ${tg}
-# Suite teardowns
-
-| Tear down 2-node performance topology
-| | [Documentation]
-| | ... | Suite teardown phase with traffic generator teardown.
-| | ...
-| | Teardown traffic generator | ${tg}
-
-| Tear down 3-node performance topology
-| | [Documentation]
-| | ... | Suite teardown phase with traffic generator teardown.
-| | ...
-| | Teardown traffic generator | ${tg}
-
# Tests setups
| Set up performance test
@@ -656,210 +612,5 @@
| | Start VPP in all '${container_group}' containers
| | Restart VPP service on all DUTs | ${nodes}
| | Verify VPP on all DUTs | ${nodes}
+| | Save VPP PIDs
| | Append To List | ${container_groups} | ${container_group}
-
-# Tests teardowns
-
-| Tear down performance test
-| | [Documentation] | Common test teardown for performance tests.
-| | ...
-| | ... | TODO: Rename to "Tear down VPP performance test"?
-| | ... | most steps do not apply to DPDK nor other vswitch solutions.
-| | ... | TODO: Document at least some steps this keyword takes.
-| | ...
-| | ... | To save space in suites, this keyword does not accept
-| | ... | any explicit arguments. Instead, it requires few variables
-| | ... | to be defined in at least test scope.
-| | ...
-| | ... | *Test Variables needed:*
-| | ... | - frame_size - L2 Frame Size [B]. Type: integer
-| | ... | - traffic_profile - Profile name to run debug trial with. Type: string
-| | ... | - nodes - Parsed information object. Type: dict
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Set Test Variable \| \${frame_size} \| 64 \|
-| | ... | \| Tear down performance test \|
-| | ...
-| | Remove All Added Ports On All DUTs From Topology | ${nodes}
-| | Show PAPI History On All DUTs | ${nodes}
-| | Get Core Files on All Nodes | ${nodes}
-| | Set Test Variable | ${pkt_trace} | ${True}
-| | Run Keyword If Test Failed
-| | ... | Traffic should pass with no loss | ${perf_trial_duration} | 10000pps
-| | ... | ${frame_size} | ${traffic_profile} | fail_on_loss=${False}
-
-| Tear down performance test with container
-| | [Documentation]
-| | ... | Common test teardown for performance tests which uses containers.
-| | ...
-| | ... | TODO: Call Tear down performance test?
-| | ...
-| | :FOR | ${container_group} | IN | @{container_groups}
-| | | Destroy all '${container_group}' containers
-
-| Tear down performance test with vhost
-| | [Documentation] | Common test teardown for performance tests which use
-| | ... | vhost(s) and VM(s).
-| | ...
-| | Tear down performance test
-| | Show VPP vhost on all DUTs | ${nodes}
-| | Tear down guest VM
-
-| Tear down performance test with vhost and VM with dpdk-testpmd
-| | [Documentation] | Common test teardown for performance tests which use
-| | ... | vhost(s) and VM(s) with dpdk-testpmd.
-| | ...
-| | ... | *Test Variables needed:*
-| | ... | - frame_size - L2 Frame Size [B]. Type: integer
-| | ... | - traffic_profile - Profile name to run debug trial with. Type: string
-| | ...
-| | ... | *Arguments:*
-| | ... | - dut1_node - Node where to clean qemu. Type: dictionary
-| | ... | - dut1_vm_refs - VM references on node. Type: dictionary
-| | ... | - dut2_node - Node where to clean qemu. Type: dictionary
-| | ... | - dut2_vm_refs - VM references on node. Type: dictionary
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Tear down performance test with vhost and VM with dpdk-testpmd \
-| | ... | \| ${node['DUT1']} \| ${dut_vm_refs} \
-| | ... | \| ${node['DUT2']} \| ${dut_vm_refs} \|
-| | ...
-| | [Arguments] | ${dut1_node}=${None} | ${dut1_vm_refs}=${None}
-| | ... | ${dut2_node}=${None} | ${dut2_vm_refs}=${None}
-| | ...
-| | Tear down performance test
-| | Show VPP vhost on all DUTs | ${nodes}
-| | Run keyword unless | ${dut1_node}==${None}
-| | ... | Tear down guest VM with dpdk-testpmd | ${dut1} | ${dut1_vm_refs}
-| | Run keyword unless | ${dut2_node}==${None}
-| | ... | Tear down guest VM with dpdk-testpmd | ${dut2} | ${dut2_vm_refs}
-
-| Tear down performance test with vhost and VM with dpdk-testpmd and ACL
-| | [Documentation] | Common test teardown for performance tests which use
-| | ... | vhost(s) and VM(s) with ACL and dpdk-testpmd.
-| | ...
-| | ... | *Test Variables needed:*
-| | ... | - frame_size - L2 Frame Size [B]. Type: integer
-| | ... | - traffic_profile - Profile name to run debug trial with. Type: string
-| | ...
-| | ... | *Arguments:*
-| | ... | - dut1_node - Node where to clean qemu. Type: dictionary
-| | ... | - dut1_vm_refs - VM references on node. Type: dictionary
-| | ... | - dut2_node - Node where to clean qemu. Type: dictionary
-| | ... | - dut2_vm_refs - VM references on node. Type: dictionary
-| | ...
-| | [Arguments] | ${dut1_node}=${None} | ${dut1_vm_refs}=${None}
-| | ... | ${dut2_node}=${None} | ${dut2_vm_refs}=${None}
-| | ...
-| | Tear down performance test with vhost and VM with dpdk-testpmd
-| | ... | ${dut1_node} | ${dut1_vm_refs}
-| | ... | ${dut2_node} | ${dut2_vm_refs}
-| | Run Keyword If Test Failed | Vpp Log Plugin Acl Settings | ${dut1}
-| | Run Keyword If Test Failed | Run Keyword And Ignore Error
-| | ... | Vpp Log Plugin Acl Interface Assignment | ${dut1}
-
-| Tear down DPDK 2-node performance topology
-| | [Documentation]
-| | ... | Suite teardown phase with traffic generator teardown.
-| | ... | Cleanup DPDK test environment.
-| | ...
-| | ... | TODO: Add "Traffic should pass with no loss" with min rate
-| | ... | on failure, as in the VPP test teardown?
-| | ...
-| | Teardown traffic generator | ${tg}
-| | Cleanup DPDK Environment | ${dut1} | ${dut1_if1} | ${dut1_if2}
-
-| Tear down DPDK 3-node performance topology
-| | [Documentation]
-| | ... | Suite teardown phase with traffic generator teardown.
-| | ... | Cleanup DPDK test environment.
-| | ...
-| | ... | TODO: Add "Traffic should pass with no loss" with min rate
-| | ... | on failure, as in the VPP test teardown?
-| | ...
-| | Teardown traffic generator | ${tg}
-| | Cleanup DPDK Environment | ${dut1} | ${dut1_if1} | ${dut1_if2}
-| | Cleanup DPDK Environment | ${dut2} | ${dut2_if1} | ${dut2_if2}
-
-| Tear down performance test with NAT
-| | [Documentation] | Common test teardown for performance \
-| | ... | tests with NAT feature used.
-| | ...
-| | ... | *Test Variables needed:*
-| | ... | - frame_size - L2 Frame Size [B]. Type: integer
-| | ... | - traffic_profile - Profile name to run debug trial with. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Tear down performance test with NAT \|
-| | ...
-| | Tear down performance test
-| | Show NAT verbose | ${dut1}
-| | Show NAT verbose | ${dut2}
-
-| Tear down performance test with ACL
-| | [Documentation] | Common test teardown for performance \
-| | ... | tests with ACL feature used.
-| | ...
-| | ... | *Test Variables needed:*
-| | ... | - frame_size - L2 Frame Size [B]. Type: integer
-| | ... | - traffic_profile - Profile name to run debug trial with. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Tear down performance test with ACL \|
-| | ...
-| | Tear down performance test
-| | Run Keyword If Test Failed | Vpp Log Plugin Acl Settings | ${dut1}
-| | Run Keyword If Test Failed | Run Keyword And Ignore Error
-| | ... | Vpp Log Plugin Acl Interface Assignment | ${dut1}
-
-| Tear down performance test with MACIP ACL
-| | [Documentation] | Common test teardown for performance \
-| | ... | tests with MACIP ACL feature used.
-| | ...
-| | ... | *Test Variables needed:*
-| | ... | - frame_size - L2 Frame Size [B]. Type: integer
-| | ... | - traffic_profile - Profile name to run debug trial with. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Tear down performance test with MACIP ACL \|
-| | ...
-| | Tear down performance test
-| | Run Keyword If Test Failed | Run Keyword And Ignore Error
-| | ... | Vpp Log Macip Acl Settings | ${dut1}
-| | Run Keyword And Ignore Error
-| | ... | Vpp Log Macip Acl Interface Assignment | ${dut1}
-
-| Tear down performance test with Ligato Kubernetes
-| | [Documentation] | Common test teardown for performance \
-| | ... | tests with Ligato Kubernetes.
-| | ...
-| | ... | TODO: Call Tear down performance test?
-| | ...
-| | Run Keyword If Test Failed
-| | ... | Get Kubernetes logs on all DUTs | ${nodes} | csit
-| | Run Keyword If Test Failed
-| | ... | Describe Kubernetes resource on all DUTs | ${nodes} | csit
-| | Delete Kubernetes resource on all DUTs | ${nodes} | csit
-
-| Tear down performance test with SRv6 with encapsulation
-| | [Documentation] | Common test teardown for performance \
-| | ... | tests with SRv6 with encapsulation feature used.
-| | ...
-| | ... | *Test Variables needed:*
-| | ... | - frame_size - L2 Frame Size [B]. Type: integer
-| | ... | - traffic_profile - Profile name to run debug trial with. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Tear down performance test with SRv6 with encapsulation \|
-| | ...
-| | Tear down performance test
-| | Run Keyword If Test Failed | Show SR Policies on all DUTs | ${nodes}
-| | Run Keyword If Test Failed
-| | ... | Show SR Steering Policies on all DUTs | ${nodes}
-| | Run Keyword If Test Failed | Show SR LocalSIDs on all DUTs | ${nodes}
diff --git a/resources/libraries/robot/shared/default.robot b/resources/libraries/robot/shared/default.robot
index 262dc02f55..b7e4a75773 100644
--- a/resources/libraries/robot/shared/default.robot
+++ b/resources/libraries/robot/shared/default.robot
@@ -34,7 +34,10 @@
| Library | resources.libraries.python.topology.Topology
| ...
| Resource | resources/libraries/robot/shared/container.robot
-| Resource | resources/libraries/robot/vm/qemu.robot
+| Resource | resources/libraries/robot/shared/qemu.robot
+| Resource | resources/libraries/robot/shared/suite_teardown.robot
+| Resource | resources/libraries/robot/shared/test_teardown.robot
+
*** Keywords ***
| Configure all TGs for traffic script
@@ -421,6 +424,7 @@
| | ${duts}= | Get Matches | ${nodes} | DUT*
| | :FOR | ${dut} | IN | @{duts}
| | | Run keyword | ${dut}.Apply Config
+| | Save VPP PIDs
| | Enable Coredump Limit VPP on All DUTs | ${nodes}
| | Update All Interface Data On All Nodes | ${nodes} | skip_tg=${True}
@@ -434,8 +438,6 @@
| | :FOR | ${key} | IN | @{keys}
| | | ${pid}= | Get From Dictionary | ${setup_vpp_pids} | ${key}
| | | Run Keyword If | $pid is None | FAIL | No VPP PID found on node ${key}
-| | | Run Keyword If | ',' in '${pid}'
-| | | ... | FAIL | More then one VPP PID found on node ${key}: ${pid}
| | Set Test Variable | ${setup_vpp_pids}
| Verify VPP PID in Teardown
@@ -486,17 +488,6 @@
| | Update All Interface Data On All Nodes | ${nodes} | skip_tg_udev=${True}
| | Reset PAPI History On All DUTs | ${nodes}
-| Tear down VPP device test
-# TODO: Generalize this KW if it will not diverge from Functional derivate too
-# much
-| | [Documentation] | Common test teardown for vpp-device tests.
-| | ...
-| | Remove All Added Ports On All DUTs From Topology | ${nodes}
-| | Show Packet Trace on All DUTs | ${nodes}
-| | Show PAPI History On All DUTs | ${nodes}
-| | Vpp Show Errors On All DUTs | ${nodes}
-| | Verify VPP PID in Teardown
-
| Tear down LISP functional test
| | [Documentation] | Common test teardown for functional tests with LISP.
| | ...
@@ -508,19 +499,6 @@
| | Vpp Show Errors On All DUTs | ${nodes}
| | Verify VPP PID in Teardown
-| Tear down LISP functional test with QEMU
-| | [Documentation] | Common test teardown for functional tests with LISP and\
-| | ... | QEMU.
-| | ...
-| | Remove All Added Ports On All DUTs From Topology | ${nodes}
-| | Show Packet Trace on All DUTs | ${nodes}
-| | Show PAPI History On All DUTs | ${nodes}
-| | Show Vpp Settings | ${nodes['DUT1']}
-| | Show Vpp Settings | ${nodes['DUT2']}
-| | Vpp Show Errors On All DUTs | ${nodes}
-| | Tear down QEMU
-| | Verify VPP PID in Teardown
-
| Set up functional test with containers
| | [Documentation]
| | ... | Common test setup for functional tests with containers.
@@ -560,13 +538,6 @@
| | Start VPP in all '${container_group}' containers
| | Append To List | ${container_groups} | ${container_group}
-| Tear down functional test with container
-| | [Documentation]
-| | ... | Common test teardown for functional tests which uses containers.
-| | ...
-| | :FOR | ${container_group} | IN | @{container_groups}
-| | | Destroy all '${container_group}' containers
-
| Stop VPP Service on DUT
| | [Documentation] | Stop the VPP service on the specified node.
| | ...
diff --git a/resources/libraries/robot/shared/qemu.robot b/resources/libraries/robot/shared/qemu.robot
new file mode 100644
index 0000000000..1178fa93b4
--- /dev/null
+++ b/resources/libraries/robot/shared/qemu.robot
@@ -0,0 +1,51 @@
+# 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:
+#
+# 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.
+*** Settings ***
+| Library | resources.libraries.python.L2Util
+| Library | resources.libraries.python.InterfaceUtil
+
+*** Keywords ***
+| Configure VM for vhost L2BD forwarding
+| | [Documentation] | Setup QEMU and start VM with two vhost interfaces.
+| | ...
+| | ... | *Arguments:*
+| | ... | - ${dut_node} - DUT node to start VM on. Type: dictionary
+| | ... | - ${sock1} - Socket path for first Vhost-User interface. Type: string
+| | ... | - ${sock2} - Socket path for second Vhost-User interface. Type: string
+| | ... | - ${qemu_name} - Qemu instance name by which the object will be
+| | ... | accessed (Optional). Type: string
+| | ...
+| | ... | _NOTE:_ This KW sets following test case variable:
+| | ... | - ${${qemu_name}} - VM node info. Type: dictionary
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Configure VM for vhost L2BD forwarding \| ${nodes['DUT1']} \
+| | ... | \| /tmp/sock1 \| /tmp/sock2 \|
+| | ... | \| Configure VM for vhost L2BD forwarding \| ${nodes['DUT2']} \
+| | ... | \| /tmp/sock1 \| /tmp/sock2 \| qemu_instance_2 \|
+| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${qemu_name}=vm_node
+| | Import Library | resources.libraries.python.QemuUtils | node=${dut_node} |
+| | ... | WITH NAME | ${qemu_name}
+| | Set Test Variable | ${${qemu_name}} | ${None}
+| | Run Keyword | ${qemu_name}.Qemu Add Vhost User If | ${sock1}
+| | Run Keyword | ${qemu_name}.Qemu Add Vhost User If | ${sock2}
+| | ${vm}= | Run keyword | ${qemu_name}.Qemu Start
+| | ${br}= | Set Variable | br0
+| | ${vhost1}= | Get Vhost User If Name By Sock | ${vm} | ${sock1}
+| | ${vhost2}= | Get Vhost User If Name By Sock | ${vm} | ${sock2}
+| | Linux Add Bridge | ${vm} | ${br} | ${vhost1} | ${vhost2}
+| | Set Interface State | ${vm} | ${vhost1} | up | if_type=name
+| | Set Interface State | ${vm} | ${vhost2} | up | if_type=name
+| | Set Interface State | ${vm} | ${br} | up | if_type=name
+| | Set Test Variable | ${${qemu_name}} | ${vm}
diff --git a/resources/libraries/robot/shared/suite_teardown.robot b/resources/libraries/robot/shared/suite_teardown.robot
new file mode 100644
index 0000000000..1b738eaeef
--- /dev/null
+++ b/resources/libraries/robot/shared/suite_teardown.robot
@@ -0,0 +1,47 @@
+# 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:
+#
+# 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.
+
+"""Keywords used in suite teardowns."""
+
+*** Settings ***
+| Library | resources.libraries.python.DPDK.DPDKTools
+| ...
+| Documentation | Suite teardown keywords.
+
+*** Keywords ***
+| Tear down suite
+| | [Documentation]
+| | ... | Common suite teardown for tests.
+| | ...
+| | ... | *Arguments:*
+| | ... | - ${actions} - Additional teardown action. Type: list
+| | ...
+| | [Arguments] | @{actions}
+| | ...
+| | :FOR | ${action} | IN | @{actions}
+| | | Run Keyword | Additional Suite Tear Down Action For ${action}
+
+| Additional Suite Tear Down Action For performance
+| | [Documentation]
+| | ... | Additional teardown for suites which uses performance measurement.
+| | ...
+| | Teardown traffic generator | ${tg}
+
+| Additional Suite Tear Down Action For dpdk
+| | [Documentation]
+| | ... | Additional teardown for suites which uses dpdk.
+| | ...
+| | ${duts}= | Get Matches | ${nodes} | DUT*
+| | :FOR | ${dut} | IN | @{duts}
+| | | Cleanup DPDK Environment
+| | | ... | ${nodes['${dut}']} | ${${dut}_if1} | ${${dut}_if2}
diff --git a/resources/libraries/robot/shared/test_teardown.robot b/resources/libraries/robot/shared/test_teardown.robot
new file mode 100644
index 0000000000..e30aa9f41e
--- /dev/null
+++ b/resources/libraries/robot/shared/test_teardown.robot
@@ -0,0 +1,127 @@
+# 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:
+#
+# 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.
+
+"""Keywords used in test teardowns."""
+
+*** Settings ***
+| Documentation | Test teardown keywords.
+
+*** Keywords ***
+| Tear down test
+| | [Documentation]
+| | ... | Common test teardown for tests.
+| | ...
+| | ... | *Arguments:*
+| | ... | - ${actions} - Additional teardown action. Type: list
+| | ...
+| | [Arguments] | @{actions}
+| | ...
+| | Remove All Added Ports On All DUTs From Topology | ${nodes}
+| | Show PAPI History On All DUTs | ${nodes}
+| | Get Core Files on All Nodes | ${nodes}
+| | Verify VPP PID in Teardown
+| | :FOR | ${action} | IN | @{actions}
+| | | Run Keyword | Additional Test Tear Down Action For ${action}
+
+| Additional Test Tear Down Action For performance
+| | [Documentation]
+| | ... | Additional teardown for tests which uses performance measurement.
+| | ...
+| | Set Test Variable | ${pkt_trace} | ${True}
+| | Run Keyword If Test Failed
+| | ... | Send traffic at specified rate | ${perf_trial_duration} | 10000pps
+| | ... | ${frame_size} | ${traffic_profile}
+
+| Additional Test Tear Down Action For packet_trace
+| | [Documentation]
+| | ... | Additional teardown for tests which uses packet trace.
+| | ...
+| | Show Packet Trace on All DUTs | ${nodes}
+
+| Additional Test Tear Down Action For container
+| | [Documentation]
+| | ... | Additional teardown for tests which uses containers.
+| | ...
+| | :FOR | ${container_group} | IN | @{container_groups}
+| | | Destroy all '${container_group}' containers
+
+| Additional Test Tear Down Action For vhost
+| | [Documentation]
+| | ... | Additional teardown for tests which uses vhost(s) and VM(s).
+| | ...
+| | # TODO: Remove IF condition once devicetest is running KernelVM.
+| | Show VPP vhost on all DUTs | ${nodes}
+| | Run Keyword If | "PERFTEST" in @{TEST TAGS} | vnf_manager.Kill All VMs
+| | Run Keyword If | "DEVICETEST" in @{TEST TAGS} | vm_node.Qemu Kill
+
+| Additional Test Tear Down Action For nat
+| | [Documentation]
+| | ... | Additional teardown for tests which uses NAT feature.
+| | ...
+| | ${duts}= | Get Matches | ${nodes} | DUT*
+| | :FOR | ${dut} | IN | @{duts}
+| | | Show NAT verbose | ${nodes['${dut}']}
+
+| Additional Test Tear Down Action For namespace
+| | [Documentation]
+| | ... | Additional teardown for tests which uses namespace.
+| | ...
+| | ${duts}= | Get Matches | ${nodes} | DUT*
+| | :FOR | ${dut} | IN | @{duts}
+| | | Clean Up Namespaces | ${nodes['${dut}']}
+
+| Additional Test Tear Down Action For linux_bridge
+| | [Documentation]
+| | ... | Additional teardown for tests which uses linux_bridge.
+| | ...
+| | ${duts}= | Get Matches | ${nodes} | DUT*
+| | :FOR | ${dut} | IN | @{duts}
+| | | Linux Del Bridge | ${nodes['${dut}']} | ${bid_TAP}
+
+| Additional Test Tear Down Action For acl
+| | [Documentation]
+| | ... | Additional teardown for tests which uses ACL feature.
+| | ...
+| | Run Keyword If Test Failed
+| | ... | Vpp Log Plugin Acl Settings | ${dut1}
+| | Run Keyword If Test Failed | Run Keyword And Ignore Error
+| | ... | Vpp Log Plugin Acl Interface Assignment | ${dut1}
+
+| Additional Test Tear Down Action For macipacl
+| | [Documentation]
+| | ... | Additional teardown for tests which uses MACIP ACL feature.
+| | ...
+| | Run Keyword If Test Failed | Run Keyword And Ignore Error
+| | ... | Vpp Log Macip Acl Settings | ${dut1}
+| | Run Keyword And Ignore Error
+| | ... | Vpp Log Macip Acl Interface Assignment | ${dut1}
+
+| Additional Test Tear Down Action For srv6
+| | [Documentation]
+| | ... | Additional teardown for tests which uses SRv6.
+| | ...
+| | Run Keyword If Test Failed
+| | ... | Show SR Policies on all DUTs | ${nodes}
+| | Run Keyword If Test Failed
+| | ... | Show SR Steering Policies on all DUTs | ${nodes}
+| | Run Keyword If Test Failed | Show SR LocalSIDs on all DUTs | ${nodes}
+
+| Additional Test Tear Down Action For ligato
+| | [Documentation]
+| | ... | Additional teardown for performance tests with Ligato.
+| | ...
+| | Run Keyword If Test Failed
+| | ... | Get Kubernetes logs on all DUTs | ${nodes} | csit
+| | Run Keyword If Test Failed
+| | ... | Describe Kubernetes resource on all DUTs | ${nodes} | csit
+| | Delete Kubernetes resource on all DUTs | ${nodes} | csit
diff --git a/resources/libraries/robot/vm/qemu.robot b/resources/libraries/robot/vm/qemu.robot
deleted file mode 100644
index 765a6cf398..0000000000
--- a/resources/libraries/robot/vm/qemu.robot
+++ /dev/null
@@ -1,86 +0,0 @@
-# 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:
-#
-# 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.
-*** Settings ***
-| Library | resources.libraries.python.IPUtil
-
-*** Keywords ***
-| Configure QEMU vhost and run it
-| | [Documentation]
-| | ... | Setup Qemu with 4 vhost-user interfaces and 4 namespaces.
-| | ... | Each call will be different object instance.
-| | ...
-| | ... | *Arguments:*
-| | ... | - dut_node - Node where to setup qemu. Type: dict
-| | ... | - sock1 - Socket path for first Vhost-User interface. Type: string
-| | ... | - sock2 - Socket path for second Vhost-User interface. Type: string
-| | ... | - sock3 - Socket path for third Vhost-User interface. Type: string
-| | ... | - sock4 - Socket path for forth Vhost-User interface. Type: string
-| | ... | - ip1 - IP address for namespace 1. Type: string
-| | ... | - ip2 - IP address for namespace 2. Type: string
-| | ... | - ip3 - IP address for namespace 3. Type: string
-| | ... | - ip4 - IP address for namespace 4. Type: string
-| | ... | - prefix_length - IP prefix length. Type: int
-| | ... | - qemu_name - Qemu instance name by which the object will be accessed.
-| | ... | Type: string
-| | ... | - mac_ID - MAC address ID used to differentiate qemu instances and
-| | ... | namespaces assigned to them. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Setup QEMU Vhost And Run\| {nodes['DUT1']} \| /tmp/sock1 \
-| | ... | \| /tmp/sock2 \| /tmp/sock3 \| /tmp/sock4 \| 16.0.0.1 \| 16.0.0.2 \
-| | ... | \| 16.0.0.3 \| 16.0.0.4 \| 24 \| qemu_instance_1 \| 06 \|
-| | ...
-| | [Arguments] | ${dut_node} | ${sock1} | ${sock2} | ${sock3} | ${sock4}
-| | ... | ${ip1} | ${ip2} | ${ip3} | ${ip4} | ${prefix_length}
-| | ... | ${qemu_name}=vm_node | ${mac_ID}=${None}
-| | ...
-| | Import Library | resources.libraries.python.QemuUtils \
-| | ... | node=${dut_node} | WITH NAME | ${qemu_name}
-| | Run keyword | ${qemu_name}.Qemu Add Vhost User If | ${sock1}
-| | Run keyword | ${qemu_name}.Qemu Add Vhost User If | ${sock2}
-| | Run keyword | ${qemu_name}.Qemu Add Vhost User If | ${sock3}
-| | Run keyword | ${qemu_name}.Qemu Add Vhost User If | ${sock4}
-| | ${vm}= | Run keyword | ${qemu_name}.Qemu Start
-| | ${vhost1}= | Get Vhost User If Name By Sock | ${vm} | ${sock1}
-| | ${vhost2}= | Get Vhost User If Name By Sock | ${vm} | ${sock2}
-| | ${vhost3}= | Get Vhost User If Name By Sock | ${vm} | ${sock3}
-| | ${vhost4}= | Get Vhost User If Name By Sock | ${vm} | ${sock4}
-| | Set Interface State | ${vm} | ${vhost1} | up | if_type=name
-| | Set Interface State | ${vm} | ${vhost2} | up | if_type=name
-| | Set Interface State | ${vm} | ${vhost3} | up | if_type=name
-| | Set Interface State | ${vm} | ${vhost4} | up | if_type=name
-| | Setup Network Namespace
-| | ... | ${vm} | nmspace1 | ${vhost1} | ${ip1} | ${prefix_length}
-| | Setup Network Namespace
-| | ... | ${vm} | nmspace2 | ${vhost2} | ${ip2} | ${prefix_length}
-| | Setup Network Namespace
-| | ... | ${vm} | nmspace3 | ${vhost3} | ${ip3} | ${prefix_length}
-| | Setup Network Namespace
-| | ... | ${vm} | nmspace4 | ${vhost4} | ${ip4} | ${prefix_length}
-| | Set Test Variable | ${${qemu_name}} | ${vm}
-
-| Tear down QEMU
-| | [Documentation]
-| | ... | Stop specific qemu instance running on DUT.
-| | ...
-| | ... | *Arguments:*
-| | ... | - qemu_name - Qemu instance by name. Type: string
-| | ...
-| | ... | *Example:*
-| | ...
-| | ... | \| Tear down QEMU \| qemu_node_1 \|
-| | ...
-| | [Arguments] | ${qemu_name}=vm_node
-| | ...
-| | Run Keyword | ${qemu_name}.Qemu Kill