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