Enlarge nc timeout used for netvirt SNAT test
[integration/test.git] / csit / libraries / OpenStackOperations.robot
index 4a668ef36826e723f37df1543e934c9b2fb099d1..67224c3b53406d78457ec27349f959d3ce39e94e 100644 (file)
@@ -1,8 +1,9 @@
 *** Settings ***
 Documentation     Openstack library. This library is useful for tests to create network, subnet, router and vm instances
 Library           SSHLibrary
+Resource          Netvirt.robot
 Resource          Utils.robot
-Variables         ../variables/Variables.py
+Resource          ../variables/Variables.robot
 
 *** Keywords ***
 Source Password
@@ -91,7 +92,7 @@ Delete Port
     ${output}=    Write Commands Until Prompt    neutron -v port-delete ${port_name}    30s
     Close Connection
     Log    ${output}
-    Should Contain    ${output}    Deleted port: ${port_name}
+    Should Match Regexp    ${output}    Deleted port: ${port_name}|Deleted port\\(s\\): ${port_name}
 
 List Ports
     [Documentation]    List ports and return output with neutron client.
@@ -102,6 +103,15 @@ List Ports
     Log    ${output}
     [Return]    ${output}
 
+List Nova VMs
+    [Documentation]    List VMs and return output with nova client.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    nova list    30s
+    Close Connection
+    Log    ${output}
+    [Return]    ${output}
+
 Create And Associate Floating IPs
     [Arguments]    ${external_net}    @{vm_list}
     [Documentation]    Create and associate floating IPs to VMs with nova request
@@ -109,11 +119,13 @@ Create And Associate Floating IPs
     Switch Connection    ${devstack_conn_id}
     ${ip_list}=    Create List    @{EMPTY}
     : FOR    ${vm}    IN    @{vm_list}
-    \    ${output}=    Write Commands Until Prompt    nova floating-ip-create ${external_net} | grep "${external_net}"    30s
+    \    ${output}=    Write Commands Until Prompt    neutron floatingip-create ${external_net}    30s
     \    Log    ${output}
