Пример #1
0
 def test_acquire_contextmanager(self):
     expected_calls = []
     rm = FakeResourceManager()
     acquire_args = ('ns', 'name', 'locktype')
     with rm.acquireResource(*acquire_args):
         expected_calls.append(('acquireResource', acquire_args, {}))
         self.assertEqual(expected_calls, rm.__calls__)
     expected_calls.append(('releaseResource', acquire_args, {}))
     self.assertEqual(expected_calls, rm.__calls__)
Пример #2
0
 def test_acquire_contextmanager(self):
     expected_calls = []
     rm = FakeResourceManager()
     acquire_args = ('ns', 'name', 'locktype')
     with rm.acquireResource(*acquire_args):
         expected_calls.append(('acquireResource', acquire_args, {}))
         self.assertEqual(expected_calls, rm.__calls__)
     expected_calls.append(('releaseResource', acquire_args, {}))
     self.assertEqual(expected_calls, rm.__calls__)
Пример #3
0
    def make_env(self,
                 sd_type,
                 chain_len=2,
                 base_format=sc.RAW_FORMAT,
                 qcow2_compat='0.10'):
        size = MiB
        base_fmt = base_format
        with fake_env(sd_type) as env:
            rm = FakeResourceManager()
            with MonkeyPatchScope([
                (guarded, 'context', fake_guarded_context()),
                (image, 'sdCache', env.sdcache),
                (merge, 'sdCache', env.sdcache),
                (blockVolume, 'rm', rm),
                (image, 'Image', FakeImage),
            ]):
                env.chain = make_qemu_chain(env,
                                            size,
                                            base_fmt,
                                            chain_len,
                                            qcow2_compat=qcow2_compat)

                def fake_chain(sdUUID, imgUUID, volUUID=None):
                    return env.chain

                image.Image.getChain = fake_chain

                yield env
Пример #4
0
    def make_env(self,
                 sd_type='block',
                 format='raw',
                 prealloc=sc.SPARSE_VOL,
                 chain_len=2):
        size = 2 * GiB
        base_fmt = sc.name2type(format)
        with fake_env(sd_type) as env:
            with MonkeyPatch().context() as mp:
                mp.setattr(guarded, 'context', fake_guarded_context())
                mp.setattr(merge, 'sdCache', env.sdcache)
                mp.setattr(blockVolume, 'rm', FakeResourceManager())
                mp.setattr(image, 'Image', FakeImage)

                env.chain = make_qemu_chain(env,
                                            size,
                                            base_fmt,
                                            chain_len,
                                            prealloc=prealloc)

                volumes = {(vol.imgUUID, vol.volUUID): FakeVolume()
                           for vol in env.chain}
                env.sdcache.domains[env.sd_manifest.sdUUID].volumes = volumes

                def fake_chain(self, sdUUID, imgUUID, volUUID=None):
                    return env.chain

                image.Image.getChain = fake_chain
                image.Image.syncVolumeChain = FakeSyncVolumeChain()

                yield env
Пример #5
0
 def make_env(self,
              storage_type,
              src_fmt,
              dst_fmt,
              chain_length=1,
              size=DEFAULT_SIZE,
              sd_version=3,
              src_qcow2_compat='0.10',
              prealloc=sc.SPARSE_VOL):
     with fake_env(storage_type, sd_version=sd_version) as env:
         rm = FakeResourceManager()
         with MonkeyPatchScope([
             (guarded, 'context', fake_guarded_context()),
             (copy_data, 'sdCache', env.sdcache),
             (blockVolume, 'rm', rm),
         ]):
             # Create existing volume - may use compat 0.10 or 1.1.
             src_vols = make_qemu_chain(env,
                                        size,
                                        src_fmt,
                                        chain_length,
                                        qcow2_compat=src_qcow2_compat,
                                        prealloc=prealloc)
             # New volumes are always created using the domain
             # prefered format.
             sd_compat = env.sd_manifest.qcow2_compat()
             dst_vols = make_qemu_chain(env,
                                        size,
                                        dst_fmt,
                                        chain_length,
                                        qcow2_compat=sd_compat,
                                        prealloc=prealloc)
             env.src_chain = src_vols
             env.dst_chain = dst_vols
             yield env
