Merge "Add test of claim context manager abort"
This commit is contained in:
commit
cde5b5b993
@ -913,50 +913,6 @@ class InstanceClaimTestCase(BaseTrackerTestCase):
|
||||
objects.NUMATopology.obj_from_db_obj(
|
||||
self.compute['numa_topology']))
|
||||
|
||||
@mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid',
|
||||
return_value=objects.InstancePCIRequests(requests=[]))
|
||||
@mock.patch('nova.objects.Instance.save')
|
||||
@mock.patch('nova.objects.InstanceList.get_by_host_and_node')
|
||||
def test_instance_context_claim(self, mock_get_all, mock_save, mock_get):
|
||||
flavor = self._fake_flavor_create(
|
||||
memory_mb=1, root_gb=2, ephemeral_gb=3)
|
||||
claim_topology = self._claim_topology(1)
|
||||
|
||||
instance_topology = self._instance_topology(1)
|
||||
instance = self._fake_instance_obj(
|
||||
flavor=flavor, numa_topology=instance_topology)
|
||||
with self.tracker.instance_claim(self.context, instance):
|
||||
# <insert exciting things that utilize resources>
|
||||
self.assertEqual(flavor['memory_mb'] + FAKE_VIRT_MEMORY_OVERHEAD,
|
||||
self.tracker.compute_node.memory_mb_used)
|
||||
self.assertEqual(flavor['root_gb'] + flavor['ephemeral_gb'],
|
||||
self.tracker.compute_node.local_gb_used)
|
||||
self.assertEqual(flavor['memory_mb'] + FAKE_VIRT_MEMORY_OVERHEAD,
|
||||
self.compute['memory_mb_used'])
|
||||
self.assertEqualNUMAHostTopology(
|
||||
claim_topology,
|
||||
objects.NUMATopology.obj_from_db_obj(
|
||||
self.compute['numa_topology']))
|
||||
self.assertEqual(flavor['root_gb'] + flavor['ephemeral_gb'],
|
||||
self.compute['local_gb_used'])
|
||||
|
||||
# after exiting claim context, build is marked as finished. usage
|
||||
# totals should be same:
|
||||
mock_get_all.return_value = [instance]
|
||||
self.tracker.update_available_resource(self.context)
|
||||
self.assertEqual(flavor['memory_mb'] + FAKE_VIRT_MEMORY_OVERHEAD,
|
||||
self.tracker.compute_node.memory_mb_used)
|
||||
self.assertEqual(flavor['root_gb'] + flavor['ephemeral_gb'],
|
||||
self.tracker.compute_node.local_gb_used)
|
||||
self.assertEqual(flavor['memory_mb'] + FAKE_VIRT_MEMORY_OVERHEAD,
|
||||
self.compute['memory_mb_used'])
|
||||
self.assertEqualNUMAHostTopology(
|
||||
claim_topology,
|
||||
objects.NUMATopology.obj_from_db_obj(
|
||||
self.compute['numa_topology']))
|
||||
self.assertEqual(flavor['root_gb'] + flavor['ephemeral_gb'],
|
||||
self.compute['local_gb_used'])
|
||||
|
||||
@mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid',
|
||||
return_value=objects.InstancePCIRequests(requests=[]))
|
||||
def test_update_load_stats_for_instance(self, mock_get):
|
||||
@ -1090,23 +1046,6 @@ class _MoveClaimTestCase(BaseTrackerTestCase):
|
||||
self.instance_type = self._fake_flavor_create()
|
||||
self.claim_method = self.tracker._move_claim
|
||||
|
||||
@mock.patch('nova.objects.Instance.save')
|
||||
@mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid',
|
||||
return_value=objects.InstancePCIRequests(requests=[]))
|
||||
def test_abort(self, mock_get, mock_save):
|
||||
try:
|
||||
with self.claim_method(self.context, self.instance,
|
||||
self.instance_type, limits=self.limits):
|
||||
raise test.TestingException("abort")
|
||||
except test.TestingException:
|
||||
pass
|
||||
|
||||
self._assert(0, 'memory_mb_used')
|
||||
self._assert(0, 'local_gb_used')
|
||||
self._assert(0, 'vcpus_used')
|
||||
self.assertEqual(0, len(self.tracker.tracked_migrations))
|
||||
mock_save.assert_called_once_with()
|
||||
|
||||
@mock.patch('nova.objects.Instance.save')
|
||||
@mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid',
|
||||
return_value=objects.InstancePCIRequests(requests=[]))
|
||||
@ -1129,22 +1068,6 @@ class _MoveClaimTestCase(BaseTrackerTestCase):
|
||||
self._assert(2 * FAKE_VIRT_LOCAL_GB, 'local_gb_used')
|
||||
self._assert(2 * FAKE_VIRT_VCPUS, 'vcpus_used')
|
||||
|
||||
@mock.patch('nova.objects.Instance.save')
|
||||
@mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid',
|
||||
return_value=objects.InstancePCIRequests(requests=[]))
|
||||
def test_revert(self, mock_get, mock_save):
|
||||
self.claim_method(
|
||||
self.context, self.instance, self.instance_type,
|
||||
image_meta={}, limits=self.limits)
|
||||
mock_save.assert_called_once_with()
|
||||
self.tracker.drop_move_claim(self.context, self.instance)
|
||||
|
||||
self.assertEqual(0, len(self.tracker.tracked_instances))
|
||||
self.assertEqual(0, len(self.tracker.tracked_migrations))
|
||||
self._assert(0, 'memory_mb_used')
|
||||
self._assert(0, 'local_gb_used')
|
||||
self._assert(0, 'vcpus_used')
|
||||
|
||||
@mock.patch('nova.objects.Instance.save')
|
||||
@mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid',
|
||||
return_value=objects.InstancePCIRequests(requests=[]))
|
||||
|
@ -1125,6 +1125,7 @@ class TestInstanceClaim(BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestInstanceClaim, self).setUp()
|
||||
self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
|
||||
|
||||
self._setup_rt()
|
||||
self.rt.compute_node = copy.deepcopy(_COMPUTE_NODE_FIXTURES[0])
|
||||
@ -1229,6 +1230,32 @@ class TestInstanceClaim(BaseTestCase):
|
||||
self.assertTrue(obj_base.obj_equal_prims(expected,
|
||||
self.rt.compute_node))
|
||||
|
||||
@mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid')
|
||||
@mock.patch('nova.objects.MigrationList.get_in_progress_by_host_and_node')
|
||||
def test_claim_abort_context_manager(self, migr_mock, pci_mock):
|
||||
pci_mock.return_value = objects.InstancePCIRequests(requests=[])
|
||||
|
||||
self.assertEqual(0, self.rt.compute_node.local_gb_used)
|
||||
self.assertEqual(0, self.rt.compute_node.memory_mb_used)
|
||||
self.assertEqual(0, self.rt.compute_node.running_vms)
|
||||
|
||||
@mock.patch.object(self.instance, 'save')
|
||||
def _doit(mock_save):
|
||||
with self.rt.instance_claim(self.ctx, self.instance, None):
|
||||
# Raise an exception. Just make sure below that the abort()
|
||||
# method of the claim object was called (and the resulting
|
||||
# resources reset to the pre-claimed amounts)
|
||||
raise test.TestingException()
|
||||
|
||||
self.assertRaises(test.TestingException, _doit)
|
||||
|
||||
# Assert that the resources claimed by the Claim() constructor
|
||||
# are returned to the resource tracker due to the claim's abort()
|
||||
# method being called when triggered by the exception raised above.
|
||||
self.assertEqual(0, self.rt.compute_node.local_gb_used)
|
||||
self.assertEqual(0, self.rt.compute_node.memory_mb_used)
|
||||
self.assertEqual(0, self.rt.compute_node.running_vms)
|
||||
|
||||
@mock.patch('nova.objects.InstancePCIRequests.get_by_instance_uuid')
|
||||
@mock.patch('nova.objects.MigrationList.get_in_progress_by_host_and_node')
|
||||
def test_claim_abort(self, migr_mock, pci_mock):
|
||||
@ -1395,6 +1422,39 @@ class TestMoveClaim(BaseTestCase):
|
||||
self.assertTrue(obj_base.obj_equal_prims(expected,
|
||||
self.rt.compute_node))
|
||||
|
||||
def test_claim_abort(self, pci_mock, inst_list_mock,
|
||||
inst_by_uuid, migr_mock, inst_save_mock):
|
||||
# Resize self.instance and check that the expected quantities of each
|
||||
# resource have been consumed. The abort the resize claim and check
|
||||
# that the resources have been set back to their original values.
|
||||
self.register_mocks(pci_mock, inst_list_mock, inst_by_uuid, migr_mock,
|
||||
inst_save_mock)
|
||||
self.driver_mock.get_host_ip_addr.return_value = "fake-host"
|
||||
migr_obj = _MIGRATION_FIXTURES['dest-only']
|
||||
self.instance = _MIGRATION_INSTANCE_FIXTURES[migr_obj['instance_uuid']]
|
||||
mig_context_obj = _MIGRATION_CONTEXT_FIXTURES[self.instance.uuid]
|
||||
self.instance.migration_context = mig_context_obj
|
||||
self.flavor = _INSTANCE_TYPE_OBJ_FIXTURES[2]
|
||||
|
||||
with mock.patch.object(self.rt, '_create_migration') as migr_mock:
|
||||
migr_mock.return_value = migr_obj
|
||||
claim = self.rt.resize_claim(
|
||||
self.ctx, self.instance, self.flavor, None)
|
||||
|
||||
self.assertIsInstance(claim, claims.MoveClaim)
|
||||
self.assertEqual(5, self.rt.compute_node.local_gb_used)
|
||||
self.assertEqual(256, self.rt.compute_node.memory_mb_used)
|
||||
self.assertEqual(1, len(self.rt.tracked_migrations))
|
||||
|
||||
with mock.patch('nova.objects.Instance.'
|
||||
'drop_migration_context') as drop_migr_mock:
|
||||
claim.abort()
|
||||
drop_migr_mock.assert_called_once_with()
|
||||
|
||||
self.assertEqual(0, self.rt.compute_node.local_gb_used)
|
||||
self.assertEqual(0, self.rt.compute_node.memory_mb_used)
|
||||
self.assertEqual(0, len(self.rt.tracked_migrations))
|
||||
|
||||
def test_same_host(self, pci_mock, inst_list_mock, inst_by_uuid,
|
||||
migr_mock, inst_save_mock):
|
||||
"""Resize self.instance to the same host but with a different flavor.
|
||||
|
Loading…
x
Reference in New Issue
Block a user