-    \    @{output_words}    Split String    ${output}
-    \    Append To List    ${ip_list}    @{output_words}[3]
-    \    ${output}=    Write Commands Until Prompt    nova floating-ip-associate ${vm} @{output_words}[3]    30s
+    \    @{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
+    \    ${output}=    Write Commands Until Prompt    nova floating-ip-associate ${vm} @{ip}[0]    30s
     \    Log    ${output}
     [Return]    ${ip_list}
 
@@ -175,6 +187,17 @@ Get Net Id
     Log    ${net_id}
     [Return]    ${net_id}
 
+Get Subnet Id
+    [Arguments]    ${subnet_name}    ${devstack_conn_id}
+    [Documentation]    Retrieve the subnet id for the given subnet name
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron subnet-list | grep "${subnet_name}" | awk '{print $2}'    30s
+    Log    ${output}
+    ${splitted_output}=    Split String    ${output}    ${EMPTY}
+    ${subnet_id}=    Get from List    ${splitted_output}    0
+    Log    ${subnet_id}
+    [Return]    ${subnet_id}
+
 Get Port Id
     [Arguments]    ${port_name}    ${devstack_conn_id}
     [Documentation]    Retrieve the port id for the given port name to attach specific vm instance to a particular port
@@ -188,7 +211,7 @@ Get Port Id
 
 Get Router Id
     [Arguments]    ${router1}    ${devstack_conn_id}
-    [Documentation]    Retrieve the net id for the given network name to create specific vm instance
+    [Documentation]    Retrieve the router id for the given router name
     Switch Connection    ${devstack_conn_id}
     ${output}=    Write Commands Until Prompt    neutron router-list | grep "${router1}" | awk '{print $2}'    30s
     Log    ${output}
@@ -216,7 +239,6 @@ Create Vm Instance With Port On Compute Node
     ${hostname_compute_node}=    Run Command On Remote System    ${compute_node}    hostname
     ${output}=    Write Commands Until Prompt    nova boot --image ${image} --flavor ${flavor} --nic port-id=${port_id} ${vm_instance_name} --security-groups ${sg} --availability-zone nova:${hostname_compute_node}    30s
     Log    ${output}
-    Wait Until Keyword Succeeds    25s    5s    Verify VM Is ACTIVE    ${vm_instance_name}
 
 Verify VM Is ACTIVE
     [Arguments]    ${vm_name}
@@ -230,20 +252,27 @@ Verify VM Is ACTIVE
 Verify VMs Received DHCP Lease
     [Arguments]    @{vm_list}
     [Documentation]    Using nova console-log on the provided ${vm_list} to search for the string "obtained" which
-    ...    correlates to the instance receiving it's IP address via DHCP. This should provide a good indication
-    ...    that the instance is fully up and ready.
+    ...    correlates to the instance receiving it's IP address via DHCP. Also retrieved is the ip of the nameserver
+    ...    if available in the console-log output. The keyword will also return a list of the learned ips as it
+    ...    finds them in the console log output, and will have "None" for Vms that no ip was found.
     ${devstack_conn_id}=    Get ControlNode Connection
     Switch Connection    ${devstack_conn_id}
-    ${ip_list}    Create List
+    ${ip_list}    Create List    @{EMPTY}
+    ${dhcp_ip}    Create List    @{EMPTY}
     : FOR    ${vm}    IN    @{vm_list}
-    \    ${output}=    Write Commands Until Prompt    nova console-log ${vm} | grep -i "obtained"    30s
+    \    ${vm_ip_line}=    Write Commands Until Prompt    nova console-log ${vm} | grep -i "obtained"    30s
+    \    Log    ${vm_ip_line}
+    \    @{vm_ip}    Get Regexp Matches    ${vm_ip_line}    [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}
+    \    ${vm_ip_length}    Get Length    ${vm_ip}
+    \    Run Keyword If    ${vm_ip_length}>0    Append To List    ${ip_list}    @{vm_ip}[0]
+    \    ...    ELSE    Append To List    ${ip_list}    None
     \    ${dhcp_ip_line}=    Write Commands Until Prompt    nova console-log ${vm} | grep "^nameserver"    30s
-    \    Log    ${output}
-    \    @{output_words}    Split String    ${output}
-    \    @{dhcp_output_words}    Split String    ${dhcp_ip_line}
-    \    Should Contain    ${output}    obtained
-    \    Append To List    ${ip_list}    @{output_words}[2]
-    [Return]    ${ip_list}    @{dhcp_output_words}[1]
+    \    Log    ${dhcp_ip_line}
+    \    @{dhcp_ip}    Get Regexp Matches    ${dhcp_ip_line}    [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}
+    \    Log    ${dhcp_ip}
+    ${dhcp_length}    Get Length    ${dhcp_ip}
+    Return From Keyword If    ${dhcp_length}==0    ${ip_list}    ${EMPTY}
+    [Return]    ${ip_list}    @{dhcp_ip}[0]
 
 View Vm Console
     [Arguments]    ${vm_instance_names}
@@ -319,7 +348,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
-    Get OvsDebugInfo
 
 Check Ping
     [Arguments]    ${ip_address}
@@ -371,6 +399,35 @@ Test Operations From Vm Instance
     Run Keyword If    ${rcode}    Check Metadata Access
     [Teardown]    Exit From Vm Console
 
+Install Netcat On Controller
+    [Documentation]    Installs Netcat on the controller - this probably shouldn't be here
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    sudo yum install -y nc
+    Log    ${output}
+    Close Connection
+
+Test Netcat Operations From Vm Instance
+    [Arguments]    ${net_name}    ${vm_ip}    ${dest_ip}    ${additional_args}=${EMPTY}    ${port}=12345    ${user}=cirros
+    ...    ${password}=cubswin:)
+    [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}
+    ${output}=    Write Commands Until Prompt    ( ( echo "${server_data}" | sudo timeout 60 nc -l ${additional_args} ${port} ) & )
+    Log    ${output}
+    ${output}=    Write Commands Until Prompt    sudo netstat -nlap | grep ${port}
+    Log    ${output}
+    ${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
+    Log    ${output}
+    Should Match Regexp    ${nc_output}    ${server_data}
+
 Ping Other Instances
     [Arguments]    ${list_of_external_dst_ips}
     [Documentation]    Check reachability with other network's instances.
@@ -388,6 +445,15 @@ Create Router
     Close Connection
     Should Contain    ${output}    Created a new router
 
+List Router
+    [Documentation]    List Router and return output with neutron client.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron router-list    30s
+    Close Connection
+    Log    ${output}
+    [Return]    ${output}
+
 Add Router Interface
     [Arguments]    ${router_name}    ${interface_name}
     ${devstack_conn_id}=    Get ControlNode Connection
@@ -396,6 +462,16 @@ Add Router Interface
     Close Connection
     Should Contain    ${output}    Added interface
 
+Show Router Interface
+    [Arguments]    ${router_name}
+    [Documentation]    List Router interface associated with given Router and return output with neutron client.
+    ${devstack_conn_id}=    Get ControlNode Connection
+    Switch Connection    ${devstack_conn_id}
+    ${output}=    Write Commands Until Prompt    neutron router-port-list ${router_name} -f csv    30s
+    Close Connection
+    Log    ${output}
+    [Return]    ${output}
+
 Add Router Gateway
     [Arguments]    ${router_name}    ${network_name}
     ${devstack_conn_id}=    Get ControlNode Connection
@@ -460,10 +536,32 @@ Get DumpFlows And Ovsconfig
     Write Commands Until Expected Prompt    sudo ovs-vsctl show    ]>
     Write Commands Until Expected Prompt    sudo ovs-vsctl list Open_vSwitch    ]>
     Write Commands Until Expected Prompt    sudo ovs-ofctl show br-int -OOpenFlow13    ]>