Пример #6
0
class TestResourceManagerLock(VdsmTestCase):

    def test_properties(self):
        a = rm.ResourceManagerLock('ns', 'name', 'mode')
        self.assertEqual('ns', a.ns)
        self.assertEqual('name', a.name)
        self.assertEqual('mode', a.mode)

    @permutations((
        (('nsA', 'nameA', 'mode'), ('nsB', 'nameA', 'mode')),
        (('nsA', 'nameA', 'mode'), ('nsA', 'nameB', 'mode')),
    ))
    def test_less_than(self, a, b):
        b = rm.ResourceManagerLock(*b)
        a = rm.ResourceManagerLock(*a)
        self.assertLess(a, b)

    def test_equality(self):
        a = rm.ResourceManagerLock('ns', 'name', 'mode')
        b = rm.ResourceManagerLock('ns', 'name', 'mode')
        self.assertEqual(a, b)

    def test_mode_used_for_equality(self):
        a = rm.ResourceManagerLock('nsA', 'nameA', 'modeA')
        b = rm.ResourceManagerLock('nsA', 'nameA', 'modeB')
        self.assertNotEqual(a, b)

    def test_mode_ignored_for_sorting(self):
        a = rm.ResourceManagerLock('nsA', 'nameA', 'modeA')
        b = rm.ResourceManagerLock('nsA', 'nameA', 'modeB')
        self.assertFalse(a < b)
        self.assertFalse(b < a)

    @MonkeyPatch(rm, "_manager", FakeResourceManager())
    def test_acquire_release(self):
        lock = rm.ResourceManagerLock('ns_A', 'name_A', rm.SHARED)
        expected = []
        lock.acquire()
        expected.append(('acquireResource',
                         (lock.ns, lock.name, lock.mode),
                         {"timeout": None}))
        self.assertEqual(expected, rm._manager.__calls__)
        lock.release()
        expected.append(('releaseResource', (lock.ns, lock.name), {}))
        self.assertEqual(expected, rm._manager.__calls__)

    def test_repr(self):
        mode = rm.SHARED
        lock = rm.ResourceManagerLock('ns', 'name', mode)
        lock_string = str(lock)
        self.assertIn("ResourceManagerLock", lock_string)
        self.assertIn("ns=ns", lock_string)
        self.assertIn("name=name", lock_string)
        self.assertIn("mode=" + mode, lock_string)
        self.assertIn("%x" % id(lock), lock_string)
Пример #7
0
class TestResourceManagerLock:
    def test_properties(self):
        a = rm.ResourceManagerLock('ns', 'name', 'mode')
        assert a.ns == 'ns'
        assert a.name == 'name'
        assert a.mode == 'mode'

    @pytest.mark.parametrize('a, b', [
        (('nsA', 'nameA', 'mode'), ('nsB', 'nameA', 'mode')),
        (('nsA', 'nameA', 'mode'), ('nsA', 'nameB', 'mode')),
    ])
    def test_less_than(self, a, b):
        b = rm.ResourceManagerLock(*b)
        a = rm.ResourceManagerLock(*a)
        assert a < b

    def test_equality(self):
        a = rm.ResourceManagerLock('ns', 'name', 'mode')
        b = rm.ResourceManagerLock('ns', 'name', 'mode')
        assert a == b

    def test_mode_used_for_equality(self):
        a = rm.ResourceManagerLock('nsA', 'nameA', 'modeA')
        b = rm.ResourceManagerLock('nsA', 'nameA', 'modeB')
        assert a != b

    def test_mode_ignored_for_sorting(self):
        a = rm.ResourceManagerLock('nsA', 'nameA', 'modeA')
        b = rm.ResourceManagerLock('nsA', 'nameA', 'modeB')
        assert not a < b
        assert not b < a

    @MonkeyPatch(rm, "_manager", FakeResourceManager())
    def test_acquire_release(self):
        lock = rm.ResourceManagerLock('ns_A', 'name_A', rm.SHARED)
        expected = []
        lock.acquire()
        expected.append(('acquireResource', (lock.ns, lock.name, lock.mode), {
            "timeout": None
        }))
        assert expected == rm._manager.__calls__
        lock.release()
        expected.append(('releaseResource', (lock.ns, lock.name), {}))
        assert expected == rm._manager.__calls__

    def test_repr(self):
        mode = rm.SHARED
        lock = rm.ResourceManagerLock('ns', 'name', mode)
        lock_string = str(lock)
        assert "ResourceManagerLock" in lock_string
        assert "ns=ns" in lock_string
        assert "name=name" in lock_string
        assert "mode=" + mode in lock_string
        assert "%x" % id(lock) in lock_string
Пример #8
0
 def make_env(self, storage_type, fmt=sc.name2type('cow'), chain_length=1,
              size=DEFAULT_SIZE, qcow2_compat='0.10'):
     with fake_env(storage_type, sd_version=4) as env:
         rm = FakeResourceManager()
         with MonkeyPatchScope([
             (guarded, 'context', fake_guarded_context()),
             (copy_data, 'sdCache', env.sdcache),
             (blockVolume, 'rm', rm),
         ]):
             env.chain = make_qemu_chain(env, size, fmt, chain_length,
                                         qcow2_compat=qcow2_compat)
             yield env
