Merge "Fail heal_allocations if placement is borked"
This commit is contained in:
commit
755d82a7eb
nova
@ -1813,10 +1813,12 @@ class PlacementCommands(object):
|
|||||||
try:
|
try:
|
||||||
allocations = placement.get_allocs_for_consumer(
|
allocations = placement.get_allocs_for_consumer(
|
||||||
ctxt, instance.uuid)
|
ctxt, instance.uuid)
|
||||||
except (ks_exc.ClientException,
|
except ks_exc.ClientException as e:
|
||||||
exception.ConsumerAllocationRetrievalFailed) as e:
|
raise exception.AllocationUpdateFailed(
|
||||||
|
instance=instance.uuid,
|
||||||
|
error=_("Allocation retrieval failed: %s") % e)
|
||||||
|
except exception.ConsumerAllocationRetrievalFailed as e:
|
||||||
output(_("Allocation retrieval failed: %s") % e)
|
output(_("Allocation retrieval failed: %s") % e)
|
||||||
# TODO(mriedem): Fail fast here, since we can't talk to placement.
|
|
||||||
allocations = None
|
allocations = None
|
||||||
|
|
||||||
# get_allocations_for_consumer uses safe_connect which will
|
# get_allocations_for_consumer uses safe_connect which will
|
||||||
|
@ -2494,7 +2494,7 @@ class TestNovaManagePlacement(test.NoDBTestCase):
|
|||||||
uuid=uuidsentinel.instance, host='fake', node='fake',
|
uuid=uuidsentinel.instance, host='fake', node='fake',
|
||||||
task_state=None)]))
|
task_state=None)]))
|
||||||
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
|
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
|
||||||
'get_allocations_for_consumer', return_value={})
|
'get_allocs_for_consumer', return_value={})
|
||||||
@mock.patch('nova.objects.ComputeNode.get_by_host_and_nodename',
|
@mock.patch('nova.objects.ComputeNode.get_by_host_and_nodename',
|
||||||
side_effect=exception.ComputeHostNotFound(host='fake'))
|
side_effect=exception.ComputeHostNotFound(host='fake'))
|
||||||
def test_heal_allocations_compute_host_not_found(
|
def test_heal_allocations_compute_host_not_found(
|
||||||
@ -2515,7 +2515,7 @@ class TestNovaManagePlacement(test.NoDBTestCase):
|
|||||||
task_state=None, flavor=objects.Flavor(),
|
task_state=None, flavor=objects.Flavor(),
|
||||||
project_id='fake-project', user_id='fake-user')]))
|
project_id='fake-project', user_id='fake-user')]))
|
||||||
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
|
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
|
||||||
'get_allocations_for_consumer', return_value={})
|
'get_allocs_for_consumer', return_value={})
|
||||||
@mock.patch('nova.objects.ComputeNode.get_by_host_and_nodename',
|
@mock.patch('nova.objects.ComputeNode.get_by_host_and_nodename',
|
||||||
return_value=objects.ComputeNode(uuid=uuidsentinel.node))
|
return_value=objects.ComputeNode(uuid=uuidsentinel.node))
|
||||||
@mock.patch('nova.scheduler.utils.resources_from_flavor',
|
@mock.patch('nova.scheduler.utils.resources_from_flavor',
|
||||||
@ -2537,6 +2537,54 @@ class TestNovaManagePlacement(test.NoDBTestCase):
|
|||||||
uuidsentinel.instance, mock.sentinel.resources, 'fake-project',
|
uuidsentinel.instance, mock.sentinel.resources, 'fake-project',
|
||||||
'fake-user')
|
'fake-user')
|
||||||
|
|
||||||
|
@mock.patch('nova.objects.CellMappingList.get_all',
|
||||||
|
new=mock.Mock(return_value=objects.CellMappingList(objects=[
|
||||||
|
objects.CellMapping(name='cell1',
|
||||||
|
uuid=uuidsentinel.cell1)])))
|
||||||
|
@mock.patch('nova.objects.InstanceList.get_by_filters',
|
||||||
|
new=mock.Mock(return_value=objects.InstanceList(objects=[
|
||||||
|
objects.Instance(
|
||||||
|
uuid=uuidsentinel.instance, host='fake', node='fake',
|
||||||
|
task_state=None, flavor=objects.Flavor(),
|
||||||
|
project_id='fake-project', user_id='fake-user')])))
|
||||||
|
def test_heal_allocations_get_allocs_placement_fails(self):
|
||||||
|
self.assertEqual(3, self.cli.heal_allocations())
|
||||||
|
output = self.output.getvalue()
|
||||||
|
self.assertIn('Allocation retrieval failed', output)
|
||||||
|
# Having not mocked get_allocs_for_consumer, we get MissingAuthPlugin.
|
||||||
|
self.assertIn('An auth plugin is required', output)
|
||||||
|
|
||||||
|
@mock.patch('nova.objects.CellMappingList.get_all',
|
||||||
|
new=mock.Mock(return_value=objects.CellMappingList(objects=[
|
||||||
|
objects.CellMapping(name='cell1',
|
||||||
|
uuid=uuidsentinel.cell1)])))
|
||||||
|
@mock.patch('nova.objects.InstanceList.get_by_filters',
|
||||||
|
side_effect=[
|
||||||
|
objects.InstanceList(objects=[objects.Instance(
|
||||||
|
uuid=uuidsentinel.instance, host='fake', node='fake',
|
||||||
|
task_state=None, flavor=objects.Flavor(),
|
||||||
|
project_id='fake-project', user_id='fake-user')]),
|
||||||
|
objects.InstanceList(objects=[])])
|
||||||
|
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
|
||||||
|
'get_allocs_for_consumer',
|
||||||
|
new=mock.Mock(
|
||||||
|
side_effect=exception.ConsumerAllocationRetrievalFailed(
|
||||||
|
consumer_uuid='CONSUMER', error='ERROR')))
|
||||||
|
@mock.patch('nova.objects.ComputeNode.get_by_host_and_nodename',
|
||||||
|
new=mock.Mock(
|
||||||
|
return_value=objects.ComputeNode(uuid=uuidsentinel.node)))
|
||||||
|
@mock.patch('nova.scheduler.utils.resources_from_flavor',
|
||||||
|
new=mock.Mock(return_value=mock.sentinel.resources))
|
||||||
|
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
|
||||||
|
'put_allocations', return_value=True)
|
||||||
|
def test_heal_allocations_get_allocs_retrieval_fails(self, mock_put,
|
||||||
|
mock_getinst):
|
||||||
|
# This "succeeds"
|
||||||
|
self.assertEqual(0, self.cli.heal_allocations())
|
||||||
|
# We're really just verifying that we got to the end
|
||||||
|
mock_put.assert_called_once()
|
||||||
|
self.assertEqual(2, mock_getinst.call_count)
|
||||||
|
|
||||||
@mock.patch('nova.objects.CellMappingList.get_all',
|
@mock.patch('nova.objects.CellMappingList.get_all',
|
||||||
return_value=objects.CellMappingList(objects=[
|
return_value=objects.CellMappingList(objects=[
|
||||||
objects.CellMapping(name='cell1',
|
objects.CellMapping(name='cell1',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user