qubes/vm: fix handling dynamic netvm change
Correctly detach network before attaching new one.
This commit is contained in:
parent
c534b68665
commit
f6bc61997a
@ -217,7 +217,7 @@ class NetVMMixin(qubes.events.Emitter):
|
||||
raise qubes.exc.QubesVMNotRunningError(self)
|
||||
assert self.netvm is not None
|
||||
|
||||
self.libvirt_domain.attachDevice(
|
||||
self.libvirt_domain.detachDevice(
|
||||
self.app.env.get_template('libvirt/devices/net.xml').render(
|
||||
vm=self))
|
||||
|
||||
@ -273,24 +273,26 @@ class NetVMMixin(qubes.events.Emitter):
|
||||
def on_property_pre_set_netvm(self, event, name, new_netvm, old_netvm=None):
|
||||
''' Run sanity checks before setting a new NetVM '''
|
||||
# pylint: disable=unused-argument
|
||||
if new_netvm is None:
|
||||
return
|
||||
|
||||
if new_netvm is not None:
|
||||
if not new_netvm.provides_network:
|
||||
raise qubes.exc.QubesValueError(
|
||||
'The {!s} qube does not provide network'.format(new_netvm))
|
||||
|
||||
if new_netvm is self \
|
||||
or new_netvm in self.app.domains.get_vms_connected_to(self):
|
||||
raise qubes.exc.QubesValueError('Loops in network are unsupported')
|
||||
|
||||
if not self.app.vmm.offline_mode and self.is_running() \
|
||||
and not new_netvm.is_running():
|
||||
raise qubes.exc.QubesValueError(
|
||||
'Loops in network are unsupported')
|
||||
|
||||
if not self.app.vmm.offline_mode \
|
||||
and self.is_running() and not new_netvm.is_running():
|
||||
raise qubes.exc.QubesVMNotStartedError(new_netvm,
|
||||
'Cannot dynamically attach to stopped NetVM: {!r}'.format(
|
||||
new_netvm))
|
||||
|
||||
if old_netvm is not None:
|
||||
if self.is_running():
|
||||
self.detach_network()
|
||||
|
||||
@qubes.events.handler('property-set:netvm')
|
||||
def on_property_set_netvm(self, event, name, new_netvm, old_netvm=None):
|
||||
''' Replaces the current NetVM with a new one and fires
|
||||
@ -298,10 +300,6 @@ class NetVMMixin(qubes.events.Emitter):
|
||||
'''
|
||||
# pylint: disable=unused-argument
|
||||
|
||||
if self.netvm is not None:
|
||||
if self.is_running():
|
||||
self.detach_network()
|
||||
|
||||
if new_netvm is None:
|
||||
return
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user