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