@@ -165,9 +165,11 @@ def tearDown(self):
165165 del self .netvms
166166 super (VmNetworkingMixin , self ).tearDown ()
167167
168- def configure_netvm (self ):
168+ def configure_netvm (self , netvms : list = None ):
169169 """
170170 :type self: qubes.tests.SystemTestCase | VmNetworkingMixin
171+
172+ :param list netvms: Use specified netvms or self.netvms.
171173 """
172174
173175 def run_netvm_cmd (qube , cmd ):
@@ -181,7 +183,9 @@ def run_netvm_cmd(qube, cmd):
181183 % (qube , cmd , e .stdout .decode (), e .stderr .decode ())
182184 )
183185
184- for qube in self .netvms :
186+ if not netvms :
187+ netvms = self .netvms
188+ for qube in netvms :
185189 if not qube .is_running ():
186190 self .loop .run_until_complete (self .start_vm (qube ))
187191 # Ensure that dnsmasq is installed:
@@ -254,8 +258,8 @@ def _networking_paused_from_none_to_existent(
254258 0 ,
255259 "Ping by name on " + test + " failed" ,
256260 )
257- self .assertEqual (
258- self .testvm1 .features .get ("deferred-netvm-original" , None ), None
261+ self .assertIsNone (
262+ self .testvm1 .features .get ("deferred-netvm-original" , None )
259263 )
260264 self .shutdown_and_wait (self .testvm1 )
261265
@@ -284,8 +288,8 @@ def _networking_paused_from_existent_to_none(
284288 0 ,
285289 "Ping by name on " + test + " succeeded but should have failed" ,
286290 )
287- self .assertEqual (
288- self .testvm1 .features .get ("deferred-netvm-original" , None ), None
291+ self .assertIsNone (
292+ self .testvm1 .features .get ("deferred-netvm-original" , None )
289293 )
290294 self .shutdown_and_wait (self .testvm1 )
291295
@@ -317,8 +321,8 @@ def _networking_paused_change_shutdown_old(
317321 0 ,
318322 "Ping by name on " + test + " failed" ,
319323 )
320- self .assertEqual (
321- self .testvm1 .features .get ("deferred-netvm-original" , None ), None
324+ self .assertIsNone (
325+ self .testvm1 .features .get ("deferred-netvm-original" , None )
322326 )
323327 self .shutdown_and_wait (self .testvm1 )
324328
@@ -355,8 +359,75 @@ def _networking_paused_change_purge_old(
355359 0 ,
356360 "Ping by name on " + test + " failed" ,
357361 )
362+ self .assertIsNone (
363+ self .testvm1 .features .get ("deferred-netvm-original" , None )
364+ )
365+ self .shutdown_and_wait (self .testvm1 )
366+
367+ def _networking_paused_restart_netvm (
368+ self , ip , name , ip_deadline , name_deadline
369+ ):
370+ test = "restart netvm and unpause client"
371+ self .log .critical (test )
372+ print (test )
373+ self .testvm1 .netvm = self .testnetvm
374+ self .loop .run_until_complete (self .start_vm (self .testvm1 ))
375+ self .loop .run_until_complete (self .testvm1 .pause ())
376+ self .shutdown_and_wait (self .testnetvm , force = True )
377+ self .assertEqual (
378+ self .testvm1 .features .get ("deferred-netvm-original" , None ),
379+ self .testnetvm .name ,
380+ )
381+ self .loop .run_until_complete (self .start_vm (self .testnetvm ))
382+ self .configure_netvm ([self .testnetvm ])
383+ self .loop .run_until_complete (self .testvm1 .unpause ())
384+ self ._run_cmd_and_log_output (self .testvm1 , ip_deadline )
385+ self ._run_cmd_and_log_output (self .testvm1 , name_deadline )
386+ self .assertEqual (
387+ self .run_cmd (self .testvm1 , ip ),
388+ 0 ,
389+ "Ping by IP on " + test + " failed" ,
390+ )
391+ self .assertEqual (
392+ self .run_cmd (self .testvm1 , name ),
393+ 0 ,
394+ "Ping by name on " + test + " failed" ,
395+ )
396+ self .assertIsNone (
397+ self .testvm1 .features .get ("deferred-netvm-original" , None )
398+ )
399+ self .shutdown_and_wait (self .testvm1 )
400+
401+ def _networking_paused_shutdown_netvm (
402+ self , ip , name , ip_deadline , name_deadline
403+ ):
404+ test = "shutdown netvm and unpause client"
405+ self .log .critical (test )
406+ print (test )
407+ self .testvm1 .netvm = self .testnetvm
408+ self .loop .run_until_complete (self .start_vm (self .testvm1 ))
409+ self .loop .run_until_complete (self .testvm1 .pause ())
410+ self .shutdown_and_wait (self .testnetvm , force = True )
411+ self .assertEqual (
412+ self .testvm1 .features .get ("deferred-netvm-original" , None ),
413+ self .testnetvm .name ,
414+ )
415+ self .loop .run_until_complete (self .testvm1 .unpause ())
416+ self .configure_netvm ([self .testnetvm ])
417+ self ._run_cmd_and_log_output (self .testvm1 , ip_deadline )
418+ self ._run_cmd_and_log_output (self .testvm1 , name_deadline )
358419 self .assertEqual (
359- self .testvm1 .features .get ("deferred-netvm-original" , None ), None
420+ self .run_cmd (self .testvm1 , ip ),
421+ 0 ,
422+ "Ping by IP on " + test + " failed" ,
423+ )
424+ self .assertEqual (
425+ self .run_cmd (self .testvm1 , name ),
426+ 0 ,
427+ "Ping by name on " + test + " failed" ,
428+ )
429+ self .assertIsNone (
430+ self .testvm1 .features .get ("deferred-netvm-original" , None )
360431 )
361432 self .shutdown_and_wait (self .testvm1 )
362433
@@ -406,6 +477,28 @@ def test_001_simple_networking_paused_change_purge_old(self):
406477 self .ping_deadline_name ,
407478 )
408479
480+ def test_001_simple_networking_paused_restart_netvm (self ):
481+ """
482+ :type self: qubes.tests.SystemTestCase | VmNetworkingMixin
483+ """
484+ self ._networking_paused_restart_netvm (
485+ self .ping_ip ,
486+ self .ping_name ,
487+ self .ping_deadline_ip ,
488+ self .ping_deadline_name ,
489+ )
490+
491+ def test_001_simple_networking_paused_shutdown_netvm (self ):
492+ """
493+ :type self: qubes.tests.SystemTestCase | VmNetworkingMixin
494+ """
495+ self ._networking_paused_shutdown_netvm (
496+ self .ping_ip ,
497+ self .ping_name ,
498+ self .ping_deadline_ip ,
499+ self .ping_deadline_name ,
500+ )
501+
409502 def test_010_simple_proxyvm (self ):
410503 """
411504 :type self: qubes.tests.SystemTestCase | VmNetworkingMixin
0 commit comments