7070)
7171
7272
73- def shutdown (
74- args ,
75- loop : asyncio .AbstractEventLoop ,
76- domains : list [qubesadmin .vm .QubesVM ],
77- force : bool ,
78- ):
73+ async def shutdown (args , domains : list [qubesadmin .vm .QubesVM ]):
7974 """
8075 Asynchronously shutdown qubes and return qubes that failed to shutdown as
8176 well as failed with a timeout.
@@ -84,14 +79,12 @@ def shutdown(
8479 remnants , timedout = [], []
8580 tasks = [
8681 asyncio .wait_for (
87- async_thread (qube .shutdown , force = force , wait = args .wait ),
82+ async_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" )
@@ -120,16 +113,14 @@ def shutdown(
120113 return remnants , timedout
121114
122115
123- def kill (loop : asyncio . AbstractEventLoop , domains : list [qubesadmin .vm .QubesVM ]):
116+ async def kill (domains : list [qubesadmin .vm .QubesVM ]):
124117 """
125118 Asynchronously kill qubes and return qubes that failed to shutdown.
126119 """
127120 # pylint: disable=missing-docstring
128121 remnants = domains .copy ()
129122 tasks = [async_thread (qube .kill ) for qube in domains ]
130- results = loop .run_until_complete (
131- asyncio .gather (* tasks , return_exceptions = True )
132- )
123+ results = await asyncio .gather (* tasks , return_exceptions = True )
133124 for qube , res in zip (domains , results ):
134125 if not isinstance (res , BaseException ):
135126 qube .log .info ("Killing succeeded" )
@@ -144,36 +135,24 @@ def kill(loop: asyncio.AbstractEventLoop, domains: list[qubesadmin.vm.QubesVM]):
144135 return remnants
145136
146137
147- def main (args = None , app = None ):
138+ async def run_async (args = None , domains = None ):
148139 # pylint: disable=missing-docstring
149- args = parser .parse_args (args , app = app )
150- force = args .force or (args .all_domains and not args .exclude )
151- if args .dry_run :
152- return
153- domains = set (args .domains )
154-
155- loop = asyncio .new_event_loop ()
156- asyncio .set_event_loop (loop )
157- remnants , timedout = shutdown (
158- args = args , force = force , loop = loop , domains = domains
159- )
140+ remnants , timedout = await shutdown (args = args , domains = domains )
160141 if timedout :
161142 args .app .log .info (
162143 "Retrying shutdown of qubes that timed out: {}" .format (
163144 ", " .join (qube .name for qube in timedout )
164145 )
165146 )
166- remnants , timedout = shutdown (
167- args = args , force = force , loop = loop , domains = timedout
168- )
147+ remnants , timedout = await shutdown (args = args , domains = timedout )
169148
170149 if timedout :
171150 args .app .log .info (
172151 "Killing timed out qubes: {}" .format (
173152 ", " .join (qube .name for qube in timedout )
174153 )
175154 )
176- remnants = kill (loop = loop , domains = timedout )
155+ remnants = await kill (domains = timedout )
177156
178157 if not remnants :
179158 return
@@ -185,5 +164,31 @@ def main(args=None, app=None):
185164 )
186165
187166
167+ def parse_common (args = None , app = None ):
168+ # pylint: disable=missing-docstring
169+ args = parser .parse_args (args , app = app )
170+ args .force = args .force or (args .all_domains and not args .exclude )
171+ domains = set (args .domains )
172+ return args , domains
173+
174+
175+ async def main_async (args = None , app = None ):
176+ # pylint: disable=missing-docstring
177+ args , domains = parse_common (args = args , app = app )
178+ if args .dry_run :
179+ return
180+ await run_async (args = args , domains = domains )
181+
182+
183+ def main (args = None , app = None ):
184+ # pylint: disable=missing-docstring
185+ args , domains = parse_common (args = args , app = app )
186+ if args .dry_run :
187+ return
188+ loop = asyncio .new_event_loop ()
189+ asyncio .set_event_loop (loop )
190+ loop .run_until_complete (run_async (args = args , domains = domains ))
191+
192+
188193if __name__ == "__main__" :
189194 sys .exit (main ())
0 commit comments