@@ -361,3 +361,65 @@ async def suspend_post(self):
361361 qubes .config .suspend_timeout ,
362362 "qubes.SuspendPostAll" ,
363363 )
364+
365+ @qubes .api .method (
366+ "internal.dispvm.preload.Create" , scope = "local" , write = True
367+ )
368+ async def dispvm_preload_create (self ):
369+ """
370+ Method called to create a preloaded DispVM.
371+
372+ :return:
373+ """
374+ dispvm_template = self .arg
375+ preload_dispvm = dispvm_template .features .get ("preload-dispvm" , None )
376+ ## TODO: should this function receive disposable name as argument
377+ ## or call admin.vm.CreateDisposable?
378+ dispvm = TODO
379+ if preload_dispvm :
380+ preload_dispvm += " " + dispvm
381+ else :
382+ preload_dispvm = dispvm
383+ dispvm_template .features ["preload-dispvm" ] = preload_dispvm
384+ dispvm .features ["internal" ] = True
385+
386+ @qubes .api .method (
387+ "internal.dispvm.preload.Use" , scope = "local" , write = True
388+ )
389+ async def dispvm_preload_use (self ):
390+ """
391+ Method called when usage of preloaded DispVM is requested.
392+
393+ To use the first preloaded disposable, provide as argument the
394+ disposable template, else, provide as argument the disposable name.
395+
396+ :return:
397+ """
398+ used_dispvm = self .arg
399+ if used_dispvm .klass == "DispVM" :
400+ dispvm_template = getattr (used_dispvm , "template" )
401+ use_first = False
402+ elif (
403+ used_dispvm .klass == "AppVM"
404+ and getattr (used_dispvm , "template_for_dispvms" , False )
405+ ):
406+ dispvm_template = used_dispvm
407+ use_first = True
408+ else :
409+ raise qubes .exc .QubesException ("Invalid argument provided" )
410+ preload_dispvm = dispvm_template .features .get ("preload-dispvm" , None )
411+ if not preload_dispvm :
412+ return
413+
414+ preload_dispvm = preload_dispvm .split (" " )
415+ if use_first :
416+ used_dispvm_name = preload_dispvm [1 :]
417+ else :
418+ used_dispvm_name = used_dispvm .name
419+
420+ unused_dispvm = preload_dispvm .remove (used_dispvm_name )
421+ dispvm_template .features ["preload-dispvm" ] = unused_dispvm
422+ used_dispvm .features ["internal" ] = False
423+ ## TODO: preload next disposable with delay. Should this function
424+ ## emit an event to handle the delay and creation of the next
425+ ## preloaded disposable?
0 commit comments