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 |     @property | ||||||
|     def size(self): |     def size(self): | ||||||
|         try: |         try: | ||||||
|  |             if self.is_dirty(): | ||||||
|  |                 return qubes.storage.lvm.size_cache[self._vid_snap]['size'] | ||||||
|             return qubes.storage.lvm.size_cache[self.vid]['size'] |             return qubes.storage.lvm.size_cache[self.vid]['size'] | ||||||
|         except KeyError: |         except KeyError: | ||||||
|             return self._size |             return self._size | ||||||
| @ -427,18 +429,19 @@ class ThinVolume(qubes.storage.Volume): | |||||||
|         if size < self.size: |         if size < self.size: | ||||||
|             raise qubes.storage.StoragePoolException( |             raise qubes.storage.StoragePoolException( | ||||||
|                 'For your own safety, shrinking of %s is' |                 '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.' % |                 ' are doing, use `lvresize` on %s manually.' % | ||||||
|                 (self.name, self.vid)) |                 (self.name, size, self.size, self.vid)) | ||||||
| 
 | 
 | ||||||
|         if size == self.size: |         if size == self.size: | ||||||
|             return |             return | ||||||
| 
 | 
 | ||||||
|         cmd = ['extend', self.vid, str(size)] |  | ||||||
|         qubes_lvm(cmd, self.log) |  | ||||||
|         if self.is_dirty(): |         if self.is_dirty(): | ||||||
|             cmd = ['extend', self._vid_snap, str(size)] |             cmd = ['extend', self._vid_snap, str(size)] | ||||||
|             qubes_lvm(cmd, self.log) |             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() |         reset_cache() | ||||||
| 
 | 
 | ||||||
|     def _snapshot(self): |     def _snapshot(self): | ||||||
|  | |||||||
| @ -178,6 +178,60 @@ class TC_00_ThinPool(ThinPoolBase): | |||||||
|         pool_usage = float(pool_usage) |         pool_usage = float(pool_usage) | ||||||
|         self.assertEqual(usage, int(pool_size * pool_usage / 100)) |         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 | @skipUnlessLvmPoolExists | ||||||
| class TC_01_ThinPool(ThinPoolBase, qubes.tests.SystemTestCase): | class TC_01_ThinPool(ThinPoolBase, qubes.tests.SystemTestCase): | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Marek Marczykowski-Górecki
						Marek Marczykowski-Górecki