+    Write Commands Until Expected Prompt    sudo ovs-ofctl dump-ports-desc br-int -OOpenFlow13    ]>
     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-flows br-int -OOpenFlow13    ]>
     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-groups br-int -OOpenFlow13    ]>
     Write Commands Until Expected Prompt    sudo ovs-ofctl dump-group-stats br-int -OOpenFlow13    ]>
 
+Get Karaf Log Type From Test Start
+    [Arguments]    ${ip}    ${test_name}    ${type}    ${user}=${ODL_SYSTEM_USER}    ${password}=${ODL_SYSTEM_PASSWORD}    ${prompt}=${ODL_SYSTEM_PROMPT}
+    ...    ${log_file}=${WORKSPACE}/${BUNDLEFOLDER}/data/log/karaf.log
+    ${cmd}    Set Variable    sed '1,/ROBOT MESSAGE: Starting test ${test_name}/d' ${log_file} | grep '${type}'
+    ${output}    Run Command On Controller    ${ip}    ${cmd}    ${user}    ${password}    ${prompt}
+    Log    ${output}
+
+Get Karaf Log Types From Test Start
+    [Arguments]    ${ip}    ${test_name}    ${types}    ${user}=${ODL_SYSTEM_USER}    ${password}=${ODL_SYSTEM_PASSWORD}    ${prompt}=${ODL_SYSTEM_PROMPT}
+    ...    ${log_file}=${WORKSPACE}/${BUNDLEFOLDER}/data/log/karaf.log
+    : FOR    ${type}    IN    @{types}
+    \    Get Karaf Log Type From Test Start    ${ip}    ${test_name}    ${type}    ${user}    ${password}
+    \    ...    ${prompt}    ${log_file}
+
+Get Karaf Log Events From Test Start
+    [Arguments]    ${test_name}    ${user}=${ODL_SYSTEM_USER}    ${password}=${ODL_SYSTEM_PASSWORD}    ${prompt}=${ODL_SYSTEM_PROMPT}
+    ${log_types} =    Create List    ERROR    WARN    Exception
+    Run Keyword If    0 < ${NUM_ODL_SYSTEM}    Get Karaf Log Types From Test Start    ${ODL_SYSTEM_IP}    ${test_name}    ${log_types}
+    Run Keyword If    1 < ${NUM_ODL_SYSTEM}    Get Karaf Log Types From Test Start    ${ODL_SYSTEM_2_IP}    ${test_name}    ${log_types}
+    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}
     Utils.Flexible SSH Login    ${OS_USER}    ${DEVSTACK_SYSTEM_PASSWORD}
@@ -477,6 +575,12 @@ Get OvsDebugInfo
     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}
 
+Get Test Teardown Debugs
+    [Arguments]    ${test_name}=${TEST_NAME}
+    Get OvsDebugInfo
+    Get Model Dump    ${HA_PROXY_IP}
+    Get Karaf Log Events From Test Start    ${test_name}
+
 Show Debugs
     [Arguments]    @{vm_indices}
     [Documentation]    Run these commands for debugging, it can list state of VM instances and ip information in control node
@@ -488,6 +592,7 @@ Show Debugs
     \    ${output}=    Write Commands Until Prompt    nova show ${index}    30s
     \    Log    ${output}
     Close Connection
+    List Nova VMs
     List Networks
     List Subnets
     List Ports