Merge remote-tracking branch 'qubesos/pr/192'
* qubesos/pr/192: storage/lvm: add more details to refused volume shrink message tests: storage/lvm resize storage/lvm: fix resizing not persistent volumes
This commit is contained in:
		
						commit
						7731a56daa
					
				| @ -227,6 +227,8 @@ class ThinVolume(qubes.storage.Volume): | ||||
|     @property | ||||
|     def size(self): | ||||
|         try: | ||||
|             if self.is_dirty(): | ||||
|                 return qubes.storage.lvm.size_cache[self._vid_snap]['size'] | ||||
|             return qubes.storage.lvm.size_cache[self.vid]['size'] | ||||
|         except KeyError: | ||||
|             return self._size | ||||
| @ -427,18 +429,19 @@ class ThinVolume(qubes.storage.Volume): | ||||
|         if size < self.size: | ||||
|             raise qubes.storage.StoragePoolException( | ||||
|                 'For your own safety, shrinking of %s is' | ||||
|                 ' disabled. If you really know what you' | ||||
|                 ' disabled (%d < %d). If you really know what you' | ||||
|                 ' are doing, use `lvresize` on %s manually.' % | ||||
|                 (self.name, self.vid)) | ||||
|                 (self.name, size, self.size, self.vid)) | ||||
| 
 | ||||
|         if size == self.size: | ||||
|             return | ||||
| 
 | ||||
|         cmd = ['extend', self.vid, str(size)] | ||||
|         qubes_lvm(cmd, self.log) | ||||
|         if self.is_dirty(): | ||||
|             cmd = ['extend', self._vid_snap, str(size)] | ||||
|             qubes_lvm(cmd, self.log) | ||||
|         elif self.save_on_stop or not self.snap_on_start: | ||||
|             cmd = ['extend', self.vid, str(size)] | ||||
|             qubes_lvm(cmd, self.log) | ||||
|         reset_cache() | ||||
| 
 | ||||
|     def _snapshot(self): | ||||
|  | ||||
| @ -178,6 +178,60 @@ class TC_00_ThinPool(ThinPoolBase): | ||||
|         pool_usage = float(pool_usage) | ||||
|         self.assertEqual(usage, int(pool_size * pool_usage / 100)) | ||||
| 
 | ||||
|     def _get_size(self, path): | ||||
|         if os.getuid() != 0: | ||||
|             return int( | ||||
|                 subprocess.check_output( | ||||
|                     ['sudo', 'blockdev', '--getsize64', path])) | ||||
|         fd = os.open(path, os.O_RDONLY) | ||||
|         try: | ||||
|             return os.lseek(fd, 0, os.SEEK_END) | ||||
|         finally: | ||||
|             os.close(fd) | ||||
| 
 | ||||
|     def test_006_resize(self): | ||||
|         config = { | ||||
|             'name': 'root', | ||||
|             'pool': self.pool.name, | ||||
|             'rw': True, | ||||
|             'save_on_stop': True, | ||||
|             'size': 32 * 1024**2, | ||||
|         } | ||||
|         vm = qubes.tests.storage.TestVM(self) | ||||
|         volume = self.app.get_pool(self.pool.name).init_volume(vm, config) | ||||
|         volume.create() | ||||
|         self.addCleanup(volume.remove) | ||||
|         path = "/dev/%s" % volume.vid | ||||
|         new_size = 64 * 1024 ** 2 | ||||
|         volume.resize(new_size) | ||||
|         self.assertEqual(self._get_size(path), new_size) | ||||
|         self.assertEqual(volume.size, new_size) | ||||
| 
 | ||||
|     def test_007_resize_running(self): | ||||
|         old_size = 32 * 1024**2 | ||||
|         config = { | ||||
|             'name': 'root', | ||||
|             'pool': self.pool.name, | ||||
|             'rw': True, | ||||
|             'save_on_stop': True, | ||||
|             'size': old_size, | ||||
|         } | ||||
|         vm = qubes.tests.storage.TestVM(self) | ||||
|         volume = self.app.get_pool(self.pool.name).init_volume(vm, config) | ||||
|         volume.create() | ||||
|         self.addCleanup(volume.remove) | ||||
|         volume.start() | ||||
|         path = "/dev/%s" % volume.vid | ||||
|         path2 = "/dev/%s" % volume._vid_snap | ||||
|         new_size = 64 * 1024 ** 2 | ||||
|         volume.resize(new_size) | ||||
|         self.assertEqual(self._get_size(path), old_size) | ||||
|         self.assertEqual(self._get_size(path2), new_size) | ||||
|         self.assertEqual(volume.size, new_size) | ||||
|         volume.stop() | ||||
|         self.assertEqual(self._get_size(path), new_size) | ||||
|         self.assertEqual(volume.size, new_size) | ||||
| 
 | ||||
| 
 | ||||
| @skipUnlessLvmPoolExists | ||||
| class TC_01_ThinPool(ThinPoolBase, qubes.tests.SystemTestCase): | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki