Add ability/flag to clean OS in suite setup
[integration/test.git] / csit / libraries / OpenStackOperations.robot
index 64baaacf74b63eb5c4324561d9792505873ac72e..9ed3806d847b33fb2915cb53c5558787d976c0d0 100644 (file)
@@ -1,12 +1,16 @@
 *** Settings ***
 Documentation     Openstack library. This library is useful for tests to create network, subnet, router and vm instances
 Library           Collections
-Library           SSHLibrary
 Library           OperatingSystem
+Library           RequestsLibrary
+Library           SSHLibrary
 Resource          DataModels.robot
-Resource          Utils.robot
-Resource          SSHKeywords.robot
+Resource          DevstackUtils.robot
 Resource          L2GatewayOperations.robot
+Resource          OVSDB.robot
+Resource          SetupUtils.robot
+Resource          SSHKeywords.robot
+Resource          Utils.robot
 Resource          ../variables/Variables.robot
 Resource          ../variables/netvirt/Variables.robot
 Variables         ../variables/netvirt/Modules.py
@@ -15,7 +19,7 @@ Variables         ../variables/netvirt/Modules.py
 Get Tenant ID From Security Group
     [Documentation]    Returns tenant ID by reading it from existing default security-group.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack security group show default | grep "| tenant_id" | awk '{print $4}'
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Get Tenant ID From Network
@@ -30,7 +34,7 @@ Create Network
     [Documentation]    Create Network with neutron request.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack network create ${network_name} ${additional_args}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Update Network
@@ -39,7 +43,7 @@ Update Network
     ${cmd}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton'    neutron -v net-update ${network_name} ${additional_args}    openstack network set ${network_name} ${additional_args}
     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Show Network
