Francesco Romani has uploaded a new change for review. Change subject: WIP: RFC: virt: add VmTracker ......................................................................
WIP: RFC: virt: add VmTracker We need a more precise mean to track domain availability in periodic operations. (TODO: explain why, provide examples). WARNING: this patch is not yet ready for review, let alone merging. It is a proof of concept and live demo. Change-Id: Iab735193ea7b2e177e146099843cc31706379e68 Signed-off-by: Francesco Romani <[email protected]> --- M tests/vmUtilsTests.py M vdsm/virt/utils.py 2 files changed, 72 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/43/44543/5 diff --git a/tests/vmUtilsTests.py b/tests/vmUtilsTests.py index 53c4436..19686a2 100644 --- a/tests/vmUtilsTests.py +++ b/tests/vmUtilsTests.py @@ -18,6 +18,8 @@ # Refer to the README and COPYING files for full details of the license # +import uuid + from virt import utils from virt import vm from virt import vmexitreason @@ -142,3 +144,38 @@ str(e), vmexitreason.exitReasons.get( vmexitreason.LIBVIRT_DOMAIN_MISSING)) + + +class VmTrackerTests(TestCaseBase): + + NUM = 7 # random > 1 amount + + def setUp(self): + self.tracker = utils.VmTracker() + self.vms = set(str(uuid.uuid4()) + for _ in range(self.NUM)) + + def test_available_from_scratch(self): + self.assertEqual(self.tracker.reserve_available(self.vms), self.vms) + + def test_busy_until_cancelation(self): + avail = self.tracker.reserve_available(self.vms) + # now vms previously available are reserved + self.assertFalse(self.tracker.reserve_available(self.vms)) + + def test_available_after_use(self): + for vm in self.tracker.reserve_available(self.vms): + with self.tracker.run_on(vm): + pass + + self.assertEqual(self.tracker.reserve_available(self.vms), self.vms) + + def test_available_after_cancel(self): + for vm in self.tracker.reserve_available(self.vms): + self.tracker.release(vm) + + self.assertEqual(self.tracker.reserve_available(self.vms), self.vms) + + def test_busy_equals_reserved(self): + avail = self.tracker.reserve_available(self.vms) + self.assertEqual(avail, self.tracker.busy) diff --git a/vdsm/virt/utils.py b/vdsm/virt/utils.py index 55a60c6..21f8a7f 100644 --- a/vdsm/virt/utils.py +++ b/vdsm/virt/utils.py @@ -22,6 +22,7 @@ shared utilities and common code for the virt package """ +import contextlib import os.path import threading @@ -117,3 +118,37 @@ if os.path.islink(sock): rmFile(os.path.realpath(sock)) rmFile(sock) + + +# TODO: horrible unexpressive name. Find a better one. +class VmTracker(object): + + def __init__(self): + self._lock = threading.Lock() + self._busy = set() + + @property + def busy(self): + return self._busy + + def reserve_available(self, vm_ids): + """ + Expects vm_ids to be a set of vm.id + Return subset of vm_ids that it is free to run. + """ + with self._lock: + # we need lock to guard against concurrent + # invocations of this method. + avail = vm_ids - self._busy + self._busy.update(avail) + return avail + + def release(self, vm_id): + self._busy.remove(vm_id) + + @contextlib.contextmanager + def run_on(self, vm_id): + try: + yield self + finally: + self.release(vm_id) -- To view, visit https://gerrit.ovirt.org/44543 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iab735193ea7b2e177e146099843cc31706379e68 Gerrit-PatchSet: 5 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Francesco Romani <[email protected]> Gerrit-Reviewer: Francesco Romani <[email protected]> Gerrit-Reviewer: [email protected] _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
