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

Reply via email to