summaryrefslogtreecommitdiff
path: root/nova/tests/unit/scheduler/client
diff options
context:
space:
mode:
authorMatt Riedemann <mriedem.os@gmail.com>2018-05-03 11:21:47 -0400
committerMatt Riedemann <mriedem.os@gmail.com>2018-05-03 11:21:47 -0400
commit80a001989351d3d427c204c8c06cfacc964f2a35 (patch)
treef6ac11aad25b08cf6e29d9510900da4e4800794a /nova/tests/unit/scheduler/client
parent93f4364a4e7539470edc8bde4e335a9b0d650c57 (diff)
downloadnova-80a001989351d3d427c204c8c06cfacc964f2a35.tar.gz
Handle @safe_connect returns None side effect in _ensure_resource_provider
Change I0c4ca6a81f213277fe7219cb905a805712f81e36 added more error handling to the _ensure_resource_provider flow but didn't account for @safe_connect returning None when calling _create_resource_provider in the case that nova-compute is started before placement is running. If that happens, we fail with a TypeError during the nova-compute startup because we put None in the resource provider cache and then later blindly try to use it because the compute node resource provider uuid is in the cache, but mapped to None. This adds the None check back in _ensure_resource_provider and if None is returned from _create_resource_provider we raise the same exception that _create_resource_provider would raise if it couldn't create the provider. Change-Id: If9e1581db9c1ae14340b787d03c815d243d5a50c Closes-Bug: #1767139
Diffstat (limited to 'nova/tests/unit/scheduler/client')
-rw-r--r--nova/tests/unit/scheduler/client/test_report.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/nova/tests/unit/scheduler/client/test_report.py b/nova/tests/unit/scheduler/client/test_report.py
index 8f0ec5b23a..0f8571922f 100644
--- a/nova/tests/unit/scheduler/client/test_report.py
+++ b/nova/tests/unit/scheduler/client/test_report.py
@@ -1257,6 +1257,38 @@ class TestProviderOperations(SchedulerReportClientTestCase):
self.client._provider_tree.has_traits, uuids.compute_node, [])
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
+ '_create_resource_provider', return_value=None)
+ @mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
+ '_refresh_associations')
+ @mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
+ '_get_providers_in_tree')
+ def test_ensure_resource_provider_create_no_placement(self, get_rpt_mock,
+ refresh_mock, create_rp_mock):
+ # No resource provider exists in the client's cache, and
+ # @safe_connect on _create_resource_provider returns None because
+ # Placement isn't running yet. Ensure we don't populate the resource
+ # provider cache.
+ get_rpt_mock.return_value = []
+
+ self.assertRaises(
+ exception.ResourceProviderCreationFailed,
+ self.client._ensure_resource_provider, self.context,
+ uuids.compute_node)
+
+ get_rpt_mock.assert_called_once_with(self.context, uuids.compute_node)
+ create_rp_mock.assert_called_once_with(
+ self.context, uuids.compute_node, uuids.compute_node,
+ parent_provider_uuid=None)
+ self.assertFalse(self.client._provider_tree.exists(uuids.compute_node))
+ refresh_mock.assert_not_called()
+ self.assertRaises(
+ ValueError,
+ self.client._provider_tree.in_aggregates, uuids.compute_node, [])
+ self.assertRaises(
+ ValueError,
+ self.client._provider_tree.has_traits, uuids.compute_node, [])
+
+ @mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
'_create_resource_provider')
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
'_refresh_and_get_inventory')