def test_011_migration2(self): '''VM started with old code, stopped with new''' config = { 'name': 'root', 'pool': self.pool.name, 'save_on_stop': True, 'rw': True, 'revisions_to_keep': 1, 'size': qubes.config.defaults['root_img_size'], } vm = qubes.tests.storage.TestVM(self) volume = self.app.get_pool(self.pool.name).init_volume(vm, config) # mock logging, to not interfere with time.time() mock volume.log = unittest.mock.Mock() # do not call volume.create(), do it manually to have old LV naming revisions = ['', '-snap'] orig_uuids = {} for rev in revisions: cmd = [ 'create', self.pool._pool_id, volume.vid.split('/')[1] + rev, str(config['size']) ] qubes_lvm(cmd) orig_uuids[rev] = self._get_lv_uuid(volume.vid + rev) qubes.storage.lvm.reset_cache() path_snap = '/dev/' + volume._vid_snap self.assertTrue(os.path.exists(path_snap), path_snap) expected_revisions = {} self.assertEqual(volume.revisions, expected_revisions) self.assertEqual(volume.path, '/dev/' + volume.vid) self.assertTrue(volume.is_dirty()) path = volume.path self.assertEqual(path, '/dev/' + volume.vid) self.assertTrue(os.path.exists(path), path) with unittest.mock.patch('time.time') as mock_time: mock_time.side_effect = ('1521065906', '1521065907') self.loop.run_until_complete(volume.stop()) revisions.extend(['-1521065906-back']) expected_revisions = { revisions[2].lstrip('-'): '2018-03-14T22:18:26', } self.assertEqual(volume.revisions, expected_revisions) self.assertEqual(volume.path, '/dev/' + volume.vid) path_snap = '/dev/' + volume._vid_snap self.assertFalse(os.path.exists(path_snap), path_snap) self.assertTrue(os.path.exists('/dev/' + volume.vid)) self.assertEqual(self._get_lv_uuid(volume.path), orig_uuids['-snap']) prev_path = '/dev/' + volume.vid + revisions[2] self.assertEqual(self._get_lv_uuid(prev_path), orig_uuids['']) self.loop.run_until_complete(volume.remove()) for rev in revisions: path = '/dev/' + volume.vid + rev self.assertFalse(os.path.exists(path), path)
def test_009_interrupted_commit(self): ''' Test volume changes commit''' config = { 'name': 'root', 'pool': self.pool.name, 'save_on_stop': True, 'rw': True, 'revisions_to_keep': 2, 'size': qubes.config.defaults['root_img_size'], } vm = qubes.tests.storage.TestVM(self) volume = self.app.get_pool(self.pool.name).init_volume(vm, config) # mock logging, to not interfere with time.time() mock volume.log = unittest.mock.Mock() # do not call volume.create(), do it manually to simulate # interrupted commit revisions = ['-1521065904-back', '-1521065905-back', '-snap'] orig_uuids = {} for rev in revisions: cmd = [ 'create', self.pool._pool_id, volume.vid.split('/')[1] + rev, str(config['size']) ] qubes_lvm(cmd) orig_uuids[rev] = self._get_lv_uuid(volume.vid + rev) qubes.storage.lvm.reset_cache() path_snap = '/dev/' + volume._vid_snap self.assertTrue(volume.is_dirty()) self.assertEqual(volume.path, '/dev/' + volume.vid + revisions[1]) expected_revisions = { revisions[0].lstrip('-'): '2018-03-14T22:18:24', revisions[1].lstrip('-'): '2018-03-14T22:18:25', } self.assertEqual(volume.revisions, expected_revisions) self.loop.run_until_complete(volume.start()) self.assertEqual(volume.revisions, expected_revisions) snap_uuid = self._get_lv_uuid(path_snap) self.assertEqual(orig_uuids['-snap'], snap_uuid) self.assertTrue(volume.is_dirty()) self.assertEqual(volume.path, '/dev/' + volume.vid + revisions[1]) with unittest.mock.patch('time.time') as mock_time: mock_time.side_effect = [521065906] self.loop.run_until_complete(volume.stop()) expected_revisions = { revisions[0].lstrip('-'): '2018-03-14T22:18:24', revisions[1].lstrip('-'): '2018-03-14T22:18:25', } self.assertFalse(volume.is_dirty()) self.assertEqual(volume.revisions, expected_revisions) self.assertEqual(volume.path, '/dev/' + volume.vid) self.assertEqual(snap_uuid, self._get_lv_uuid(volume.path)) self.assertFalse(os.path.exists(path_snap), path_snap) self.loop.run_until_complete(volume.remove())
def test_012_migration3(self): '''VM started with old code, started again with new, stopped with new''' config = { 'name': 'root', 'pool': self.pool.name, 'save_on_stop': True, 'rw': True, 'revisions_to_keep': 1, 'size': qubes.config.defaults['root_img_size'], } vm = qubes.tests.storage.TestVM(self) volume = self.app.get_pool(self.pool.name).init_volume(vm, config) # mock logging, to not interfere with time.time() mock volume.log = unittest.mock.Mock() # do not call volume.create(), do it manually to have old LV naming revisions = ['', '-snap'] orig_uuids = {} for rev in revisions: cmd = [ 'create', self.pool._pool_id, volume.vid.split('/')[1] + rev, str(config['size']) ] qubes_lvm(cmd) orig_uuids[rev] = self._get_lv_uuid(volume.vid + rev) qubes.storage.lvm.reset_cache() path_snap = '/dev/' + volume._vid_snap self.assertTrue(os.path.exists(path_snap), path_snap) expected_revisions = {} self.assertEqual(volume.revisions, expected_revisions) self.assertTrue(volume.path, '/dev/' + volume.vid) self.assertTrue(volume.is_dirty()) self.loop.run_until_complete(volume.start()) self.assertEqual(volume.revisions, expected_revisions) self.assertEqual(volume.path, '/dev/' + volume.vid) # -snap LV should be unchanged self.assertEqual(self._get_lv_uuid(volume._vid_snap), orig_uuids['-snap']) self.loop.run_until_complete(volume.remove()) for rev in revisions: path = '/dev/' + volume.vid + rev self.assertFalse(os.path.exists(path), path)