Пример #9
0
 def test_acquire_release(self, monkeypatch):
     monkeypatch.setattr(rm, "_manager", FakeResourceManager())
     lock = rm.ResourceManagerLock('ns_A', 'name_A', rm.SHARED)
     expected = []
     lock.acquire()
     expected.append(('acquireResource', (lock.ns, lock.name, lock.mode), {
         "timeout": None
     }))
     assert expected == rm._manager.__calls__
     lock.release()
     expected.append(('releaseResource', (lock.ns, lock.name), {}))
     assert expected == rm._manager.__calls__
Пример #10
0
def make_env(env_type, base, top):
    img_id = make_uuid()
    base_id = make_uuid()
    top_id = make_uuid()

    if env_type == 'block' and base.format == 'raw':
        prealloc = sc.PREALLOCATED_VOL
    else:
        prealloc = sc.SPARSE_VOL

    with fake_env(env_type) as env:
        with MonkeyPatch().context() as mp:
            mp.setattr(guarded, 'context', fake_guarded_context())
            mp.setattr(merge, 'sdCache', env.sdcache)
            mp.setattr(blockVolume, "config", CONFIG)
            mp.setattr(blockVolume, 'rm', FakeResourceManager())
            mp.setattr(blockVolume, 'sdCache', env.sdcache)
            mp.setattr(
                image.Image, 'getChain', lambda self, sdUUID, imgUUID:
                [env.subchain.base_vol, env.subchain.top_vol])

            env.make_volume(base.virtual * GiB,
                            img_id,
                            base_id,
                            vol_format=sc.name2type(base.format),
                            prealloc=prealloc,
                            vol_type=sc.INTERNAL_VOL)

            env.make_volume(
                top.virtual * GiB,
                img_id,
                top_id,
                parent_vol_id=base_id,
                vol_format=sc.COW_FORMAT,
                vol_type=sc.LEAF_VOL if top.leaf else sc.INTERNAL_VOL)

            env.subchain = merge.SubchainInfo(
                dict(sd_id=env.sd_manifest.sdUUID,
                     img_id=img_id,
                     base_id=base_id,
                     top_id=top_id), 0)

            if env_type == 'block':
                # Simulate allocation by adjusting the LV sizes
                env.lvm.extendLV(env.sd_manifest.sdUUID, base_id,
                                 base.physical * GiB // MiB)
                env.lvm.extendLV(env.sd_manifest.sdUUID, top_id,
                                 top.physical * GiB // MiB)

            yield env
Пример #11
0
    def test_with_release_error(self, monkeypatch):
        monkeypatch.setattr(rm, "_manager", FakeResourceManager())
        lock = rm.Lock('ns_A', 'name_A', rm.SHARED)

        class ReleaseError(Exception):
            pass

        def releaseResource(ns, name):
            raise ReleaseError

        rm._manager.releaseResource = releaseResource

        with pytest.raises(ReleaseError):
            with lock:
                pass
Пример #12
0
def make_env(env_type, base, top):
    img_id = make_uuid()
    base_id = make_uuid()
    top_id = make_uuid()

    if env_type == 'block' and base.format == 'raw':
        prealloc = sc.PREALLOCATED_VOL
    else:
        prealloc = sc.SPARSE_VOL

    with fake_env(env_type) as env:
        env.make_volume(base.virtual * GB,
                        img_id,
                        base_id,
                        vol_format=sc.name2type(base.format),
                        prealloc=prealloc)
        env.make_volume(top.virtual * GB,
                        img_id,
                        top_id,
                        parent_vol_id=base_id,
                        vol_format=sc.COW_FORMAT)
        env.subchain = merge.SubchainInfo(
            dict(sd_id=env.sd_manifest.sdUUID,
                 img_id=img_id,
                 base_id=base_id,
                 top_id=top_id), 0)

        if env_type == 'block':
            # Simulate allocation by adjusting the LV sizes
            env.lvm.extendLV(env.sd_manifest.sdUUID, base_id,
                             base.physical * GB / MB)
            env.lvm.extendLV(env.sd_manifest.sdUUID, top_id,
                             top.physical * GB / MB)

        rm = FakeResourceManager()
        with MonkeyPatchScope([
            (guarded, 'context', fake_guarded_context()),
            (merge, 'sdCache', env.sdcache),
            (blockVolume, 'rm', rm),
            (blockVolume, 'sdCache', env.sdcache),
            (image.Image, 'getChain', lambda self, sdUUID, imgUUID:
             [env.subchain.base_vol, env.subchain.top_vol]),
            (blockVolume.BlockVolume, 'extendSize',
             partial(fake_blockVolume_extendSize, env)),
            (fileVolume.FileVolume, 'extendSize',
             partial(fake_fileVolume_extendSize, env)),
        ]):
            yield env
Пример #13
0
    def test_with(self, monkeypatch):
        monkeypatch.setattr(rm, "_manager", FakeResourceManager())
        lock = rm.Lock('ns_A', 'name_A', rm.SHARED)

        with lock:
            # Resource should be aquired here.
            assert rm._manager.__calls__ == [
                ('acquireResource', (lock.ns, lock.name, lock.mode), {
                    "timeout": None
                })
            ]
            rm._manager.__calls__.clear()

        # Resource should be released here.
        assert rm._manager.__calls__ == [('releaseResource', (lock.ns,
                                                              lock.name), {})]
Пример #14
0
    def test_with_user_error(self, monkeypatch):
        monkeypatch.setattr(rm, "_manager", FakeResourceManager())
        lock = rm.Lock('ns_A', 'name_A', rm.SHARED)

        class UserError(Exception):
            pass

        with pytest.raises(UserError):
            with lock:
                raise UserError

        assert rm._manager.__calls__ == [
            ('acquireResource', (lock.ns, lock.name, lock.mode), {
                "timeout": None
            }), ('releaseResource', (lock.ns, lock.name), {})
        ]
Пример #15
0
    def make_env(self, sd_type='file', format='raw', chain_len=2,
                 shared=False):
        size = MiB
        base_fmt = sc.name2type(format)
        with fake_env(sd_type) as env:
            with MonkeyPatch().context() as mp:
                mp.setattr(guarded, 'context', fake_guarded_context())
                mp.setattr(merge, 'sdCache', env.sdcache)
                mp.setattr(blockVolume, 'rm', FakeResourceManager())

                env.chain = make_qemu_chain(env, size, base_fmt, chain_len)

                def fake_chain(self, sdUUID, imgUUID, volUUID=None):
                    return env.chain

                image.Image.getChain = fake_chain

                yield env
Пример #16
0
    def make_env(self, sd_type='file', format='raw', chain_len=2,
                 shared=False):
        size = 1048576
        base_fmt = sc.name2type(format)
        with fake_env(sd_type) as env:
            rm = FakeResourceManager()
            with MonkeyPatchScope([
                (guarded, 'context', fake_guarded_context()),
                (merge, 'sdCache', env.sdcache),
                (blockVolume, 'rm', rm),
            ]):
                env.chain = make_qemu_chain(env, size, base_fmt, chain_len)

                def fake_chain(self, sdUUID, imgUUID, volUUID=None):
                    return env.chain

                image.Image.getChain = fake_chain

                yield env
Пример #17
0
def make_env(storage_type,
             fmt,
             chain_length=1,
             size=DEFAULT_SIZE,
             sd_version=5,
             qcow2_compat='1.1'):
    with fake_env(storage_type, sd_version=sd_version) as env:
        rm = FakeResourceManager()
        with MonkeyPatchScope([
            (guarded, 'context', fake_guarded_context()),
            (volume_info, 'sdCache', env.sdcache),
            (blockVolume, 'rm', rm),
        ]):
            env.chain = make_qemu_chain(env,
                                        size,
                                        fmt,
                                        chain_length,
                                        qcow2_compat=qcow2_compat)
            yield env
Пример #18
0
    def make_env(self, sd_type='block', format='raw', chain_len=2):
        size = 1048576
        base_fmt = sc.name2type(format)
        with fake_env(sd_type) as env:
            rm = FakeResourceManager()
            with MonkeyPatchScope([
                (guarded, 'context', fake_guarded_context()),
                (merge, 'sdCache', env.sdcache),
                (blockVolume, 'rm', rm),
                (image, 'Image', FakeImage),
            ]):
                env.chain = make_qemu_chain(env, size, base_fmt, chain_len)

                volumes = {(vol.imgUUID, vol.volUUID): FakeVolume()
                           for vol in env.chain}
                env.sdcache.domains[env.sd_manifest.sdUUID].volumes = volumes

                def fake_chain(self, sdUUID, imgUUID, volUUID=None):
                    return env.chain

                image.Image.getChain = fake_chain
                image.Image.syncVolumeChain = FakeSyncVolumeChain()

                yield env
Пример #19
0
 def _fake_env(self):
     self.rm = FakeResourceManager()
     with MonkeyPatchScope([(create_volume, 'rm', self.rm)]):
         yield