Skip to content

Commit 0652a4c

Browse files
author
Eric Fried
committed
Un-safe_connect and publicize get_providers_in_tree
In the continuing saga to wipe @safe_connect from the annals of history, and in preparation, for its use outside of SchedulerReportClient, this commit does two things to _get_providers_in_tree: - Removes @safe_connect from it. Callers now need to be aware that they can get ClientExceptionZ from ksa. (The two existing callers were vetted and needed no additional handling - it's way more appropriate for them to raise ClientException than a mysterious NoneType error somewhere down the line as they would have been doing previously.) - Renames it to get_providers_in_tree. Change-Id: I2b284d69d345d15287f04a7ca4cd422155768525
1 parent be1e0b9 commit 0652a4c

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

nova/scheduler/client/report.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,7 @@ def _get_sharing_providers(self, context, agg_uuids):
491491
LOG.error(msg, args)
492492
raise exception.ResourceProviderRetrievalFailed(message=msg % args)
493493

494-
@safe_connect
495-
def _get_providers_in_tree(self, context, uuid):
494+
def get_providers_in_tree(self, context, uuid):
496495
"""Queries the placement API for a list of the resource providers in
497496
the tree associated with the specified UUID.
498497
@@ -501,6 +500,8 @@ def _get_providers_in_tree(self, context, uuid):
501500
:return: A list of dicts of resource provider information, which may be
502501
empty if no provider exists with the specified UUID.
503502
:raise: ResourceProviderRetrievalFailed on error.
503+
:raise: keystoneauth1.exceptions.ClientException if placement API
504+
communication fails.
504505
"""
505506
resp = self.get("/resource_providers?in_tree=%s" % uuid,
506507
version=NESTED_PROVIDER_API_VERSION,
@@ -628,6 +629,10 @@ def _ensure_resource_provider(self, context, uuid, name=None,
628629
value
629630
:param parent_provider_uuid: Optional UUID of the immediate parent,
630631
which must have been previously _ensured.
632+
:raise ResourceProviderCreationFailed: If we expected to be creating
633+
providers, but couldn't.
634+
:raise: keystoneauth1.exceptions.ClientException if placement API
635+
communication fails.
631636
"""
632637
# NOTE(efried): We currently have no code path where we need to set the
633638
# parent_provider_uuid on a previously-parent-less provider - so we do
@@ -654,7 +659,7 @@ def _ensure_resource_provider(self, context, uuid, name=None,
654659
else:
655660
# We either don't have it locally or it's stale. Pull or create it.
656661
created_rp = None
657-
rps_to_refresh = self._get_providers_in_tree(context, uuid)
662+
rps_to_refresh = self.get_providers_in_tree(context, uuid)
658663
if not rps_to_refresh:
659664
created_rp = self._create_resource_provider(
660665
context, uuid, name or uuid,
@@ -1801,7 +1806,7 @@ def remove_provider_tree_from_instance_allocation(self, context,
18011806
# do anything with the return value except log
18021807
return False
18031808

1804-
rps = self._get_providers_in_tree(context, root_rp_uuid)
1809+
rps = self.get_providers_in_tree(context, root_rp_uuid)
18051810
rp_uuids = [rp['uuid'] for rp in rps]
18061811

18071812
# go through the current allocations and remove every RP from it that

nova/tests/functional/test_report_client.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,8 @@ def test_client_report_smoke(self):
188188
rp = self.client._get_resource_provider(self.context,
189189
self.compute_uuid)
190190
self.assertIsNone(rp)
191-
rps = self.client._get_providers_in_tree(self.context,
192-
self.compute_uuid)
191+
rps = self.client.get_providers_in_tree(self.context,
192+
self.compute_uuid)
193193
self.assertEqual([], rps)
194194
# But get_provider_tree_and_ensure_root creates one (via
195195
# _ensure_resource_provider)
@@ -209,8 +209,8 @@ def test_client_report_smoke(self):
209209
rp = self.client._get_resource_provider(self.context,
210210
self.compute_uuid)
211211
self.assertIsNotNone(rp)
212-
rps = self.client._get_providers_in_tree(self.context,
213-
self.compute_uuid)
212+
rps = self.client.get_providers_in_tree(self.context,
213+
self.compute_uuid)
214214
self.assertEqual(1, len(rps))
215215

216216
# We should also have empty sets of aggregate and trait

nova/tests/unit/scheduler/client/test_report.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,7 +1758,7 @@ class TestProviderOperations(SchedulerReportClientTestCase):
17581758
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
17591759
'_get_sharing_providers')
17601760
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
1761-
'_get_providers_in_tree')
1761+
'get_providers_in_tree')
17621762
def test_ensure_resource_provider_get(self, get_rpt_mock, get_shr_mock,
17631763
get_trait_mock, get_agg_mock, get_inv_mock, create_rp_mock):
17641764
# No resource provider exists in the client's cache, so validate that
@@ -1825,7 +1825,7 @@ def assert_cache_contents():
18251825
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
18261826
'_refresh_associations')
18271827
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
1828-
'_get_providers_in_tree')
1828+
'get_providers_in_tree')
18291829
def test_ensure_resource_provider_create_fail(self, get_rpt_mock,
18301830
refresh_mock, create_rp_mock):
18311831
# No resource provider exists in the client's cache, and
@@ -1858,7 +1858,7 @@ def test_ensure_resource_provider_create_fail(self, get_rpt_mock,
18581858
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
18591859
'_refresh_associations')
18601860
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
1861-
'_get_providers_in_tree')
1861+
'get_providers_in_tree')
18621862
def test_ensure_resource_provider_create_no_placement(self, get_rpt_mock,
18631863
refresh_mock, create_rp_mock):
18641864
# No resource provider exists in the client's cache, and
@@ -1892,7 +1892,7 @@ def test_ensure_resource_provider_create_no_placement(self, get_rpt_mock,
18921892
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
18931893
'_refresh_associations')
18941894
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
1895-
'_get_providers_in_tree')
1895+
'get_providers_in_tree')
18961896
def test_ensure_resource_provider_create(self, get_rpt_mock,
18971897
refresh_inv_mock,
18981898
refresh_assoc_mock,
@@ -1939,7 +1939,7 @@ def test_ensure_resource_provider_create(self, get_rpt_mock,
19391939
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
19401940
'_create_resource_provider')
19411941
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
1942-
'_get_providers_in_tree')
1942+
'get_providers_in_tree')
19431943
def test_ensure_resource_provider_tree(self, get_rpt_mock, create_rp_mock,
19441944
refresh_mock):
19451945
"""Test _ensure_resource_provider with a tree of providers."""
@@ -2011,7 +2011,7 @@ def mocked_refresh(context, rp_uuid, **kwargs):
20112011
refresh_mock.assert_not_called()
20122012

20132013
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
2014-
'_get_providers_in_tree')
2014+
'get_providers_in_tree')
20152015
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
20162016
'_refresh_associations')
20172017
def test_ensure_resource_provider_refresh_fetch(self, mock_ref_assoc,
@@ -2033,7 +2033,7 @@ def test_ensure_resource_provider_refresh_fetch(self, mock_ref_assoc,
20332033
set(self.client._provider_tree.get_provider_uuids()))
20342034

20352035
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
2036-
'_get_providers_in_tree')
2036+
'get_providers_in_tree')
20372037
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
20382038
'_create_resource_provider')
20392039
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
@@ -2319,7 +2319,7 @@ def test_get_sharing_providers_error(self, logging_mock):
23192319
logging_mock.call_args[0][1]['placement_req_id'])
23202320

23212321
def test_get_providers_in_tree(self):
2322-
# Ensure _get_providers_in_tree() returns a list of resource
2322+
# Ensure get_providers_in_tree() returns a list of resource
23232323
# provider dicts if it finds a resource provider record from the
23242324
# placement API
23252325
root = uuids.compute_node
@@ -2341,7 +2341,7 @@ def test_get_providers_in_tree(self):
23412341
resp_mock.json.return_value = {'resource_providers': rpjson}
23422342
self.ks_adap_mock.get.return_value = resp_mock
23432343

2344-
result = self.client._get_providers_in_tree(self.context, root)
2344+
result = self.client.get_providers_in_tree(self.context, root)
23452345

23462346
expected_url = '/resource_providers?in_tree=' + root
23472347
self.ks_adap_mock.get.assert_called_once_with(
@@ -2351,7 +2351,7 @@ def test_get_providers_in_tree(self):
23512351

23522352
@mock.patch.object(report.LOG, 'error')
23532353
def test_get_providers_in_tree_error(self, logging_mock):
2354-
# Ensure _get_providers_in_tree() logs an error and raises if the
2354+
# Ensure get_providers_in_tree() logs an error and raises if the
23552355
# placement API call doesn't respond 200
23562356
resp_mock = mock.Mock(status_code=503)
23572357
self.ks_adap_mock.get.return_value = resp_mock
@@ -2360,7 +2360,7 @@ def test_get_providers_in_tree_error(self, logging_mock):
23602360

23612361
uuid = uuids.compute_node
23622362
self.assertRaises(exception.ResourceProviderRetrievalFailed,
2363-
self.client._get_providers_in_tree, self.context,
2363+
self.client.get_providers_in_tree, self.context,
23642364
uuid)
23652365

23662366
expected_url = '/resource_providers?in_tree=' + uuid
@@ -2373,6 +2373,12 @@ def test_get_providers_in_tree_error(self, logging_mock):
23732373
self.assertEqual('req-' + uuids.request_id,
23742374
logging_mock.call_args[0][1]['placement_req_id'])
23752375

2376+
def test_get_providers_in_tree_ksa_exc(self):
2377+
self.ks_adap_mock.get.side_effect = ks_exc.EndpointNotFound()
2378+
self.assertRaises(
2379+
ks_exc.ClientException,
2380+
self.client.get_providers_in_tree, self.context, uuids.whatever)
2381+
23762382
def test_create_resource_provider(self):
23772383
"""Test that _create_resource_provider() sends a dict of resource
23782384
provider information without a parent provider UUID.

0 commit comments

Comments
 (0)