qubes/vm: don't fail on removing VM without files
VM files may be already removed. Don't fail on this while removing a VM, it's probably the reason why domain is being removed. qvm-remove tool have its own guard for this, but it isn't enough - if rmtree(dir_path) fails, storage.remove() would not be called, so non-file storages would not be cleaned up. This is also needed to correctly handle template reinstallation - where VM directory is moved away to call create_on_disk again. QubesOS/qubes-issues#2412
This commit is contained in:
		
							parent
							
								
									cc440c62f6
								
							
						
					
					
						commit
						1418555346
					
				@ -39,6 +39,8 @@ import uuid
 | 
				
			|||||||
import warnings
 | 
					import warnings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import grp
 | 
					import grp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import errno
 | 
				
			||||||
import lxml
 | 
					import lxml
 | 
				
			||||||
import libvirt  # pylint: disable=import-error
 | 
					import libvirt  # pylint: disable=import-error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1229,7 +1231,13 @@ class QubesVM(qubes.vm.mix.net.NetVMMixin, qubes.vm.BaseVM):
 | 
				
			|||||||
                    self, self.get_power_state()))
 | 
					                    self, self.get_power_state()))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.fire_event('domain-remove-from-disk')
 | 
					        self.fire_event('domain-remove-from-disk')
 | 
				
			||||||
        shutil.rmtree(self.dir_path)
 | 
					        try:
 | 
				
			||||||
 | 
					            shutil.rmtree(self.dir_path)
 | 
				
			||||||
 | 
					        except OSError as e:
 | 
				
			||||||
 | 
					            if e.errno == errno.ENOENT:
 | 
				
			||||||
 | 
					                pass
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                raise
 | 
				
			||||||
        self.storage.remove()
 | 
					        self.storage.remove()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def clone_disk_files(self, src, pool=None, pools=None, ):
 | 
					    def clone_disk_files(self, src, pool=None, pools=None, ):
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user