@@ -1643,6 +1643,8 @@ def on_domain_pre_deleted(self, event, vm):
16431643 :param qubes.vm.QubesVM name: Qube name.
16441644 """
16451645 # pylint: disable=unused-argument
1646+ preloads = set ()
1647+ dependencies = []
16461648 for obj in itertools .chain (self .domains , (self ,)):
16471649 if obj is vm :
16481650 # allow removed VM to reference itself
@@ -1653,18 +1655,32 @@ def on_domain_pre_deleted(self, event, vm):
16531655 isinstance (prop , qubes .vm .VMProperty )
16541656 and getattr (obj , prop .__name__ ) == vm
16551657 ):
1656- self .log .error (
1657- "Cannot remove %s, used by %s.%s" ,
1658- vm ,
1659- obj ,
1660- prop .__name__ ,
1661- )
1662- raise qubes .exc .QubesVMInUseError (
1663- vm ,
1664- "Domain is in use: {!r};"
1665- "see 'journalctl -u qubesd -e' in dom0 for "
1666- "details" .format (vm .name ),
1667- )
1658+ if getattr (obj , "is_preload" , False ) and (
1659+ prop .__name__ == "template"
1660+ or (
1661+ prop .__name__ == "default_dispvm"
1662+ and getattr (obj , "template" , None ) == vm
1663+ )
1664+ ):
1665+ preloads .add (obj .name )
1666+ continue
1667+ if isinstance (obj , qubes .app .Qubes ):
1668+ dependencies .insert (0 , ('"GLOBAL"' , prop .__name__ ))
1669+ elif not obj .property_is_default (prop ):
1670+ dependencies .append ((obj .name , prop .__name__ ))
1671+ if dependencies :
1672+ self .log .error (
1673+ "Cannot remove %s as it is used by %s" ,
1674+ vm ,
1675+ ", " .join (
1676+ ":" .join (str (i ) for i in tup ) for tup in dependencies
1677+ ),
1678+ )
1679+ raise qubes .exc .QubesVMInUseError (
1680+ vm ,
1681+ "Domain is in use: {!r}; see 'journalctl -u qubesd -e' in dom0"
1682+ " for details" .format (vm .name ),
1683+ )
16681684 if isinstance (vm , qubes .vm .qubesvm .QubesVM ):
16691685 assignments = vm .get_provided_assignments ()
16701686 else :
@@ -1675,6 +1691,9 @@ def on_domain_pre_deleted(self, event, vm):
16751691 vm , "VM has devices assigned to other VMs: " + desc
16761692 )
16771693
1694+ if preloads :
1695+ vm .remove_preload_excess (0 , reason = "domain will be deleted" )
1696+
16781697 @qubes .events .handler ("domain-delete" )
16791698 def on_domain_deleted (self , event , vm ):
16801699 # pylint: disable=unused-argument
0 commit comments