Resource ../variables/netvirt/Variables.robot
Variables ../variables/netvirt/Modules.py
+*** Variables ***
+@{VALIDATION_KEYWORDS} Verify Services Verify Expected Default Tunnels Verify Expected Default Tables On Nodes
+${VALIDATION_FILE} /tmp/validations.txt
+
*** Keywords ***
Get Tenant ID From Security Group
[Documentation] Returns tenant ID by reading it from existing default security-group.
${output} = OpenStack CLI openstack network create ${network_name} ${additional_args}
[Return] ${output}
+Create Multiple Networks
+ [Arguments] @{name_of_networks}
+ [Documentation] Create required number of networks and return a list of the resulting network ids
+ ${net_list_ids} = BuiltIn.Create List @{EMPTY}
+ : FOR ${net} IN @{name_of_networks}
+ \ ${output} = OpenStackOperations.Create Network ${net}
+ \ ${net_id} = Get Regexp Matches ${output} ${REGEX_UUID}
+ \ Collections.Append To List ${net_list_ids} ${net_id}
+ [Return] @{net_list_ids}
+
Update Network
[Arguments] ${network_name} ${additional_args}=${EMPTY}
[Documentation] Update Network with neutron request.
[Documentation] Create SubNet for the Network with neutron request.
${output} = OpenStack CLI openstack subnet create --network ${network_name} --subnet-range ${range_ip} ${subnet_name} ${additional_args}
+Create Multiple Subnets
+ [Arguments] ${network_names} ${subnet_names} ${subnet_cidr}
+ [Documentation] Create required number of subnets for previously created networks and return subnet id
+ ${number_of_networks} = BuiltIn.Get Length ${network_names}
+ @{subnet_id_list} = BuiltIn.Create List @{EMPTY}
+ : FOR ${index} IN RANGE ${number_of_networks}
+ \ OpenStackOperations.Create SubNet ${network_names[${index}]} ${subnet_names[${index}]} ${subnet_cidr[${index}]}
+ ${sub_list} = OpenStackOperations.List Subnets
+ : FOR ${index} IN RANGE ${number_of_networks}
+ \ BuiltIn.Should Contain ${sub_list} ${subnet_names[${index}]}
+ \ ${subnet_id} = OpenStackOperations.Get Subnet Id ${subnet_names[${index}]}
+ \ Collections.Append To List ${subnet_id_list} ${subnet_id}
+ [Return] @{subnet_id_list}
+
Update SubNet
[Arguments] ${subnet_name} ${additional_args}=${EMPTY}
[Documentation] Update subnet with openstack subnet set request.
${router_id} = Collections.Get from List ${splitted_output} 0
[Return] ${router_id}
+Get VMs OVS Port Number
+ [Arguments] ${ip_address} ${portname}
+ [Documentation] Get the port number for given portname
+ ${subportid} = OpenStackOperations.Get Sub Port Id ${portname}
+ ${vm_port_number} = OVSDB.Get Port Number ${subportid} ${ip_address}
+ [Return] ${vm_port_number}
+
Add New Image From Url
[Arguments] ${image_url} ${image_name}
[Documentation] To add new qcow2 images for testing.
BuiltIn.Should Contain ${output} [${mac_uppercase}]
Check If Instance Is Ready For Ssh Login Using PublicKey
- [Arguments] ${net_name} ${vm_ip} ${user}=centos ${idfile}=/tmp/odlkey
+ [Arguments] ${net_name} ${vm_ip} ${user}=centos ${idfile}=/tmp/odlkey ${console}=cirros
[Documentation] Ensure the VM is reachable from ssh as tests would require. This keyword will use publickey authentication
${output} = Execute Command on VM Instance with PublicKey Auth ${net_name} ${vm_ip} ifconfig user=${user} idfile=${idfile}
+ ... console=${console}
BuiltIn.Should Contain ${output} ${vm_ip}
Check If Instance Is Ready For Ssh Login Using Password
- [Arguments] ${net_name} ${vm_ip} ${user}=cirros
+ [Arguments] ${net_name} ${vm_ip} ${user}=cirros ${password}=cubswin:) ${console}=cirros
[Documentation] Ensure the VM is reachable from ssh as tests would require. This keyword will use password authentication
- ${output} = Execute Command on VM Instance ${net_name} ${vm_ip} ifconfig
+ ${output} = Execute Command on VM Instance ${net_name} ${vm_ip} ifconfig ${user} ${password}
+ ... console=${console}
BuiltIn.Should Contain ${output} ${vm_ip}
Get VM IPs
OpenStackOperations.Copy DHCP Files From Control Node
[Return] @{vm_ips} ${ips_and_console_log[1]}
+Get All VM IP Addresses
+ [Arguments] ${conn_id} ${vm_name}
+ [Documentation] Show information of a given two port VM and grep for two ip address. VM name should be sent as arguments.
+ SSHLibrary.Switch Connection ${conn_id}
+ ${cmd} = BuiltIn.Set Variable openstack server show ${vm_name}
+ ${output} = OpenStackOperations.OpenStack CLI ${cmd}
+ BuiltIn.Log ${output}
+ ${address_output} = OpenStackOperations.OpenStack CLI ${cmd} | grep "addresses" | awk '{print $4$5}'
+ @{vm_ips} = String.Get Regexp Matches ${address_output} ${REGEX_IPV4}
+ [Return] @{vm_ips}
+
Get Subnet Gateway Ip
[Arguments] ${subnet_name}
[Documentation] Show information of a subnet and grep for subnet gateway ip address
${output} = DevstackUtils.Write Commands Until Prompt And Log exit
Check If Console Is VmInstance
+ [Arguments] ${console}=cirros
[Documentation] Check if the session has been able to login to the VM instance
${output} = Utils.Write Commands Until Expected Prompt id ${OS_SYSTEM_PROMPT}
- BuiltIn.Should Not Contain ${output} jenkins
+ BuiltIn.Should Contain ${output} ${console}
Exit From Vm Console
+ [Arguments] ${console}=cirros
[Documentation] Check if the session has been able to login to the VM instance and exit the instance
- ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance
+ ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance ${console}
BuiltIn.Run Keyword If ${rcode} DevstackUtils.Write Commands Until Prompt exit
Check Ping
- [Arguments] ${ip_address} ${ttl}=64
+ [Arguments] ${ip_address} ${ttl}=64 ${ping_tries}=3
[Documentation] Run Ping command on the IP available as argument
${ethertype} = String.Get Regexp Matches ${ip_address} ${IP_REGEX}
- ${output} = BuiltIn.Run Keyword If ${ethertype} Utils.Write Commands Until Expected Prompt ping -t ${ttl} -c 3 ${ip_address} ${OS_SYSTEM_PROMPT}
- ... ELSE Utils.Write Commands Until Expected Prompt ping6 -t ${ttl} -c 3 ${ip_address} ${OS_SYSTEM_PROMPT}
+ ${ping} = BuiltIn.Set Variable If ${ethertype} ping ping6
+ ${cmd} = BuiltIn.Set Variable rc=0; for count in `seq 1 ${ping_tries}`; do ${ping} -W1 -t${ttl} -c1 ${ip_address}; rc=$?; if [ $rc -eq 0 ]; then break; fi; done; echo ping_rc=$rc
+ ${output} = Utils.Write Commands Until Expected Regexp ${cmd} ping_rc=\\d+ 120
+ BuiltIn.Log output: ${output}
BuiltIn.Should Contain ${output} 64 bytes
Check No Ping
Execute Command on VM Instance
[Arguments] ${net_name} ${vm_ip} ${cmd} ${user}=cirros ${password}=cubswin:) ${cmd_timeout}=30s
+ ... ${console}=cirros
[Documentation] Login to the vm instance using ssh in the network, executes a command inside the VM and returns the ouput.
OpenStackOperations.Get ControlNode Connection
${net_id} = OpenStackOperations.Get Net Id ${net_name}
${output} = Utils.Write Commands Until Expected Prompt sudo ip netns exec qdhcp-${net_id} ssh ${user}@${vm_ip} -o MACs=hmac-sha1 -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=password password:
${output} = Utils.Write Commands Until Expected Prompt ${password} ${OS_SYSTEM_PROMPT}
- ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance
+ ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance ${console}
${output} = BuiltIn.Run Keyword If ${rcode} Utils.Write Commands Until Expected Prompt ${cmd} ${OS_SYSTEM_PROMPT} timeout=${cmd_timeout}
- [Teardown] Exit From Vm Console
+ [Teardown] Exit From Vm Console ${console}
[Return] ${output}
Execute Command on VM Instance With PublicKey Auth
- [Arguments] ${net_name} ${vm_ip} ${cmd} ${user}=centos ${idfile}=/tmp/odlkey
+ [Arguments] ${net_name} ${vm_ip} ${cmd} ${user}=centos ${idfile}=/tmp/odlkey ${console}=cirros
[Documentation] Login to the vm instance using ssh publickey in the network, executes a command inside the VM and returns the ouput.
OpenStackOperations.Get ControlNode Connection
${net_id} = OpenStackOperations.Get Net Id ${net_name}
${output} = Utils.Write Commands Until Expected Prompt sudo ip netns exec qdhcp-${net_id} ssh -i ${idfile} ${user}@${vm_ip} -o MACs=hmac-sha1 -o ConnectTimeout=5 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PreferredAuthentications=publickey prompt=${OS_SYSTEM_PROMPT} timeout=60s
- ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance
+ ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance ${console}
${output} = BuiltIn.Run Keyword If ${rcode} Utils.Write Commands Until Expected Prompt ${cmd} ${OS_SYSTEM_PROMPT}
- [Teardown] Exit From Vm Console
+ [Teardown] Exit From Vm Console ${console}
[Return] ${output}
Copy File To VM Instance With PublicKey Auth
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
+ ... ${ping_should_succeed}=True ${check_metadata}=True ${console}=cirros ${ping_tries}=3
[Documentation] Login to the vm instance using ssh in the network.
OpenStackOperations.Get ControlNode Connection
${net_id} = OpenStackOperations.Get Net Id ${net_name}
${output} = Utils.Write Commands Until Expected Prompt sudo ip netns exec qdhcp-${net_id} ssh -o MACs=hmac-sha1 -o ConnectTimeout=5 -o StrictHostKeyChecking=no ${user}@${src_ip} -o UserKnownHostsFile=/dev/null password: 10s
${output} = Utils.Write Commands Until Expected Prompt ${password} ${OS_SYSTEM_PROMPT}
- ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance
+ ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance ${console}
BuiltIn.Run Keyword If ${rcode} Utils.Write Commands Until Expected Prompt ifconfig ${OS_SYSTEM_PROMPT}
BuiltIn.Run Keyword If ${rcode} Utils.Write Commands Until Expected Prompt route -n ${OS_SYSTEM_PROMPT}
BuiltIn.Run Keyword If ${rcode} Utils.Write Commands Until Expected Prompt route -A inet6 ${OS_SYSTEM_PROMPT}
: FOR ${dest_ip} IN @{dest_ips}
\ ${string_empty} = BuiltIn.Run Keyword And Return Status Should Be Empty ${dest_ip}
\ BuiltIn.Run Keyword If ${string_empty} Continue For Loop
- \ BuiltIn.Run Keyword If ${rcode} and "${ping_should_succeed}" == "True" OpenStackOperations.Check Ping ${dest_ip} ttl=${ttl}
+ \ BuiltIn.Run Keyword If ${rcode} and "${ping_should_succeed}" == "True" OpenStackOperations.Check Ping ${dest_ip} ttl=${ttl} ping_tries=${ping_tries}
\ ... ELSE OpenStackOperations.Check No Ping ${dest_ip} ttl=${ttl}
${ethertype} = String.Get Regexp Matches ${src_ip} ${IP_REGEX}
BuiltIn.Run Keyword If ${rcode} and "${check_metadata}" and ${ethertype} == "True" OpenStackOperations.Check Metadata Access
- [Teardown] Exit From Vm Console
+ [Teardown] Exit From Vm Console ${console}
Test Netcat Operations From Vm Instance
[Arguments] ${net_name} ${vm_ip} ${dest_ip} ${additional_args}=${EMPTY} ${port}=12345 ${user}=cirros
BuiltIn.Should Match Regexp ${nc_output} ${server_data}
Ping Other Instances
- [Arguments] ${list_of_external_dst_ips}
+ [Arguments] ${list_of_external_dst_ips} ${console}=cirros
[Documentation] Check reachability with other network's instances.
- ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance
+ ${rcode} = BuiltIn.Run Keyword And Return Status OpenStackOperations.Check If Console Is VmInstance ${console}
: FOR ${dest_ip} IN @{list_of_external_dst_ips}
\ OpenStackOperations.Check Ping ${dest_ip}
OpenStackOperations.Get OvsDebugInfo
BuiltIn.Run Keyword And Ignore Error DataModels.Get Model Dump ${HA_PROXY_IP} ${netvirt_data_models}
KarafKeywords.Fail If Exceptions Found During Test ${test_name} fail=${fail}
+ : FOR ${i} IN RANGE ${NUM_ODL_SYSTEM}
+ \ BuiltIn.Run Keyword And Ignore Error Issue_Command_On_Karaf_Console trace:transactions ${ODL_SYSTEM_${i+1}_IP}
Get Suite Debugs
Get Test Teardown Debugs test_name=${SUITE_NAME} fail=False
${protocol} BuiltIn.Run Keyword If ${Kwargs} Collections.Pop From Dictionary ${Kwargs} protocol default=${None}
${remote_group_id} BuiltIn.Run Keyword If ${Kwargs} Collections.Pop From Dictionary ${Kwargs} remote_group_id default=${None}
${remote_ip_prefix} BuiltIn.Run Keyword If ${Kwargs} Collections.Pop From Dictionary ${Kwargs} remote_ip_prefix default=${None}
+ ${remote_ip} BuiltIn.Run Keyword If ${Kwargs} Collections.Pop From Dictionary ${Kwargs} remote_ip default=${None}
${cmd} = BuiltIn.Set Variable openstack security group rule create ${Security_group_name}
${cmd} = BuiltIn.Run Keyword If '${description}'!='None' BuiltIn.Catenate ${cmd} --description ${description}
... ELSE BuiltIn.Catenate ${cmd}
... ELSE BuiltIn.Catenate ${cmd}
${cmd} = BuiltIn.Run Keyword If '${remote_ip_prefix}'!='None' BuiltIn.Catenate ${cmd} --src-ip ${remote_ip_prefix}
... ELSE BuiltIn.Catenate ${cmd}
+ ${cmd} = BuiltIn.Run Keyword If '${remote_ip}'!='None' BuiltIn.Catenate ${cmd} --remote-ip ${remote_ip}
+ ... ELSE BuiltIn.Catenate ${cmd}
${output} = OpenStack CLI ${cmd}
${rule_id} = BuiltIn.Should Match Regexp ${output} ${REGEX_UUID}
[Return] ${output} ${rule_id}
\ ${output} = OpenStack CLI openstack security group rule delete ${rule}
Create Allow All SecurityGroup
- [Arguments] ${sg_name} ${ether_type}=IPv4
+ [Arguments] ${sg_name} ${ether_type}=IPv4 ${dual}=False
[Documentation] Allow all TCP/UDP/ICMP packets for this suite
OpenStackOperations.Neutron Security Group Create ${sg_name}
OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=ingress ethertype=${ether_type} port_range_max=65535 port_range_min=1 protocol=tcp
OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=egress ethertype=${ether_type} protocol=icmp
OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=ingress ethertype=${ether_type} port_range_max=65535 port_range_min=1 protocol=udp
OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=egress ethertype=${ether_type} port_range_max=65535 port_range_min=1 protocol=udp
+ BuiltIn.Run Keyword If "${dual}"=="True" Run Keywords OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=ingress ethertype=IPv6
+ ... port_range_max=65535 port_range_min=1 protocol=tcp
+ ... AND OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=egress ethertype=IPv6 port_range_max=65535
+ ... port_range_min=1 protocol=tcp
+ ... AND OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=ingress ethertype=IPv6 protocol=icmp
+ ... AND OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=egress ethertype=IPv6 protocol=icmp
+ ... AND OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=ingress ethertype=IPv6 port_range_max=65535
+ ... port_range_min=1 protocol=udp
+ ... AND OpenStackOperations.Neutron Security Group Rule Create ${sg_name} direction=egress ethertype=IPv6 port_range_max=65535
+ ... port_range_min=1 protocol=udp
Create Neutron Port With Additional Params
[Arguments] ${network_name} ${port_name} ${additional_args}=${EMPTY}
BuiltIn.Set Suite Variable @{tcpdump_port_6653_conn_ids}
BuiltIn.Run Keyword If "${PRE_CLEAN_OPENSTACK_ALL}"=="True" OpenStack Cleanup All
OpenStackOperations.Add OVS Logging On All OpenStack Nodes
- Run_Keyword_If_At_Least_Oxygen Wait Until Keyword Succeeds 60 2 ClusterManagement.Check Status Of Services Is OPERATIONAL @{NETVIRT_DIAG_SERVICES}
- Verify Expected Default Tables On Nodes
+ Validate Deployment
OpenStack Suite Teardown
[Documentation] Wrapper teardown keyword that can be used in any suite running in an openstack environement
: FOR ${i} IN RANGE ${NUM_ODL_SYSTEM}
\ KarafKeywords.Issue Command On Karaf Console threads --list | wc -l ${ODL_SYSTEM_${i+1}_IP}
+Validate Deployment
+ [Documentation] Validate the deployment. Examples to validate are verifying default table
+ ... flows are installed and that the tunnel mesh has been built correctly.
+ Write To Validate File ----------------------------------------\n${SUITE_NAME}\n
+ : FOR ${keyword} IN @{VALIDATION_KEYWORDS}
+ \ ${status} = Builtin.Run Keyword And Return Status ${keyword}
+ \ BuiltIn.Run Keyword If "${status}" == "FAIL" or "${status}" == "False" BuiltIn.Run Keywords Write To Validate File Failed: ${keyword}
+ \ ... AND BuiltIn.Fail
+ \ ... ELSE Write To Validate File Passed: ${keyword}
+
+Write To Validate File
+ [Arguments] ${msg}
+ [Documentation] Write the given ${msg} to ${VALIDATION_FILE}. Create the file if not present.
+ ${status} = BuiltIn.Run Keyword And Return Status OperatingSystem.File Should Exist ${VALIDATION_FILE}
+ BuiltIn.Run Keyword If "${status}" == "False" OperatingSystem.Create File ${VALIDATION_FILE}
+ OperatingSystem.Append To File ${VALIDATION_FILE} ${msg}\n
+
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.
@{list} = String.Split String ${output}
[Return] @{list}[0]
+Verify Services
+ [Documentation] Verify if the services are operational
+ Wait Until Keyword Succeeds 60 2 ClusterManagement.Check Status Of Services Is OPERATIONAL @{NETVIRT_DIAG_SERVICES}
+
+Verify Expected Default Tunnels
+ [Documentation] Verify if the default tunnels are created.
+ ... SFC jobs currently fail this validation because it uses of-tunnels.
+ ... This validation will be blocked for NEtvirt SFC jobs until support for of-tunnels
+ ... added to odltools.
+ ${check_feature_list} = BuiltIn.Create List odl-netvirt-sfc
+ ${is_sfc_enabled} = OpenStackOperations.Is Feature Installed features=${check_feature_list}
+ BuiltIn.Return From Keyword If ${is_sfc_enabled} == ${True} ${True}
+ BuiltIn.Return From Keyword If ${OS_NODE_CNT} == ${1} ${True}
+ ${output} = ODLTools.Analyze Tunnels test_name=${SUITE_NAME}.Suite Setup
+ BuiltIn.Should Contain ${output} All tunnels are up
+
Verify Expected Default Tables On Nodes
[Arguments] ${node_ips}=@{OS_ALL_IPS}
[Documentation] Verify if Default Table Entries are programmed on all Nodes