*** 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
Get Tenant ID From Network
[Arguments] ${network_uuid}
[Documentation] Returns tenant ID by reading it from existing network.
- ${resp} = RequestsLibrary.Get Request session ${CONFIG_API}/neutron:neutron/networks/network/${network_uuid}/
- Log ${resp.content}
- ${matches} = Get Lines Containing String ${resp.content} tenant-id
- ${matches}= Fetch From Right ${matches} :
- ${tenant_id}= Strip String ${matches} characters=}]"
+ ${resp}= Get_From_Uri uri=${CONFIG_API}/neutron:neutron/networks/network/${network_uuid}/ accept=${ACCEPT_EMPTY} session=session
+ ${tenant_id}= Utils.Extract Value From Content ${resp} /network/0/tenant-id strip
[Return] ${tenant_id}
Create Network
Should Match Regexp ${output} Deleted network: ${network_name}|Deleted network\\(s\\): ${network_name}
Create SubNet
- [Arguments] ${network_name} ${subnet} ${range_ip}
+ [Arguments] ${network_name} ${subnet} ${range_ip} ${additional_args}=${EMPTY}
[Documentation] Create SubNet for the Network with neutron request.
${devstack_conn_id}= Get ControlNode Connection
Switch Connection ${devstack_conn_id}
- ${output}= Write Commands Until Prompt neutron -v subnet-create ${network_name} ${range_ip} --name ${subnet} 30s
+ ${output}= Write Commands Until Prompt neutron -v subnet-create ${network_name} ${range_ip} --name ${subnet} ${additional_args} 30s
Close Connection
Log ${output}
Should Contain ${output} Created a new subnet
${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.
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
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${ip_list}= Create List @{EMPTY}
+ : FOR ${vm} IN @{vm_list}
+ \ ${output}= Write Commands Until Prompt neutron floatingip-create ${external_net} 30s
+ \ Log ${output}
+ \ @{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}
+
Verify Gateway Ips
[Documentation] Verifies the Gateway Ips with dump flow.
${output}= Write Commands Until Prompt sudo ovs-ofctl -O OpenFlow13 dump-flows br-int
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
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}
${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}
Verify VMs Received DHCP Lease
[Arguments] @{vm_list}
- [Documentation] Using nova console-log on the provided ${vm_name} 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.
+ [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. 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}
Log ${output}
Should Not Contain ${output} 64 bytes
+Ping Vm From Control Node
+ [Arguments] ${vm_floating_ip}
+ [Documentation] Ping VM floating IP from control node
+ Log ${vm_floating_ip}
+ ${devstack_conn_id}= Get ControlNode Connection
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt ping -c 3 ${vm_floating_ip} 20s
+ Log ${output}
+ Close Connection
+ Should Contain ${output} 64 bytes
+
Ping From Instance
[Arguments] ${dest_vm_ip}
[Documentation] Ping to the expected destination ip.
[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}
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.
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
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
+ Switch Connection ${devstack_conn_id}
+ ${output}= Write Commands Until Prompt neutron -v router-gateway-set ${router_name} ${network_name}
+ Close Connection
+ Should Contain ${output} Set gateway
+
Remove Interface
[Arguments] ${router_name} ${interface_name}
[Documentation] Remove Interface to the subnets.
Switch Connection ${devstack_conn_id}
${output}= Write Commands Until Prompt neutron -v router-delete ${router_name} 60s
Close Connection
- Should Contain ${output} Deleted router:
+ Should Match Regexp ${output} Deleted router: ${router_name}|Deleted router\\(s\\): ${router_name}
Get DumpFlows And Ovsconfig
[Arguments] ${openstack_node_ip}
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}
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}
+ [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}
\ ${output}= Write Commands Until Prompt nova show ${index} 30s
\ Log ${output}
Close Connection
+ List Nova VMs
List Networks
List Subnets
List Ports