@@ -50,7 +50,7 @@ import (
5050 e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
5151 testutils "k8s.io/kubernetes/test/utils"
5252 utilnet "k8s.io/utils/net"
53- "k8s.io/utils/pointer "
53+ "k8s.io/utils/ptr "
5454 crclient "sigs.k8s.io/controller-runtime/pkg/client"
5555
5656 butaneconfig "github.com/coreos/butane/config"
@@ -794,9 +794,9 @@ var _ = Describe("Kubevirt Virtual Machines", feature.VirtualMachineSupport, fun
794794 }).WithPolling (time .Second ).WithTimeout (time .Minute ).Should (Succeed ())
795795 }
796796
797- waitVirtualMachineInstanceReadiness = func (vmi * kubevirtv1.VirtualMachineInstance ) {
797+ waitVirtualMachineInstanceReadinessWith = func (vmi * kubevirtv1.VirtualMachineInstance , conditionStatus corev1. ConditionStatus ) {
798798 GinkgoHelper ()
799- By (fmt .Sprintf ("Waiting for readiness at virtual machine %s" , vmi .Name ))
799+ By (fmt .Sprintf ("Waiting for readiness=%q at virtual machine %s" , conditionStatus , vmi .Name ))
800800 Eventually (func () []kubevirtv1.VirtualMachineInstanceCondition {
801801 err := crClient .Get (context .Background (), crclient .ObjectKeyFromObject (vmi ), vmi )
802802 Expect (err ).To (SatisfyAny (
@@ -807,10 +807,20 @@ var _ = Describe("Kubevirt Virtual Machines", feature.VirtualMachineSupport, fun
807807 }).WithPolling (time .Second ).WithTimeout (5 * time .Minute ).Should (
808808 ContainElement (SatisfyAll (
809809 HaveField ("Type" , kubevirtv1 .VirtualMachineInstanceReady ),
810- HaveField ("Status" , corev1 . ConditionTrue ),
810+ HaveField ("Status" , conditionStatus ),
811811 )))
812812 }
813813
814+ waitVirtualMachineInstanceReadiness = func (vmi * kubevirtv1.VirtualMachineInstance ) {
815+ GinkgoHelper ()
816+ waitVirtualMachineInstanceReadinessWith (vmi , corev1 .ConditionTrue )
817+ }
818+
819+ waitVirtualMachineInstanceFailed = func (vmi * kubevirtv1.VirtualMachineInstance ) {
820+ GinkgoHelper ()
821+ waitVirtualMachineInstanceReadinessWith (vmi , corev1 .ConditionFalse )
822+ }
823+
814824 waitVirtualMachineAddresses = func (vmi * kubevirtv1.VirtualMachineInstance ) []kubevirt.Address {
815825 GinkgoHelper ()
816826 step := by (vmi .Name , "Wait for virtual machine to receive IPv4 address from DHCP" )
@@ -903,7 +913,7 @@ var _ = Describe("Kubevirt Virtual Machines", feature.VirtualMachineSupport, fun
903913 NetworkSource : networkSource ,
904914 },
905915 },
906- TerminationGracePeriodSeconds : pointer . Int64 ( 5 ),
916+ TerminationGracePeriodSeconds : ptr . To ( int64 ( 5 ) ),
907917 Volumes : []kubevirtv1.Volume {
908918 {
909919 Name : "containerdisk" ,
@@ -929,7 +939,7 @@ var _ = Describe("Kubevirt Virtual Machines", feature.VirtualMachineSupport, fun
929939 GenerateName : vmi .GenerateName ,
930940 },
931941 Spec : kubevirtv1.VirtualMachineSpec {
932- Running : pointer . Bool ( true ),
942+ RunStrategy : ptr . To ( kubevirtv1 . RunStrategyAlways ),
933943 Template : & kubevirtv1.VirtualMachineInstanceTemplateSpec {
934944 ObjectMeta : metav1.ObjectMeta {
935945 Annotations : vmi .Annotations ,
14141424 Name : "force-post-copy" ,
14151425 },
14161426 Spec : kvmigrationsv1alpha1.MigrationPolicySpec {
1417- AllowPostCopy : pointer . Bool (true ),
1418- CompletionTimeoutPerGiB : pointer . Int64 ( 1 ),
1427+ AllowPostCopy : ptr . To (true ),
1428+ CompletionTimeoutPerGiB : ptr . To ( int64 ( 1 ) ),
14191429 BandwidthPerMigration : & bandwidthPerMigration ,
14201430 Selectors : & kvmigrationsv1alpha1.Selectors {
14211431 VirtualMachineInstanceSelector : kvmigrationsv1alpha1.LabelSelector {
@@ -2219,15 +2229,20 @@ chpasswd: { expire: False }
22192229 networkData , err := staticIPsNetworkData (selectCIDRs (vmiIPv4 , vmiIPv6 ))
22202230 Expect (err ).NotTo (HaveOccurred ())
22212231
2222- vmi := fedoraWithTestToolingVMI (nil /*labels*/ , nil /*annotations*/ , nil /*nodeSelector*/ , kubevirtv1.NetworkSource {
2232+ vm := fedoraWithTestToolingVM (nil /*labels*/ , nil /*annotations*/ , nil /*nodeSelector*/ , kubevirtv1.NetworkSource {
22232233 Multus : & kubevirtv1.MultusNetwork {
22242234 NetworkName : cudn .Name ,
22252235 },
22262236 }, userData , networkData )
22272237 // Harcode mac address so it's the same after live migration
2228- vmi .Spec .Domain .Devices .Interfaces [0 ].MacAddress = vmiMAC
2229- createVirtualMachineInstance (vmi )
2230-
2238+ vm .Spec .Template .Spec .Domain .Devices .Interfaces [0 ].MacAddress = vmiMAC
2239+ createVirtualMachine (vm )
2240+ vmi := & kubevirtv1.VirtualMachineInstance {
2241+ ObjectMeta : metav1.ObjectMeta {
2242+ Namespace : namespace ,
2243+ Name : vm .Name ,
2244+ },
2245+ }
22312246 waitVirtualMachineInstanceReadiness (vmi )
22322247 Expect (crClient .Get (context .TODO (), crclient .ObjectKeyFromObject (vmi ), vmi )).To (Succeed ())
22332248
@@ -2253,11 +2268,39 @@ chpasswd: { expire: False }
22532268 by (vmi .Name , "Running live migration for virtual machine instance" )
22542269 td (vmi )
22552270
2256- step = by (vmi .Name , fmt .Sprintf ("Login to virtual machine after virtual machine instance live migration" ))
2271+ // Update vmi status after live migration
2272+ Expect (crClient .Get (context .Background (), crclient .ObjectKeyFromObject (vmi ), vmi )).To (Succeed ())
2273+
2274+ step = by (vmi .Name , "Login to virtual machine after virtual machine instance live migration" )
22572275 Expect (kubevirt .LoginToFedora (vmi , "fedora" , "fedora" )).To (Succeed (), step )
22582276
22592277 step = by (vmi .Name , "Check east/west traffic after virtual machine instance live migration" )
22602278 checkEastWestIperfTraffic (vmi , testPodsIPs , step )
2279+
2280+ By ("Stop iperf3 traffic before force killing vm, so iperf3 server do not get stuck" )
2281+ output , err = kubevirt .RunCommand (vmi , "killall iperf3" , 5 * time .Second )
2282+ Expect (err ).ToNot (HaveOccurred (), output )
2283+
2284+ step = by (vmi .Name , fmt .Sprintf ("Force kill qemu at node %q where VM is running on" , vmi .Status .NodeName ))
2285+ Expect (kubevirt .ForceKillVirtLauncherAtNode (infraprovider .Get (), vmi .Status .NodeName , vmi .Namespace , vmi .Name )).To (Succeed ())
2286+
2287+ step = by (vmi .Name , "Waiting for failed restarted VMI to reach ready state" )
2288+ waitVirtualMachineInstanceFailed (vmi )
2289+ waitVirtualMachineInstanceReadiness (vmi )
2290+ Expect (crClient .Get (context .TODO (), crclient .ObjectKeyFromObject (vmi ), vmi )).To (Succeed ())
2291+
2292+ step = by (vmi .Name , "Login to virtual machine after virtual machine instance force killed" )
2293+ Expect (kubevirt .LoginToFedora (vmi , "fedora" , "fedora" )).To (Succeed (), step )
2294+
2295+ step = by (vmi .Name , "Restart iperf traffic after forcing a vm failure" )
2296+ Expect (startEastWestIperfTraffic (vmi , testPodsIPs , step )).To (Succeed (), step )
2297+ checkEastWestIperfTraffic (vmi , testPodsIPs , step )
2298+
2299+ by (vmi .Name , "Running live migration after forcing vm failure" )
2300+ td (vmi )
2301+
2302+ step = by (vmi .Name , "Check east/west traffic for failed virtual machine after live migration" )
2303+ checkEastWestIperfTraffic (vmi , testPodsIPs , step )
22612304 },
22622305 Entry ("after succeeded live migration" , liveMigrateSucceed ),
22632306 Entry ("after failed live migration" , liveMigrateFailed ),
0 commit comments