@@ -47,21 +51,21 @@ Show Network
     [Documentation]    Show Network with neutron request.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack network show ${network_name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 List Networks
     [Documentation]    List networks and return output with neutron client.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack network list
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 List Subnets
     [Documentation]    List subnets and return output with neutron client.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet list
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Delete Network
@@ -69,14 +73,14 @@ Delete Network
     [Documentation]    Delete Network with neutron request.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack network delete ${network_name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Create SubNet
     [Arguments]    ${network_name}    ${subnet}    ${range_ip}    ${additional_args}=${EMPTY}
     [Documentation]    Create SubNet for the Network with neutron request.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet create --network ${network_name} --subnet-range ${range_ip} ${subnet} ${additional_args}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Update SubNet
     [Arguments]    ${subnet_name}    ${additional_args}=${EMPTY}
@@ -84,7 +88,7 @@ Update SubNet
     ${cmd}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton'    neutron -v subnet-update ${subnet_name} ${additional_args}    openstack subnet set ${subnet_name} ${additional_args}
     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Show SubNet
@@ -92,7 +96,7 @@ Show SubNet
     [Documentation]    Show subnet with neutron request.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet show ${subnet_name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Create Port
@@ -107,14 +111,14 @@ Create Port
     ${cmd}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton'    neutron -v port-create ${network_name} --name ${port_name} --security-group ${sg} ${additional_args} ${allowed_pairs_argv}    openstack port create --network ${network_name} ${port_name} --security-group ${sg} ${additional_args} ${allowed_pairs_argv}
     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Update Port
     [Arguments]    ${port_name}    ${additional_args}=${EMPTY}
     [Documentation]    Update port with neutron request.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port set ${port_name} ${additional_args}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Show Port
@@ -122,7 +126,7 @@ Show Port
     [Documentation]    Show port with neutron request.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port show ${port_name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Delete Port
@@ -130,20 +134,20 @@ Delete Port
     [Documentation]    Delete Port with neutron request.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port delete ${port_name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 List Ports
     [Documentation]    List ports and return output with neutron client.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port list
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 List Nova VMs
     [Documentation]    List VMs and return output with nova client.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack server list --all-projects
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Create And Associate Floating IPs
@@ -153,16 +157,23 @@ Create And Associate Floating IPs
     : FOR    ${vm}    IN    @{vm_list}
     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack floating ip create ${external_net}
     \    Log    ${output}
-    \    Should Not Be True    ${rc}
+    \    Should Be True    '${rc}' == '0'
     \    @{ip}    Get Regexp Matches    ${output}    [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}
     \    ${ip_length}    Get Length    ${ip}
     \    Run Keyword If    ${ip_length}>0    Append To List    ${ip_list}    @{ip}[0]
     \    ...    ELSE    Append To List    ${ip_list}    None
     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack server add floating ip ${vm} @{ip}[0]
     \    Log    ${output}
-    \    Should Not Be True    ${rc}
+    \    Should Be True    '${rc}' == '0'
     [Return]    ${ip_list}
 
+Delete Floating IP
+    [Arguments]    ${fip}
+    [Documentation]    Delete floating ip with neutron request.
+    ${rc}    ${output}=    Run And Return Rc And Output    openstack floating ip delete ${fip}
+    Log    ${output}
+    Should Be True    '${rc}' == '0'
+
 Verify Gateway Ips
     [Documentation]    Verifies the Gateway Ips with dump flow.
     ${output}=    Write Commands Until Prompt And Log    sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
@@ -186,7 +197,7 @@ Delete SubNet
     [Documentation]    Delete SubNet for the Network with neutron request.
     Log    ${subnet}
     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet delete ${subnet}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Verify No Gateway Ips
     [Documentation]    Verifies the Gateway Ips removed with dump flow.
@@ -201,37 +212,37 @@ Delete Vm Instance
     Log    ${output}
 
 Get Net Id
-    [Arguments]    ${network_name}    ${devstack_conn_id}
+    [Arguments]    ${network_name}
     [Documentation]    Retrieve the net id for the given network name to create specific vm instance
     ${rc}    ${output}=    Run And Return Rc And Output    openstack network list | grep "${network_name}" | awk '{print $2}'
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${net_id}=    Get from List    ${splitted_output}    0
     [Return]    ${net_id}
 
 Get Subnet Id
-    [Arguments]    ${subnet_name}    ${devstack_conn_id}
+    [Arguments]    ${subnet_name}
     [Documentation]    Retrieve the subnet id for the given subnet name
     ${rc}    ${output}=    Run And Return Rc And Output    openstack subnet show "${subnet_name}" | grep " id " | awk '{print $4}'
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${subnet_id}=    Get from List    ${splitted_output}    0
     [Return]    ${subnet_id}
 
 Get Port Id
-    [Arguments]    ${port_name}    ${devstack_conn_id}
+    [Arguments]    ${port_name}
     [Documentation]    Retrieve the port id for the given port name to attach specific vm instance to a particular port
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port list | grep "${port_name}" | awk '{print $2}'
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${port_id}=    Get from List    ${splitted_output}    0
     [Return]    ${port_id}
 
 Get Router Id
-    [Arguments]    ${router1}    ${devstack_conn_id}
+    [Arguments]    ${router1}
     [Documentation]    Retrieve the router id for the given router name
     ${rc}    ${output}=    Run And Return Rc And Output    openstack router list -f table | grep "${router1}" | awk '{print $2}'
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${router_id}=    Get from List    ${splitted_output}    0
     [Return]    ${router_id}
@@ -241,17 +252,17 @@ Create Vm Instances
     ...    ${max}=1
     [Documentation]    Create X Vm Instance with the net id of the Netowrk.
     ${image}    Set Variable If    "${image}"=="${EMPTY}"    ${CIRROS_${OPENSTACK_BRANCH}}    ${image}
-    ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
+    ${net_id}=    Get Net Id    ${net_name}
     : FOR    ${VmElement}    IN    @{vm_instance_names}
     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack server create --image ${image} --flavor ${flavor} --nic net-id=${net_id} ${VmElement} --security-group ${sg} --min ${min} --max ${max}
-    \    Should Not Be True    ${rc}
+    \    Should Be True    '${rc}' == '0'
     \    Log    ${output}
 
 Create Vm Instance With Port
     [Arguments]    ${port_name}    ${vm_instance_name}    ${image}=${EMPTY}    ${flavor}=m1.nano    ${sg}=default
     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
     ${image}    Set Variable If    "${image}"=="${EMPTY}"    ${CIRROS_${OPENSTACK_BRANCH}}    ${image}
-    ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
+    ${port_id}=    Get Port Id    ${port_name}
     ${rc}    ${output}=    Run And Return Rc And Output    openstack server create --image ${image} --flavor ${flavor} --nic port-id=${port_id} ${vm_instance_name} --security-group ${sg}
     Log    ${output}
 
@@ -259,21 +270,21 @@ Create Vm Instance With Ports
     [Arguments]    ${port_name}    ${port2_name}    ${vm_instance_name}    ${image}=${EMPTY}    ${flavor}=m1.nano    ${sg}=default
     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
     ${image}    Set Variable If    "${image}"=="${EMPTY}"    ${CIRROS_${OPENSTACK_BRANCH}}    ${image}
-    ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
-    ${port2_id}=    Get Port Id    ${port2_name}    ${devstack_conn_id}
+    ${port_id}=    Get Port Id    ${port_name}
+    ${port2_id}=    Get Port Id    ${port2_name}
     ${rc}    ${output}=    Run And Return Rc And Output    openstack server create --image ${image} --flavor ${flavor} --nic port-id=${port_id} --nic port-id=${port2_id} ${vm_instance_name} --security-group ${sg}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Create Vm Instance With Port On Compute Node
     [Arguments]    ${port_name}    ${vm_instance_name}    ${compute_node}    ${image}=${EMPTY}    ${flavor}=m1.nano    ${sg}=default
     [Documentation]    Create One VM instance using given ${port_name} and for given ${compute_node}
     ${image}    Set Variable If    "${image}"=="${EMPTY}"    ${CIRROS_${OPENSTACK_BRANCH}}    ${image}
-    ${port_id}=    Get Port Id    ${port_name}    ${devstack_conn_id}
+    ${port_id}=    Get Port Id    ${port_name}
     ${hostname_compute_node}=    Get Hypervisor Hostname From IP    ${compute_node}
     ${rc}    ${output}=    Run And Return Rc And Output    openstack server create --image ${image} --flavor ${flavor} --nic port-id=${port_id} --security-group ${sg} --availability-zone nova:${hostname_compute_node} ${vm_instance_name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Get Hypervisor Hostname From IP
     [Arguments]    ${hypervisor_ip}
@@ -281,16 +292,16 @@ Get Hypervisor Hostname From IP
     ...    the full listing is logged first, then followed by a grep | cut to focus on the actual hostname to return
     ${rc}    ${output}    Run And Return Rc And Output    openstack hypervisor list
     Log    ${output}
-    ${rc}    ${hostname}=    Run And Return Rc And Output    openstack hypervisor list -f value | grep ${hypervisor_ip} | cut -d" " -f 2
+    ${rc}    ${hostname}=    Run And Return Rc And Output    openstack hypervisor list -f value | grep "${hypervisor_ip} " | cut -d" " -f 2
     Log    ${hostname}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${hostname}
 
 Create Nano Flavor
     [Documentation]    Create a nano flavor
     ${rc}    ${output}=    Run And Return Rc And Output    openstack flavor create m1.nano --id auto --ram 64 --disk 0 --vcpus 1
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Verify VM Is ACTIVE
     [Arguments]    ${vm_name}
@@ -331,13 +342,13 @@ Collect VM IP Addresses
     [Return]    ${ip_list}    ${dhcp_ip}
 
 Get Match
-    [Arguments]    ${text}    ${regexp}
+    [Arguments]    ${text}    ${regexp}    ${index}=0
     [Documentation]    Wrapper around Get Regexp Matches to return None if not found or the first match if found.
     @{matches} =    String.Get Regexp Matches    ${text}    ${regexp}
     ${matches_length} =    Get Length    ${matches}
-    BuiltIn.Set Test Variable    ${match}    None
-    BuiltIn.Run Keyword If    ${matches_length} > 0    BuiltIn.Set Test Variable    ${match}    @{matches}[0]
-    [Return]    ${match}
+    BuiltIn.Set Suite Variable    ${OS_MATCH}    None
+    BuiltIn.Run Keyword If    ${matches_length} > ${index}    BuiltIn.Set Suite Variable    ${OS_MATCH}    @{matches}[${index}]
+    [Return]    ${OS_MATCH}
 
 Get VM IP
     [Arguments]    ${fail_on_none}    ${vm}
@@ -347,9 +358,9 @@ Get VM IP
     ${vm_ip} =    Set Variable    None
     ${dhcp_ip} =    Set Variable    None
     ${match} =    Get Match    ${vm_console_output}    ${REGEX_OBTAINED}
-    ${vm_ip} =    Get Match    ${match}    ${REGEX_IPV4}
-    ${match} =    Get Match    ${vm_console_output}    ${REGEX_NAMESERVER}
-    ${dhcp_ip} =    Get Match    ${match}    ${REGEX_IPV4}
+    ${vm_ip} =    Get Match    ${match}    ${REGEX_IPV4}    0
+    ${match} =    Get Match    ${vm_console_output}    ${REGEX_IPROUTE}
+    ${dhcp_ip} =    Get Match    ${match}    ${REGEX_IPV4}    1
     BuiltIn.Run Keyword If    '${fail_on_none}' == 'true'    Should Not Contain    ${vm_ip}    None
     BuiltIn.Run Keyword If    '${fail_on_none}' == 'true'    Should Not Contain    ${dhcp_ip}    None
     [Return]    ${vm_ip}    ${dhcp_ip}    ${vm_console_output}
@@ -365,7 +376,7 @@ Get VM IPs
     @{vm_ips}    BuiltIn.Create List    @{EMPTY}
     : FOR    ${vm}    IN    @{vms}
     \    Poll VM Is ACTIVE    ${vm}
-    \    ${status}    ${ips_and_console_log}    Run Keyword And Ignore Error    Wait Until Keyword Succeeds    120s    15s
+    \    ${status}    ${ips_and_console_log}    Run Keyword And Ignore Error    Wait Until Keyword Succeeds    180s    15s
     \    ...    Get VM IP    true    ${vm}
     \    # If there is trouble with Get VM IP, the status will be FAIL and the return value will be a string of what went
     \    # wrong. We need to handle both the PASS and FAIL cases. In the FAIL case we know we wont have access to the
@@ -376,26 +387,31 @@ Get VM IPs
     \    BuiltIn.Run Keyword If    "${status}" == "FAIL"    Collections.Append To List    ${vm_ips}    None
     \    ${rc}    ${vm_console_output}=    BuiltIn.Run Keyword If    "${status}" == "FAIL"    Run And Return Rc And Output    openstack console log show ${vm}
     \    BuiltIn.Run Keyword If    "${status}" == "FAIL"    BuiltIn.Log    ${vm_console_output}
+    Copy DHCP Files From Control Node
     [Return]    @{vm_ips}    ${ips_and_console_log[1]}
 
 Collect VM IPv6 SLAAC Addresses
-    [Arguments]    ${fail_on_none}    ${prefix}    @{vm_list}
-    [Documentation]    Using the console-log on the provided ${vm_list} to search for the string "inet6" which
-    ...    correlates to the instance generated IPv6 address, based on the ${prefix} received from ODL (SLAAC mode).
-    ${ip_list}    Create List    @{EMPTY}
+    [Arguments]    ${fail_on_none}    ${vm_list}    ${network}    ${subnet}
+    [Documentation]    For each VM parse output of "openstack server show" to get its IPv6 address from Neutron DB.
+    ...    Then try to connect to each VM by SSH and execute there "ip -6 a" command. This double-check allows to
+    ...    obtain and compare IP info (Neutron DB vs dnsmasque/ODL DHCP) and to test L2 connectivity as well.
+    ...    Returns an empty list if no IPv6 addresses found or if SSH connection fails.
+    ...    Otherwise, returns a list of IPv6 addresses.
+    ${ipv6_list}    Create List    @{EMPTY}
     : FOR    ${vm}    IN    @{vm_list}
-    \    Log    ${vm}
-    \    ${rc}    ${vm_ip_line}=    Run And Return Rc And Output    openstack console log show ${vm} | grep -i "inet6"
-    \    Log    ${vm_ip_line}
-    \    Log    ${rc}
-    \    @{vm_ip_list}    Get Regexp Matches    ${vm_ip_line}    ${prefix}
-    \    ${vm_ip_length}    Get Length    ${vm_ip_list}
-    \    Run Keyword If    ${vm_ip_length}>0    Append To List    ${ip_list}    @{vm_ip_list}[0]
-    \    ...    ELSE    Append To List    ${ip_list}    None
-    \    Log    ${ip_list}
-    Run Keyword If    '${fail_on_none}' == 'true'    Should Not Contain    ${ip_list}    None
-    Log    ${ip_list}
-    [Return]    ${ip_list}
+    \    ${rc}    ${output}=    Run And Return Rc And Output    openstack server show ${vm} -f shell
+    \    Log    ${output}
+    \    Should Be True    '${rc}' == '0'
+    \    ${pattern}=    Replace String    ${subnet}    ::/64    (:[a-f0-9]{,4}){,4}
+    \    @{vm_ipv6}=    Get Regexp Matches    ${output}    ${pattern}
+    \    ${vm_ip_length}    Get Length    ${vm_ipv6}[0]
+    \    ${ipv6_data_from_vm}=    Run Keyword If    ${vm_ip_length}>0    Execute Command on VM Instance    ${network}    ${vm_ipv6[0]}
+    \    ...    ip -6 a
+    \    @{ipv6}=    Get Regexp Matches    ${ipv6_data_from_vm}    ${pattern}
+    \    ${ipv6_addr_list_length}    Get Length    @{ipv6}
+    \    Run Keyword If    ${ipv6_addr_list_length}>0    Append To List    ${ipv6_list}    ${ipv6[0]}
+    \    ...    ELSE    Append To List    ${ipv6_list}    None
+    [Return]    ${ipv6_list}
 
 View Vm Console
     [Arguments]    ${vm_instance_names}
@@ -403,54 +419,35 @@ View Vm Console
     : FOR    ${VmElement}    IN    @{vm_instance_names}
     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack server show ${VmElement}
     \    Log    ${output}
-    \    Should Not Be True    ${rc}
+    \    Should Be True    '${rc}' == '0'
     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack console log show ${VmElement}
     \    Log    ${output}
-    \    Should Not Be True    ${rc}
+    \    Should Be True    '${rc}' == '0'
 
 Ping Vm From DHCP Namespace
     [Arguments]    ${net_name}    ${vm_ip}
     [Documentation]    Reach all Vm Instance with the net id of the Netowrk.
-    Log    ${vm_ip}
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
-    ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
-    Log    ${net_id}
+    Get ControlNode Connection
+    ${net_id}=    Get Net Id    ${net_name}
     ${output}=    Write Commands Until Prompt And Log    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
-    Close Connection
     Should Contain    ${output}    64 bytes
 
 Ping From DHCP Should Not Succeed
     [Arguments]    ${net_name}    ${vm_ip}
     [Documentation]    Should Not Reach Vm Instance with the net id of the Netowrk.
     Return From Keyword If    "skip_if_${SECURITY_GROUP_MODE}" in @{TEST_TAGS}
-    Log    ${vm_ip}
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
-    ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
-    Log    ${net_id}
-    ${output}=    Write Commands Until Prompt    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
-    Close Connection
-    Log    ${output}
+    Get ControlNode Connection
+    ${net_id}=    Get Net Id    ${net_name}
+    ${output}=    Write Commands Until Prompt And Log    sudo ip netns exec qdhcp-${net_id} ping -c 3 ${vm_ip}    20s
     Should Not Contain    ${output}    64 bytes
 
 Ping Vm From Control Node
     [Arguments]    ${vm_floating_ip}    ${additional_args}=${EMPTY}
     [Documentation]    Ping VM floating IP from control node
-    Log    ${vm_floating_ip}
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
+    Get ControlNode Connection
     ${output}=    Write Commands Until Prompt And Log    ping ${additional_args} -c 3 ${vm_floating_ip}    20s
-    Close Connection
     Should Contain    ${output}    64 bytes
 
-Ping From Instance
-    [Arguments]    ${dest_vm_ip}
-    [Documentation]    Ping to the expected destination ip.
-    ${output}=    Write Commands Until Expected Prompt    ping -c 3 ${dest_vm_ip}    ${OS_SYSTEM_PROMPT}
-    Log    ${output}
-    [Return]    ${output}
-
 Curl Metadata Server
     [Documentation]    Ping to the expected destination ip.
     ${output}=    Write Commands Until Expected Prompt    curl -i http://169.254.169.254    ${OS_SYSTEM_PROMPT}
@@ -471,7 +468,6 @@ Exit From Vm Console
     [Documentation]    Check if the session has been able to login to the VM instance and exit the instance
     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance    cirros
     Run Keyword If    ${rcode}    Write Commands Until Prompt    exit
-    Close Connection
 
 Check Ping
     [Arguments]    ${ip_address}    ${ttl}=64
@@ -495,14 +491,10 @@ Check Metadata Access
 Execute Command on VM Instance
     [Arguments]    ${net_name}    ${vm_ip}    ${cmd}    ${user}=cirros    ${password}=cubswin:)
     [Documentation]    Login to the vm instance using ssh in the network, executes a command inside the VM and returns the ouput.
-    ${devstack_conn_id} =    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
-    ${net_id} =    Get Net Id    ${net_name}    ${devstack_conn_id}
-    Log    ${vm_ip}
+    Get ControlNode Connection
+    ${net_id} =    Get Net Id    ${net_name}
     ${output} =    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ssh ${user}@${vm_ip} -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null    password:
-    Log    ${output}
     ${output} =    Write Commands Until Expected Prompt    ${password}    ${OS_SYSTEM_PROMPT}
-    Log    ${output}
     ${rcode} =    Run Keyword And Return Status    Check If Console Is VmInstance
     ${output} =    Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ${cmd}    ${OS_SYSTEM_PROMPT}
     [Teardown]    Exit From Vm Console
@@ -512,14 +504,10 @@ Test Operations From Vm Instance
     [Arguments]    ${net_name}    ${src_ip}    ${dest_ips}    ${user}=cirros    ${password}=cubswin:)    ${ttl}=64
     ...    ${ping_should_succeed}=True    ${check_metadata}=True
     [Documentation]    Login to the vm instance using ssh in the network.
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
-    Log    ${src_ip}
-    ${net_id}=    Get Net Id    ${net_name}    ${devstack_conn_id}
+    Get ControlNode Connection
+    ${net_id}=    Get Net Id    ${net_name}
     ${output}=    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no ${user}@${src_ip} -o UserKnownHostsFile=/dev/null    password:
-    Log    ${output}
     ${output}=    Write Commands Until Expected Prompt    ${password}    ${OS_SYSTEM_PROMPT}
-    Log    ${output}
     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ifconfig    ${OS_SYSTEM_PROMPT}
     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    route -n    ${OS_SYSTEM_PROMPT}
@@ -527,7 +515,6 @@ Test Operations From Vm Instance
     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    arp -an    ${OS_SYSTEM_PROMPT}
     Run Keyword If    ${rcode}    Write Commands Until Expected Prompt    ip -f inet6 neigh show    ${OS_SYSTEM_PROMPT}
     : FOR    ${dest_ip}    IN    @{dest_ips}
-    \    Log    ${dest_ip}
     \    ${string_empty}=    Run Keyword And Return Status    Should Be Empty    ${dest_ip}
     \    Run Keyword If    ${string_empty}    Continue For Loop
     \    Run Keyword If    ${rcode} and "${ping_should_succeed}" == "True"    Check Ping    ${dest_ip}    ttl=${ttl}
@@ -542,13 +529,10 @@ Test Netcat Operations From Vm Instance
     [Documentation]    Use Netcat to test TCP/UDP connections to the controller
     ${client_data}    Set Variable    Test Client Data
     ${server_data}    Set Variable    Test Server Data
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
-    Log    ${vm_ip}
+    Get ControlNode Connection
     ${output}=    Write Commands Until Prompt And Log    ( ( echo "${server_data}" | sudo timeout 60 nc -l ${additional_args} ${port} ) & )
     ${output}=    Write Commands Until Prompt And Log    sudo netstat -nlap | grep ${port}
     ${nc_output}=    Execute Command on VM Instance    ${net_name}    ${vm_ip}    sudo echo "${client_data}" | nc -v -w 5 ${additional_args} ${dest_ip} ${port}
-    Log    ${nc_output}
     ${output}=    Execute Command on VM Instance    ${net_name}    ${vm_ip}    sudo route -n
     Log    ${output}
     ${output}=    Execute Command on VM Instance    ${net_name}    ${vm_ip}    sudo arp -an
@@ -560,51 +544,55 @@ Ping Other Instances
     [Documentation]    Check reachability with other network's instances.
     ${rcode}=    Run Keyword And Return Status    Check If Console Is VmInstance
     : FOR    ${dest_ip}    IN    @{list_of_external_dst_ips}
-    \    Log    ${dest_ip}
     \    Check Ping    ${dest_ip}
 
 Create Router
     [Arguments]    ${router_name}
     [Documentation]    Create Router and Add Interface to the subnets.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack router create ${router_name}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 List Routers
     [Documentation]    List Routers and return output with neutron client.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack router list -f value
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Add Router Interface
     [Arguments]    ${router_name}    ${interface_name}
     ${rc}    ${output}=    Run And Return Rc And Output    openstack router add subnet ${router_name} ${interface_name}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Show Router Interface
     [Arguments]    ${router_name}
     [Documentation]    List Routers interface associated with given Router and return output with neutron client.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port list --router ${router_name} -f value
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Add Router Gateway
     [Arguments]    ${router_name}    ${external_network_name}
     ${cmd}=    Set Variable If    '${OPENSTACK_BRANCH}'=='stable/newton'    neutron -v router-gateway-set ${router_name} ${external_network_name}    openstack router set ${router_name} --external-gateway ${external_network_name}
     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Remove Interface
     [Arguments]    ${router_name}    ${interface_name}
     [Documentation]    Remove Interface to the subnets.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack router remove subnet ${router_name} ${interface_name}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
+
+Remove Gateway
+    [Arguments]    ${router_name}
+    [Documentation]    Remove external gateway from the router.
+    BuiltIn.Log    openstack router unset ${router_name} --external-gateway
 
 Update Router
     [Arguments]    ${router_name}    ${cmd}
     [Documentation]    Update the router with the command. Router name and command should be passed as argument.
     ${rc}    ${output} =    Run And Return Rc And Output    openstack router set ${router_name} ${cmd}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Show Router
     [Arguments]    ${router_name}    ${options}
@@ -616,15 +604,13 @@ Delete Router
     [Arguments]    ${router_name}
     [Documentation]    Delete Router and Interface to the subnets.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack router delete ${router_name}
-    Should Not Be True    ${rc}
+    Log    ${output}
+    Should Be True    '${rc}' == '0'
 
 Get DumpFlows And Ovsconfig
-    [Arguments]    ${openstack_node_ip}
+    [Arguments]    ${conn_id}
     [Documentation]    Get the OvsConfig and Flow entries from OVS from the Openstack Node
-    Log    ${openstack_node_ip}
-    SSHLibrary.Open Connection    ${openstack_node_ip}    prompt=${DEFAULT_LINUX_PROMPT}
-    SSHKeywords.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
-    SSHLibrary.Set Client Configuration    timeout=${default_devstack_prompt_timeout}
+    SSHLibrary.Switch Connection    ${conn_id}
     Write Commands Until Expected Prompt    ip -o link    ${DEFAULT_LINUX_PROMPT_STRICT}
     Write Commands Until Expected Prompt    ip -o addr    ${DEFAULT_LINUX_PROMPT_STRICT}
     Write Commands Until Expected Prompt    ip route    ${DEFAULT_LINUX_PROMPT_STRICT}
@@ -664,16 +650,14 @@ Get Karaf Log Events From Test Start
     Run Keyword If    2 < ${NUM_ODL_SYSTEM}    Get Karaf Log Types From Test Start    ${ODL_SYSTEM_3_IP}    ${test_name}    ${log_types}
 
 Get ControlNode Connection
-    ${control_conn_id}=    SSHLibrary.Open Connection    ${OS_CONTROL_NODE_IP}    prompt=${DEFAULT_LINUX_PROMPT_STRICT}
-    SSHKeywords.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
-    SSHLibrary.Set Client Configuration    timeout=30s
-    [Return]    ${control_conn_id}
+    SSHLibrary.Switch Connection    ${OS_CNTL_CONN_ID}
+    [Return]    ${OS_CNTL_CONN_ID}
 
 Get OvsDebugInfo
     [Documentation]    Get the OvsConfig and Flow entries from all Openstack nodes
-    Run Keyword If    0 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_CONTROL_NODE_IP}
-    Run Keyword If    1 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_COMPUTE_1_IP}
-    Run Keyword If    2 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_COMPUTE_2_IP}
+    Run Keyword If    0 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_CNTL_CONN_ID}
+    Run Keyword If    1 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_CMP1_CONN_ID}
+    Run Keyword If    2 < ${NUM_OS_SYSTEM}    Get DumpFlows And Ovsconfig    ${OS_CMP2_CONN_ID}
 
 Get Test Teardown Debugs
     [Arguments]    ${test_name}=${TEST_NAME}
