@@ -20,6 +20,7 @@ import (
2020 "context"
2121 "encoding/json"
2222 "fmt"
23+ "regexp"
2324 "strings"
2425 "time"
2526
@@ -179,6 +180,7 @@ var _ = Describe("VirtualMachineAdditionalNetworkInterfaces", Label(precheck.NoP
179180
180181 Describe ("verifies interface name persistence after removing middle ClusterNetwork" , func () {
181182 cloudInitOpt := vm .WithProvisioningUserData (object .UbuntuCloudInit )
183+ memoryOpt := vm .WithMemory (resource .MustParse ("512Mi" ))
182184
183185 var (
184186 vdRoot * v1alpha2.VirtualDisk
@@ -195,7 +197,7 @@ var _ = Describe("VirtualMachineAdditionalNetworkInterfaces", Label(precheck.NoP
195197
196198 vdRoot = object .NewVDFromCVI ("vd-root" , ns , object .PrecreatedCVIUbuntu )
197199
198- vm = buildVMWithNetworks ("vm" , ns , vdRoot .Name , "192.168.1.20" , true , cloudInitOpt )
200+ vm = buildVMWithNetworks ("vm" , ns , vdRoot .Name , "192.168.1.20" , true , cloudInitOpt , memoryOpt )
199201 vm .Spec .Networks = append (vm .Spec .Networks , v1alpha2.NetworksSpec {
200202 Type : v1alpha2 .NetworksTypeClusterNetwork ,
201203 Name : util .ClusterNetworkName (secondAdditionalInterfaceVLANID ),
@@ -326,39 +328,49 @@ runcmd:
326328func checkConnectivityBetweenVMs (f * framework.Framework , vmFoo , vmBar * v1alpha2.VirtualMachine , vmBarHasMainNetwork bool , vmBarAdditionalIP , vmFooAdditionalIP string ) {
327329 GinkgoHelper ()
328330
329- pingCmd := "ping -c 2 -W 2 -w 5 -q %s 2>&1 | grep -o \" [0-9] \\ +%% \\ s*packet loss \" " // %% -> % in output
330- expectedOut := "0% packet loss "
331+ pingCmd := "ping -c 2 -W 2 -w 5 -q %s"
332+ expectedPacketLoss := "0"
331333
332334 By (fmt .Sprintf ("VM %s should have connectivity to %s (vm-bar)" , vmFoo .Name , vmBarAdditionalIP ))
333- checkResultSSHCommand (f , vmFoo .Name , vmFoo .Namespace , fmt .Sprintf (pingCmd , vmBarAdditionalIP ), expectedOut )
335+ checkPingPacketLoss (f , vmFoo .Name , vmFoo .Namespace , fmt .Sprintf (pingCmd , vmBarAdditionalIP ), expectedPacketLoss )
334336
335337 if vmBarHasMainNetwork {
336338 By (fmt .Sprintf ("VM %s should have connectivity to %s (vm-foo)" , vmBar .Name , vmFooAdditionalIP ))
337- checkResultSSHCommand (f , vmBar .Name , vmBar .Namespace , fmt .Sprintf (pingCmd , vmFooAdditionalIP ), expectedOut )
339+ checkPingPacketLoss (f , vmBar .Name , vmBar .Namespace , fmt .Sprintf (pingCmd , vmFooAdditionalIP ), expectedPacketLoss )
338340 }
339341}
340342
341343const (
342344 Interval = 1 * time .Second
343345 Timeout = 90 * time .Second
346+ // SSH command timeout should be safely above command-level deadlines (e.g. ping -w 5)
347+ // to avoid killing healthy commands at the timeout boundary.
348+ SSHCommandTimeout = 15 * time .Second
344349)
345350
346- func checkResultSSHCommand (f * framework.Framework , vmName , vmNamespace , cmd , equal string ) {
351+ func checkPingPacketLoss (f * framework.Framework , vmName , vmNamespace , cmd , expectedPacketLoss string ) {
347352 GinkgoHelper ()
353+ packetLossRE := regexp .MustCompile (`([0-9]+)%\s*packet loss` )
354+
348355 Eventually (func () (string , error ) {
349- res , err := f .SSHCommand (vmName , vmNamespace , cmd , framework .WithSSHTimeout (5 * time . Second ))
356+ res , err := f .SSHCommand (vmName , vmNamespace , cmd , framework .WithSSHTimeout (SSHCommandTimeout ))
350357 if err != nil {
351358 return "" , fmt .Errorf ("cmd: %s\n stderr: %w" , cmd , err )
352359 }
353- return strings .TrimSpace (res ), nil
354- }).WithTimeout (Timeout ).WithPolling (Interval ).Should (Equal (equal ))
360+ match := packetLossRE .FindStringSubmatch (res )
361+ if len (match ) < 2 {
362+ return "" , fmt .Errorf ("cmd: %s\n failed to parse packet loss from output: %q" , cmd , strings .TrimSpace (res ))
363+ }
364+
365+ return match [1 ], nil
366+ }).WithTimeout (Timeout ).WithPolling (Interval ).Should (Equal (expectedPacketLoss ))
355367}
356368
357369func checkLastInterfaceName (f * framework.Framework , vmName , vmNamespace , expected string ) {
358370 GinkgoHelper ()
359371 Eventually (func () (string , error ) {
360372 cmd := "ip -j link show"
361- result , err := f .SSHCommand (vmName , vmNamespace , cmd , framework .WithSSHTimeout (5 * time . Second ))
373+ result , err := f .SSHCommand (vmName , vmNamespace , cmd , framework .WithSSHTimeout (SSHCommandTimeout ))
362374 if err != nil {
363375 return "" , fmt .Errorf ("failed to execute command: %w: %s" , err , result )
364376 }
0 commit comments