Hello Dan Kenigsberg,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/31668

to review the following change.

Change subject: vm: make _isDomainRunning more robust
......................................................................

vm: make _isDomainRunning more robust

The Vm._dom atrribute may be set to None
asynchronously by the _onQemuDeath callback.

This patch makes sure that the
Vm._isDomainRunning method can cope with this fact.

Change-Id: Idf58cc3a90fd85b858afba4f86f275b4059fe3e7
Relates-To: https://bugzilla.redhat.com/1104733
Signed-off-by: Francesco Romani <[email protected]>
Reviewed-on: http://gerrit.ovirt.org/30139
Reviewed-by: Dan Kenigsberg <[email protected]>
---
M tests/vmTests.py
M vdsm/virt/vm.py
2 files changed, 42 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/68/31668/1

diff --git a/tests/vmTests.py b/tests/vmTests.py
index c1284ea..1a0a751 100644
--- a/tests/vmTests.py
+++ b/tests/vmTests.py
@@ -55,16 +55,28 @@
 
 
 class FakeDomain(object):
-    def __init__(self, xml='',  vmId=''):
+    def __init__(self, xml='',
+                 virtError=libvirt.VIR_ERR_OK,
+                 domState=libvirt.VIR_DOMAIN_RUNNING,
+                 vmId=''):
         self._xml = xml
         self.devXml = ''
+        self._virtError = virtError
+        self._domState = domState
         self._vmId = vmId
+
+    def _failIfRequested(self):
+        if self._virtError != libvirt.VIR_ERR_OK:
+            err = libvirt.libvirtError(defmsg='')
+            err.err = [self._virtError]
+            raise err
 
     def UUIDString(self):
         return self._vmId
 
     def info(self):
-        raise libvirt.libvirtError(defmsg='')
+        self._failIfRequested()
+        return (self._domState, )
 
     def XMLDesc(self, unused):
         return self._xml
@@ -1002,6 +1014,21 @@
                 'existingConnAction': 'disconnect'})
             self.assertEquals(fake._dom.devXml, devXml)
 
+    def testDomainNotRunningWithoutDomain(self):
+        with FakeVM() as fake:
+            self.assertEqual(fake._dom, None)
+            self.assertFalse(fake._isDomainRunning())
+
+    def testDomainNotRunningByState(self):
+        with FakeVM() as fake:
+            fake._dom = FakeDomain(domState=libvirt.VIR_DOMAIN_SHUTDOWN)
+            self.assertFalse(fake._isDomainRunning())
+
+    def testDomainIsRunning(self):
+        with FakeVM() as fake:
+            fake._dom = FakeDomain(domState=libvirt.VIR_DOMAIN_RUNNING)
+            self.assertTrue(fake._isDomainRunning())
+
 
 VM_EXITS = tuple(product((define.NORMAL, define.ERROR),
                  vmexitreason.exitReasons.keys()))
@@ -1075,7 +1102,8 @@
     def testGetStatsDomInfoFail(self):
         # bz1073478 - extra case
         with FakeVM(self.VM_PARAMS, self.DEV_BALLOON) as fake:
-            fake._dom = FakeDomain()
+            fake._dom = FakeDomain(
+                virtError=libvirt.VIR_ERR_NO_DOMAIN)
             mock_stats_thread = vm.VmStatsThread(fake)
             res = {}
             mock_stats_thread._getBalloonStats(res)
diff --git a/vdsm/virt/vm.py b/vdsm/virt/vm.py
index 1847680..03c8a91 100644
--- a/vdsm/virt/vm.py
+++ b/vdsm/virt/vm.py
@@ -3137,9 +3137,18 @@
         utils.rmFile(self._recoveryFile)
         self._guestSockCleanup(self._qemuguestSocketFile)
 
+    def _isDomainRunning(self):
+        try:
+            status = self._dom.info()
+        except AttributeError:
+            # self._dom may be set to None asynchronously. see _onQemuDeath.
+            # If so, the VM is shutting down or already shut down.
+            return False
+        else:
+            return status[0] == libvirt.VIR_DOMAIN_RUNNING
+
     def updateGuestCpuRunning(self):
-        self._guestCpuRunning = (self._dom.info()[0] ==
-                                 libvirt.VIR_DOMAIN_RUNNING)
+        self._guestCpuRunning = self._isDomainRunning()
 
     def _getUnderlyingVmDevicesInfo(self):
         """


-- 
To view, visit http://gerrit.ovirt.org/31668
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Idf58cc3a90fd85b858afba4f86f275b4059fe3e7
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: ovirt-3.5
Gerrit-Owner: Francesco Romani <[email protected]>
Gerrit-Reviewer: Dan Kenigsberg <[email protected]>
_______________________________________________
vdsm-patches mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches

Reply via email to