@@ -688,10 +672,8 @@ Get Test Teardown Debugs For SFC
 Show Debugs
     [Arguments]    @{vm_indices}
     [Documentation]    Run these commands for debugging, it can list state of VM instances and ip information in control node
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
+    Get ControlNode Connection
     ${output}=    Write Commands Until Prompt And Log    sudo ip netns list
-    Close Connection
     : FOR    ${index}    IN    @{vm_indices}
     \    ${rc}    ${output}=    Run And Return Rc And Output    nova show ${index}
     \    Log    ${output}
@@ -707,7 +689,7 @@ List Security Groups
     ...    credentials are already sourced
     ${rc}    ${output}=    Run And Return Rc And Output    openstack security group list
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Neutron Security Group Show
@@ -715,7 +697,7 @@ Neutron Security Group Show
     [Documentation]    Displays the neutron security group configurations that belongs to a given neutron security group name
     ${rc}    ${output}=    Run And Return Rc And Output    openstack security group show ${SecurityGroupRuleName}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Neutron Port Show
@@ -723,17 +705,16 @@ Neutron Port Show
     [Documentation]    Display the port configuration that belong to a given neutron port
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port show ${PortName}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Neutron Security Group Create
     [Arguments]    ${SecurityGroupName}    ${additional_args}=${EMPTY}
     [Documentation]    Create a security group with specified name ,description & protocol value according to security group template
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
+    Get ControlNode Connection
     ${rc}    ${output}=    Run And Return Rc And Output    openstack security group create ${SecurityGroupName} ${additional_args}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     ${sgp_id}=    Should Match Regexp    ${output}    [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
     Log    ${sgp_id}
     [Return]    ${output}    ${sgp_id}
@@ -743,7 +724,7 @@ Neutron Security Group Update
     [Documentation]    Updating security groups
     ${rc}    ${output}=    Run And Return Rc And Output    openstack security group set ${SecurityGroupName} ${additional_args}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Delete SecurityGroup
@@ -751,7 +732,7 @@ Delete SecurityGroup
     [Documentation]    Delete Security group
     ${rc}    ${output}=    Run And Return Rc And Output    openstack security group delete ${sg_name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Neutron Security Group Rule Create
     [Arguments]    ${Security_group_name}    &{Kwargs}
@@ -785,7 +766,7 @@ Neutron Security Group Rule Create
     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
     ${rule_id}=    Should Match Regexp    ${output}    [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
     Log    ${rule_id}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}    ${rule_id}
 
 Neutron Security Group Rule Create Legacy Cli
@@ -820,7 +801,7 @@ Neutron Security Group Rule Create Legacy Cli
     ${rc}    ${output}=    Run And Return Rc And Output    ${cmd}
     ${rule_id}=    Should Match Regexp    ${output}    [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
     Log    ${rule_id}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}    ${rule_id}
 
 Security Group Create Without Default Security Rules
@@ -834,12 +815,12 @@ Delete All Security Group Rules
     [Documentation]    Delete all security rules from a specified security group
     ${rc}    ${sg_rules_output}=    Run And Return Rc And Output    openstack security group rule list ${sg_name} -cID -fvalue
     Log    ${sg_rules_output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     @{sg_rules}=    Split String    ${sg_rules_output}    \n
     : FOR    ${rule}    IN    @{sg_rules}
     \    ${rc}    ${output}=    Run And Return Rc And Output    openstack security group rule delete ${rule}
     \    Log    ${output}
-    \    Should Not Be True    ${rc}
+    \    Should Be True    '${rc}' == '0'
 
 Create Allow All SecurityGroup
     [Arguments]    ${sg_name}    ${ether_type}=IPv4
@@ -857,7 +838,7 @@ Create Neutron Port With Additional Params
     [Documentation]    Create Port With given additional parameters
     ${rc}    ${output}=    Run And Return Rc And Output    neutron -v port-create ${network_name} --name ${port_name} ${additional_args}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     ${port_id}=    Should Match Regexp    ${OUTPUT}    [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
     Log    ${port_id}
     [Return]    ${OUTPUT}    ${port_id}
@@ -867,7 +848,7 @@ Get Ports MacAddr
     [Documentation]    Retrieve the port MacAddr for the given list of port name and return the MAC address list.
     ${MacAddr-list}    Create List
     : FOR    ${portName}    IN    @{portName_list}
-    \    ${macAddr}=    OpenStackOperations.Get Port Mac    ${portName}    ${devstack_conn_id}
+    \    ${macAddr}=    OpenStackOperations.Get Port Mac    ${portName}
     \    Append To List    ${MacAddr-list}    ${macAddr}
     [Return]    ${MacAddr-list}
 
@@ -877,16 +858,16 @@ Get Port Ip
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port list | grep "${port_name}" | awk -F\\' '{print $2}'
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${port_ip}=    Get from List    ${splitted_output}    0
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${port_ip}
 
 Get Port Mac
-    [Arguments]    ${port_name}    ${conn_id}=${devstack_conn_id}
+    [Arguments]    ${port_name}
     [Documentation]    Keyword would return the MAC ID of the ${port_name} received.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack port show ${port_name} | grep mac_address | awk '{print $4}'
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${port_mac}=    Get from List    ${splitted_output}    0
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${port_mac}
 
 Create L2Gateway
@@ -901,19 +882,19 @@ Create L2Gateway Connection
     [Documentation]    Keyword would create a new L2 Gateway Connection for ${gw_name} to ${net_name} (Using Neutron CLI).
     ${rc}    ${l2gw_output}=    Run And Return Rc And Output    ${L2GW_CONN_CREATE} ${gw_name} ${net_name}
     Log    ${l2gw_output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${l2gw_output}
 
 Get All L2Gateway
     [Documentation]    Keyword to return all the L2 Gateways available (Using Neutron CLI).
     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_GET_YAML}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Get All L2Gateway Connection
     [Documentation]    Keyword to return all the L2 Gateway connections available (Using Neutron CLI).
     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_GET_CONN_YAML}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Get L2Gateway
@@ -921,7 +902,7 @@ Get L2Gateway
     [Documentation]    Keyword to check if the ${gw_id} is available in the L2 Gateway list (Using Neutron CLI).
     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_SHOW} ${gw_id}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Get L2gw Id
@@ -929,7 +910,7 @@ Get L2gw Id
     [Documentation]    Keyword to retrieve the L2 Gateway ID for the ${l2gw_name} (Using Neutron CLI).
     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_GET} | grep "${l2gw_name}" | awk '{print $2}'
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${l2gw_id}=    Get from List    ${splitted_output}    0
     [Return]    ${l2gw_id}
@@ -939,7 +920,7 @@ Get L2gw Connection Id
     [Documentation]    Keyword to retrieve the L2 Gateway Connection ID for the ${l2gw_name} (Using Neutron CLI).
     ${l2gw_id}=    OpenStackOperations.Get L2gw Id    ${l2gw_name}
     ${rc}    ${output}=    Run And Return Rc And Output    ${L2GW_GET_CONN} | grep "${l2gw_id}" | awk '{print $2}'
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${splitted_output}=    Split String    ${output}    ${EMPTY}
     ${l2gw_conn_id}=    Get from List    ${splitted_output}    0
@@ -985,43 +966,39 @@ Add Security Group To VM
     [Documentation]    Add the security group provided to the given VM.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack server add security group ${vm} ${sg}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
 
 Remove Security Group From VM
     [Arguments]    ${vm}    ${sg}
     [Documentation]    Remove the security group provided to the given VM.
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
+    Get ControlNode Connection
     ${output}=    Write Commands Until Prompt And Log    openstack server remove security group ${vm} ${sg}
-    Close Connection
 
 Create SFC Flow Classifier
     [Arguments]    ${name}    ${src_ip}    ${dest_ip}    ${protocol}    ${dest_port}    ${neutron_src_port}
     [Documentation]    Create a flow classifier for SFC
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc flow classifier create --ethertype IPv4 --source-ip-prefix ${src_ip}/32 --destination-ip-prefix ${dest_ip}/32 --protocol ${protocol} --destination-port ${dest_port}:${dest_port} --logical-source-port ${neutron_src_port} ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     Should Contain    ${output}    ${name}
     [Return]    ${output}
 
 Delete SFC Flow Classifier
     [Arguments]    ${name}
     [Documentation]    Delete a SFC flow classifier
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
+    Get ControlNode Connection
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc flow classifier delete ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Create SFC Port Pair
     [Arguments]    ${name}    ${port_in}    ${port_out}
     [Documentation]    Creates a neutron port pair for SFC
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
+    Get ControlNode Connection
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc port pair create --ingress=${port_in} --egress=${port_out} ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     Should Contain    ${output}    ${name}
     [Return]    ${output}
 
@@ -1030,7 +1007,7 @@ Delete SFC Port Pair
     [Documentation]    Delete a SFC port pair
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc port pair delete ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Create SFC Port Pair Group
@@ -1038,7 +1015,7 @@ Create SFC Port Pair Group
     [Documentation]    Creates a port pair group with a single port pair for SFC
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc port pair group create --port-pair ${port_pair} ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     Should Contain    ${output}    ${name}
     [Return]    ${output}
 
@@ -1047,17 +1024,17 @@ Create SFC Port Pair Group With Two Pairs
     [Documentation]    Creates a port pair group with two port pairs for SFC
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc port pair group create --port-pair ${port_pair1} --port-pair ${port_pair2} ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     Should Contain    ${output}    ${name}
     [Return]    ${output}
 
 Delete SFC Port Pair Group
     [Arguments]    ${name}
     [Documentation]    Delete a SFC port pair group
-    ${devstack_conn_id}=    Get ControlNode Connection
+    Get ControlNode Connection
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc port pair group delete ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Create SFC Port Chain
@@ -1065,7 +1042,7 @@ Create SFC Port Chain
     [Documentation]    Creates a port pair chain with two port groups and a singel classifier.
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc port chain create --port-pair-group ${pg1} --port-pair-group ${pg2} --flow-classifier ${fc} ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     Should Contain    ${output}    ${name}
     [Return]    ${output}
 
@@ -1074,7 +1051,7 @@ Delete SFC Port Chain
     [Documentation]    Delete a SFC port chain
     ${rc}    ${output}=    Run And Return Rc And Output    openstack sfc port chain delete ${name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     [Return]    ${output}
 
 Reboot Nova VM
@@ -1082,14 +1059,13 @@ Reboot Nova VM
     [Documentation]    Reboot NOVA VM
     ${rc}    ${output}=    Run And Return Rc And Output    openstack server reboot --wait ${vm_name}
     Log    ${output}
-    Should Not Be True    ${rc}
+    Should Be True    '${rc}' == '0'
     Wait Until Keyword Succeeds    35s    10s    Verify VM Is ACTIVE    ${vm_name}
 
-Remove RSA Key From KnowHosts
+Remove RSA Key From KnownHosts
     [Arguments]    ${vm_ip}
     [Documentation]    Remove RSA
-    ${devstack_conn_id}=    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
+    Get ControlNode Connection
     ${output}=    Write Commands Until Prompt And Log    sudo cat /root/.ssh/known_hosts    30s
     ${output}=    Write Commands Until Prompt And Log    sudo ssh-keygen -f "/root/.ssh/known_hosts" -R ${vm_ip}    30s
     ${output}=    Write Commands Until Prompt    sudo cat "/root/.ssh/known_hosts"    30s
@@ -1097,12 +1073,124 @@ Remove RSA Key From KnowHosts
 Wait For Routes To Propogate
     [Arguments]    ${networks}    ${subnets}
     [Documentation]    Check propagated routes
-    ${devstack_conn_id} =    Get ControlNode Connection
-    Switch Connection    ${devstack_conn_id}
+    Get ControlNode Connection
     : FOR    ${INDEX}    IN RANGE    0    1
-    \    ${net_id}=    Get Net Id    @{networks}[${INDEX}]    ${devstack_conn_id}
+    \    ${net_id}=    Get Net Id    @{networks}[${INDEX}]
     \    ${is_ipv6}=    Get Regexp Matches    @{subnets}[${INDEX}]    ${IP6_REGEX}
     \    ${length}=    Get Length    ${is_ipv6}
     \    ${cmd}=    Set Variable If    ${length} == 0    ip route    ip -6 route
     \    ${output}=    Write Commands Until Expected Prompt    sudo ip netns exec qdhcp-${net_id} ${cmd}    ]>
     \    Should Contain    ${output}    @{subnets}[${INDEX}]
+
+Neutron Cleanup
+    [Arguments]    ${vms}=@{EMPTY}    ${networks}=@{EMPTY}    ${subnets}=@{EMPTY}    ${ports}=@{EMPTY}    ${sgs}=@{EMPTY}
+    : FOR    ${vm}    IN    @{vms}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete Vm Instance    ${vm}
+    : FOR    ${port}    IN    @{ports}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete Port    ${port}
+    : FOR    ${subnet}    IN    @{subnets}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete SubNet    ${subnet}
+    : FOR    ${network}    IN    @{networks}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete Network    ${network}
+    : FOR    ${sg}    IN    @{sgs}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete SecurityGroup    ${sg}
+
+OpenStack List All
+    [Documentation]    Get a list of different OpenStack resources that might be in use.
+    @{modules} =    BuiltIn.Create List    floating ip    server    router    port    network
+    ...    subnet    security group    security group rule
+    : FOR    ${module}    IN    @{modules}
+    \    OpenStack CLI    openstack ${module} list
+
+OpenStack CLI Get List
+    [Arguments]    ${cmd}
+    [Documentation]    Return a json list from the output of an OpenStack command.
+    ${json} =    OpenStack CLI    ${cmd}
+    @{list} =    RequestsLibrary.To Json    ${json}
+    BuiltIn.Log    ${list}
+    [Return]    @{list}
+
+OpenStack CLI
+    [Arguments]    ${cmd}
+    [Documentation]    Run the given OpenStack ${cmd}.
+    ${rc}    ${output} =    OperatingSystem.Run And Return Rc And Output    ${cmd}
+    BuiltIn.Log    ${output}
+    Should Be True    '${rc}' == '0'
+    [Return]    ${output}
+
+OpenStack Cleanup All
+    [Documentation]    Cleanup all Openstack resources with best effort. The keyword will query for all resources
+    ...    in use and then attempt to delete them. Errors are ignored to allow the cleanup to continue.
+    @{fips} =    OpenStack CLI Get List    openstack floating ip list -f json
+    : FOR    ${fip}    IN    @{fips}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete Floating IP    ${fip['ID']}
+    @{vms} =    OpenStack CLI Get List    openstack server list -f json
+    : FOR    ${vm}    IN    @{vms}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete Vm Instance    ${vm['ID']}
+    @{routers} =    OpenStack CLI Get List    openstack router list -f json
+    : FOR    ${router}    IN    @{routers}
+    \    BuiltIn.Run Keyword And Ignore Error    Cleanup Router    ${router['ID']}
+    @{ports} =    OpenStack CLI Get List    openstack port list -f json
+    : FOR    ${port}    IN    @{ports}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete Port    ${port['ID']}
+    @{networks} =    OpenStack CLI Get List    openstack network list -f json
+    : FOR    ${network}    IN    @{networks}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete Subnet    ${network['Subnets']}
+    \    BuiltIn.Run Keyword And Ignore Error    Delete Network    ${network['ID']}
+    @{security_groups} =    OpenStack CLI Get List    openstack security group list -f json
+    : FOR    ${security_group}    IN    @{security_groups}
+    \    BuiltIn.Run Keyword If    "${security_group['Name']}" != "default"    BuiltIn.Run Keyword And Ignore Error    Delete SecurityGroup    ${security_group['ID']}
+    OpenStack List All
+
+Cleanup Router
+    [Arguments]    ${id}
+    [Documentation]    Delete a router, but first remove any interfaces or gateways so that the delete will be successful.
+    @{ports} =    OpenStack CLI Get List    openstack port list --router ${id} -f json --long
+    : FOR    ${port}    IN    @{ports}
+    \    ${subnet_id} =    Get Match    ${port['Fixed IP Addresses']}    [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}    0
+    \    BuiltIn.Run Keyword If    "${port['Device Owner']}" == "network:router_gateway"    BuiltIn.Run Keyword And Ignore Error    Remove Gateway    ${id}
+    \    BuiltIn.Run Keyword If    "${port['Device Owner']}" == "network:router_interface"    BuiltIn.Run Keyword And Ignore Error    Remove Interface    ${id}    ${subnet_id}
+    BuiltIn.Run Keyword And Ignore Error    Delete Router    ${id}
+
+OpenStack Suite Setup
+    [Documentation]    Wrapper teardown keyword that can be used in any suite running in an openstack environement
+    SetupUtils.Setup_Utils_For_Setup_And_Teardown
+    Run Keyword If    "${PRE_CLEAN_OPENSTACK_ALL}"=="True"    OpenStack Cleanup All
+    DevstackUtils.Devstack Suite Setup
+    Add OVS Logging On All OpenStack Nodes
+
+OpenStack Suite Teardown
+    [Documentation]    Wrapper teardown keyword that can be used in any suite running in an openstack environement
+    ...    to clean up all openstack resources. For example, all instances, networks, ports, etc will be listed and
+    ...    and deleted. As other global cleanup tasks are needed, they can be added here and the suites will all
+    ...    benefit automatically.
+    OpenStack Cleanup All
+    SSHLibrary.Close All Connections
+
+Copy DHCP Files From Control Node
+    [Documentation]    Copy the current DHCP files to the robot vm. The keyword must be called
+    ...    after the subnet(s) are created and before the subnet(s) are deleted.
+    ${suite_} =    BuiltIn.Evaluate    """${SUITE_NAME}""".replace(" ","_").replace("/","_").replace(".","_")
+    ${dstdir} =    Set Variable    /tmp/qdhcp/${suite_}
+    OperatingSystem.Create Directory    ${dstdir}
+    Get ControlNode Connection
+    BuiltIn.Run Keyword And Ignore Error    SSHLibrary.Get Directory    /opt/stack/data/neutron/dhcp    ${dstdir}    recursive=True
+
+Is Feature Installed
+    [Arguments]    ${features}=none
+    : FOR    ${feature}    IN    ${features}
+    \    ${status}    ${output}    Run Keyword And Ignore Error    Builtin.Should Contain    ${CONTROLLERFEATURES}    ${feature}
+    \    Return From Keyword If    "${status}" == "PASS"    True
+    [Return]    False
+
+Add OVS Logging On All OpenStack Nodes
+    [Documentation]    Add higher levels of OVS logging to all the OpenStack nodes
+    Run Keyword If    0 < ${NUM_OS_SYSTEM}    OVSDB.Add OVS Logging    ${OS_CNTL_CONN_ID}
+    Run Keyword If    1 < ${NUM_OS_SYSTEM}    OVSDB.Add OVS Logging    ${OS_CMP1_CONN_ID}
+    Run Keyword If    2 < ${NUM_OS_SYSTEM}    OVSDB.Add OVS Logging    ${OS_CMP2_CONN_ID}
+
+Reset OVS Logging On All OpenStack Nodes
+    [Documentation]    Reset the OVS logging to all the OpenStack nodes
+    Run Keyword If    0 < ${NUM_OS_SYSTEM}    OVSDB.Reset OVS Logging    ${OS_CNTL_CONN_ID}
+    Run Keyword If    1 < ${NUM_OS_SYSTEM}    OVSDB.Reset OVS Logging    ${OS_CMP1_CONN_ID}
+    Run Keyword If    2 < ${NUM_OS_SYSTEM}    OVSDB.Reset OVS Logging    ${OS_CMP2_CONN_ID}