コード例 #1
0
    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)
コード例 #2
0
    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())
コード例 #3
0
    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)