6969)
7070
7171
72- def shutdown (
73- args ,
74- loop : asyncio .AbstractEventLoop ,
75- domains : list [qubesadmin .vm .QubesVM ],
76- force : bool ,
77- ):
72+ async def shutdown (args , domains : list [qubesadmin .vm .QubesVM ]):
7873 """
7974 Asynchronously shutdown qubes and return qubes that failed to shutdown
8075 because and the client can't handle, as well as qubes that were in use
@@ -84,14 +79,12 @@ def shutdown(
8479 unhandled , used , timedout = [], [], []
8580 tasks = [
8681 asyncio .wait_for (
87- asyncio .to_thread (qube .shutdown , force = force , wait = args .wait ),
82+ asyncio .to_thread (qube .shutdown , force = args . force , wait = args .wait ),
8883 timeout = args .timeout ,
8984 )
9085 for qube in domains
9186 ]
92- results = loop .run_until_complete (
93- asyncio .gather (* tasks , return_exceptions = True )
94- )
87+ results = await asyncio .gather (* tasks , return_exceptions = True )
9588 for qube , res in zip (domains , results ):
9689 if not isinstance (res , BaseException ):
9790 qube .log .info ("Shutdown succeeded" )
@@ -124,16 +117,14 @@ def shutdown(
124117 return unhandled , used , timedout
125118
126119
127- def kill (loop : asyncio . AbstractEventLoop , domains : list [qubesadmin .vm .QubesVM ]):
120+ async def kill (domains : list [qubesadmin .vm .QubesVM ]):
128121 """
129122 Asynchronously kill qubes and return qubes that failed to shutdown.
130123 """
131124 # pylint: disable=missing-docstring
132125 unhandled = domains .copy ()
133126 tasks = [asyncio .to_thread (qube .kill ) for qube in domains ]
134- results = loop .run_until_complete (
135- asyncio .gather (* tasks , return_exceptions = True )
136- )
127+ results = await asyncio .gather (* tasks , return_exceptions = True )
137128 for qube , res in zip (domains , results ):
138129 if not isinstance (res , BaseException ):
139130 qube .log .info ("Killing succeeded" )
@@ -148,18 +139,14 @@ def kill(loop: asyncio.AbstractEventLoop, domains: list[qubesadmin.vm.QubesVM]):
148139 return unhandled
149140
150141
151- def main (args = None , app = None ):
142+ async def run_async (args = None , app = None ):
152143 # pylint: disable=missing-docstring
153144 args = parser .parse_args (args , app = app )
154- force = args .force or (args .all_domains and not args .exclude )
155145 if args .dry_run :
156146 return
147+ args .force = args .force or (args .all_domains and not args .exclude )
157148
158- loop = asyncio .new_event_loop ()
159- asyncio .set_event_loop (loop )
160- unhandled , used , timedout = shutdown (
161- args = args , force = force , loop = loop , domains = args .domains
162- )
149+ unhandled , used , timedout = await shutdown (args = args , domains = args .domains )
163150 unhandled_retry = []
164151 timedout_retry = []
165152 if used :
@@ -174,8 +161,8 @@ def main(args=None, app=None):
174161 ", " .join (qube .name for qube in used )
175162 )
176163 )
177- unhandled_retry , used , timedout_retry = shutdown (
178- args = args , force = force , loop = loop , domains = used
164+ unhandled_retry , used , timedout_retry = await shutdown (
165+ args = args , domains = used
179166 )
180167 unhandled .extend (qube for qube in unhandled_retry if qube not in unhandled )
181168 timedout .extend (qube for qube in timedout_retry if qube not in timedout )
@@ -187,17 +174,15 @@ def main(args=None, app=None):
187174 ", " .join (qube .name for qube in timedout )
188175 )
189176 )
190- unhandled , used , timedout = shutdown (
191- args = args , force = force , loop = loop , domains = timedout
192- )
177+ unhandled , used , timedout = await shutdown (args = args , domains = timedout )
193178
194179 if timedout :
195180 parser .print_error (
196181 "Killing timed out qubes: {}" .format (
197182 ", " .join (qube .name for qube in timedout )
198183 )
199184 )
200- unhandled = kill (loop = loop , domains = timedout )
185+ unhandled = await kill (domains = timedout )
201186
202187 if not unhandled and not used and not timedout :
203188 return
@@ -218,5 +203,15 @@ def main(args=None, app=None):
218203 parser .error_runtime (msg , len (unhandled + used + timedout ))
219204
220205
206+ async def main_async (args = None , app = None ):
207+ # pylint: disable=missing-docstring
208+ await run_async (args = args , app = app )
209+
210+
211+ def main (args = None , app = None ):
212+ # pylint: disable=missing-docstring
213+ asyncio .run (run_async (args = args , app = app ))
214+
215+
221216if __name__ == "__main__" :
222217 sys .exit (main ())
0 commit comments