From 6c7206b957f6c565e35b1d1bf37d2bf00dea6653 Mon Sep 17 00:00:00 2001 From: Sam Hague Date: Mon, 3 Dec 2018 14:58:11 -0500 Subject: [PATCH 1/1] Add ping retries and break on success Change the ping command to take a retries value. This allows the ping to be more independent of timing issues with flow additions. The cirros images and the SSHLibary have some weird quirks that the patch had to workaround: - The cirros images use a dash like shell and not bash. This required catering the shell command to be posix compliant. - The typical prompt of $ is in the shell command so it can't be used to read until. This was changed to read until regexp to look for the final rc=n from the command. - The SSHLibrary Write keyword actually consumes and returns the command itself, which was causing an early match. The regex helped here also since the regex would only match on the rc=n - so a number had to be in the output for it to match. JIRA: NETVIRT-1399 Change-Id: I06d43fbd2ce7a0f32ccc60cdfd2783abaadd260b Signed-off-by: Sam Hague --- csit/libraries/OpenStackOperations.robot | 12 +++++++----- csit/libraries/Utils.robot | 11 +++++++++++ .../openstack/connectivity/external_network.robot | 6 +++--- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/csit/libraries/OpenStackOperations.robot b/csit/libraries/OpenStackOperations.robot index cfcc7c014f..0b91311bc9 100644 --- a/csit/libraries/OpenStackOperations.robot +++ b/csit/libraries/OpenStackOperations.robot @@ -459,11 +459,13 @@ Exit From Vm 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 @@ -511,7 +513,7 @@ 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 ${console}=cirros + ... ${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} @@ -526,7 +528,7 @@ Test Operations From Vm Instance : 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 diff --git a/csit/libraries/Utils.robot b/csit/libraries/Utils.robot index cfcefc11aa..00991c75b6 100644 --- a/csit/libraries/Utils.robot +++ b/csit/libraries/Utils.robot @@ -504,12 +504,23 @@ Convert_To_Minutes Write Commands Until Expected Prompt [Arguments] ${cmd} ${prompt} ${timeout}=${DEFAULT_TIMEOUT} [Documentation] quick wrapper for Write and Read Until Prompt Keywords to make test cases more readable + BuiltIn.Log cmd: ${cmd} SSHLibrary.Set Client Configuration timeout=${timeout} SSHLibrary.Read SSHLibrary.Write ${cmd} ${output}= SSHLibrary.Read Until ${prompt} [Return] ${output} +Write Commands Until Expected Regexp + [Arguments] ${cmd} ${regexp} ${timeout}=${DEFAULT_TIMEOUT} + [Documentation] quick wrapper for Write and Read Until Prompt Keywords to make test cases more readable + BuiltIn.Log cmd: ${cmd} + SSHLibrary.Set Client Configuration timeout=${timeout} + SSHLibrary.Read + SSHLibrary.Write ${cmd} + ${output}= SSHLibrary.Read Until Regexp ${regexp} + [Return] ${output} + Install Package On Ubuntu System [Arguments] ${package_name} ${system}=${TOOLS_SYSTEM_IP} ${user}=${TOOLS_SYSTEM_USER} ${password}=${TOOLS_SYSTEM_PASSWORD} ${prompt}=${DEFAULT_LINUX_PROMPT} ${prompt_timeout}=30s [Documentation] Keyword to install packages for testing to Ubuntu Mininet VM diff --git a/csit/suites/openstack/connectivity/external_network.robot b/csit/suites/openstack/connectivity/external_network.robot index b9705e12e9..1320d11f50 100644 --- a/csit/suites/openstack/connectivity/external_network.robot +++ b/csit/suites/openstack/connectivity/external_network.robot @@ -38,13 +38,13 @@ Initial Ping To External Network PNF from Vm Instance 1 [Documentation] Check reachability of External Network PNF from VM instance (with ttl=1 to make sure no router hops) ${expect_ping_to_work} = Set Variable If "skip_if_controller" in @{TEST_TAGS} False True ${dst_ip}= BuiltIn.Create List ${EXTERNAL_PNF} - OpenStackOperations.Test Operations From Vm Instance @{NETWORKS}[0] @{NET1_FIP_VM_IPS}[0] ${dst_ip} ttl=1 ping_should_succeed=${expect_ping_to_work} + OpenStackOperations.Test Operations From Vm Instance @{NETWORKS}[0] @{NET1_FIP_VM_IPS}[0] ${dst_ip} ttl=1 ping_should_succeed=${expect_ping_to_work} ping_tries=8 Initial Ping To External Network PNF from Vm Instance 2 [Documentation] Check reachability of External Network PNF from VM instance (with ttl=1 to make sure no router hops) ${expect_ping_to_work} = Set Variable If "skip_if_controller" in @{TEST_TAGS} False True ${dst_ip}= BuiltIn.Create List ${EXTERNAL_PNF} - OpenStackOperations.Test Operations From Vm Instance @{NETWORKS}[0] @{NET1_FIP_VM_IPS}[1] ${dst_ip} ttl=1 ping_should_succeed=${expect_ping_to_work} + OpenStackOperations.Test Operations From Vm Instance @{NETWORKS}[0] @{NET1_FIP_VM_IPS}[1] ${dst_ip} ttl=1 ping_should_succeed=${expect_ping_to_work} ping_tries=8 Create And Associate Floating IPs for VMs [Documentation] Create and associate a floating IP for the VM @@ -105,7 +105,7 @@ Ping Vm Instance2 Floating IP From SNAT VM Instance2 Ping External Network PNF from Vm Instance 1 After Floating IP Assignment [Documentation] Check reachability of External Network PNF from VM instance (with ttl=1 to make sure no router hops) ${dst_ip} = BuiltIn.Create List ${EXTERNAL_PNF} - OpenStackOperations.Test Operations From Vm Instance @{NETWORKS}[0] @{NET1_FIP_VM_IPS}[0] ${dst_ip} ttl=1 + OpenStackOperations.Test Operations From Vm Instance @{NETWORKS}[0] @{NET1_FIP_VM_IPS}[0] ${dst_ip} ttl=1 ping_tries=8 SNAT - TCP connection to External Gateway From SNAT VM Instance1 [Documentation] Login to the VM instance and test TCP connection to the controller via SNAT -- 2.36.6