XenAPI: get_info was very expensive
Getting the whole VM record is expensive and slowed down Tempest tests significantly. Replaced with getting each required item. When getting power state, only need that specific value, so reduce the calls to get_info too. Change-Id: I93bcef5b692a531aac41518dc29d5d4f46cded65
This commit is contained in:
@@ -25,6 +25,7 @@ import mox
|
||||
from oslo.config import cfg
|
||||
|
||||
from nova.compute import flavors
|
||||
from nova.compute import power_state
|
||||
from nova.compute import vm_mode
|
||||
from nova import context
|
||||
from nova import exception
|
||||
@@ -2030,3 +2031,58 @@ class ResizeFunctionTestCase(test.NoDBTestCase):
|
||||
|
||||
def test_bad_version(self):
|
||||
self._test_is_resize("XenServer", "asdf")
|
||||
|
||||
|
||||
class VMInfoTests(VMUtilsTestBase):
|
||||
def setUp(self):
|
||||
super(VMInfoTests, self).setUp()
|
||||
self.session = mock.Mock()
|
||||
|
||||
def test_get_power_state_valid(self):
|
||||
# Save on test setup calls by having these simple tests in one method
|
||||
self.session.call_xenapi.return_value = "Running"
|
||||
self.assertEqual(vm_utils.get_power_state(self.session, "ref"),
|
||||
power_state.RUNNING)
|
||||
|
||||
self.session.call_xenapi.return_value = "Halted"
|
||||
self.assertEqual(vm_utils.get_power_state(self.session, "ref"),
|
||||
power_state.SHUTDOWN)
|
||||
|
||||
self.session.call_xenapi.return_value = "Paused"
|
||||
self.assertEqual(vm_utils.get_power_state(self.session, "ref"),
|
||||
power_state.PAUSED)
|
||||
|
||||
self.session.call_xenapi.return_value = "Suspended"
|
||||
self.assertEqual(vm_utils.get_power_state(self.session, "ref"),
|
||||
power_state.SUSPENDED)
|
||||
|
||||
self.session.call_xenapi.return_value = "Crashed"
|
||||
self.assertEqual(vm_utils.get_power_state(self.session, "ref"),
|
||||
power_state.CRASHED)
|
||||
|
||||
def test_get_power_state_invalid(self):
|
||||
self.session.call_xenapi.return_value = "Invalid"
|
||||
self.assertRaises(KeyError,
|
||||
vm_utils.get_power_state, self.session, "ref")
|
||||
|
||||
_XAPI_record = {'power_state': 'Running',
|
||||
'memory_static_max': str(10 << 10),
|
||||
'memory_dynamic_max': str(9 << 10),
|
||||
'VCPUs_max': '5'}
|
||||
|
||||
def test_compile_info(self):
|
||||
|
||||
def call_xenapi(method, *args):
|
||||
if method.startswith('VM.get_') and args[0] == 'dummy':
|
||||
return self._XAPI_record[method[7:]]
|
||||
|
||||
self.session.call_xenapi.side_effect = call_xenapi
|
||||
|
||||
expected = {'state': power_state.RUNNING,
|
||||
'max_mem': 10L,
|
||||
'mem': 9L,
|
||||
'num_cpu': '5',
|
||||
'cpu_time': 0}
|
||||
|
||||
self.assertEqual(vm_utils.compile_info(self.session, "dummy"),
|
||||
expected)
|
||||
|
||||
@@ -523,12 +523,13 @@ class SpawnTestCase(VMOpsTestBase):
|
||||
instance = {"uuid": "uuid"}
|
||||
vm_ref = "vm_ref"
|
||||
|
||||
self.mox.StubOutWithMock(self.vmops, 'get_info')
|
||||
self.mox.StubOutWithMock(vm_utils, 'get_power_state')
|
||||
self.mox.StubOutWithMock(greenthread, 'sleep')
|
||||
self.vmops.get_info(instance, vm_ref).AndReturn({"state": "asdf"})
|
||||
vm_utils.get_power_state(self._session, vm_ref).AndReturn(
|
||||
power_state.SHUTDOWN)
|
||||
greenthread.sleep(0.5)
|
||||
self.vmops.get_info(instance, vm_ref).AndReturn({
|
||||
"state": power_state.RUNNING})
|
||||
vm_utils.get_power_state(self._session, vm_ref).AndReturn(
|
||||
power_state.RUNNING)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
self.vmops._wait_for_instance_to_start(instance, vm_ref)
|
||||
|
||||
Reference in New Issue
Block a user