Skip to content

Commit f298973

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Make get_provider_by_name public and remove safe_connect"
2 parents bd7e374 + 674b70d commit f298973

File tree

2 files changed

+39
-46
lines changed

2 files changed

+39
-46
lines changed

nova/scheduler/client/report.py

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from oslo_utils import excutils
2929
from oslo_utils import versionutils
3030
import retrying
31+
import six
3132

3233
from nova.compute import provider_tree
3334
import nova.conf
@@ -2182,8 +2183,7 @@ def delete_resource_provider(self, context, compute_node, cascade=False):
21822183
# for backward compatibility.
21832184
pass
21842185

2185-
@safe_connect
2186-
def _get_provider_by_name(self, context, name):
2186+
def get_provider_by_name(self, context, name):
21872187
"""Queries the placement API for resource provider information matching
21882188
a supplied name.
21892189
@@ -2193,9 +2193,17 @@ def _get_provider_by_name(self, context, name):
21932193
provider's UUID and generation
21942194
:raises: `exception.ResourceProviderNotFound` when no such provider was
21952195
found
2196+
:raises: PlacementAPIConnectFailure if there was an issue making the
2197+
API call to placement.
21962198
"""
2197-
resp = self.get("/resource_providers?name=%s" % name,
2198-
global_request_id=context.global_id)
2199+
try:
2200+
resp = self.get("/resource_providers?name=%s" % name,
2201+
global_request_id=context.global_id)
2202+
except ks_exc.ClientException as ex:
2203+
LOG.error('Failed to get resource provider by name: %s. Error: %s',
2204+
name, six.text_type(ex))
2205+
raise exception.PlacementAPIConnectFailure()
2206+
21992207
if resp.status_code == 200:
22002208
data = resp.json()
22012209
records = data['resource_providers']
@@ -2244,18 +2252,13 @@ def aggregate_add_host(self, context, agg_uuid, host_name=None,
22442252
failure attempting to save the provider aggregates
22452253
:raises: `exception.ResourceProviderUpdateConflict` if a concurrent
22462254
update to the provider was detected.
2255+
:raises: PlacementAPIConnectFailure if there was an issue making an
2256+
API call to placement.
22472257
"""
22482258
if host_name is None and rp_uuid is None:
22492259
raise ValueError(_("Either host_name or rp_uuid is required"))
22502260
if rp_uuid is None:
2251-
rp = self._get_provider_by_name(context, host_name)
2252-
# NOTE(jaypipes): Unfortunately, due to @safe_connect,
2253-
# _get_provider_by_name() can return None. If that happens, raise
2254-
# an error so we can trap for it in the Nova API code and ignore in
2255-
# Rocky, blow up in Stein.
2256-
if rp is None:
2257-
raise exception.PlacementAPIConnectFailure()
2258-
rp_uuid = rp['uuid']
2261+
rp_uuid = self.get_provider_by_name(context, host_name)['uuid']
22592262

22602263
# Now attempt to add the aggregate to the resource provider. We don't
22612264
# want to overwrite any other aggregates the provider may be associated
@@ -2297,16 +2300,10 @@ def aggregate_remove_host(self, context, agg_uuid, host_name):
22972300
failure attempting to save the provider aggregates
22982301
:raises: `exception.ResourceProviderUpdateConflict` if a concurrent
22992302
update to the provider was detected.
2303+
:raises: PlacementAPIConnectFailure if there was an issue making an
2304+
API call to placement.
23002305
"""
2301-
rp = self._get_provider_by_name(context, host_name)
2302-
# NOTE(jaypipes): Unfortunately, due to @safe_connect,
2303-
# _get_provider_by_name() can return None. If that happens, raise an
2304-
# error so we can trap for it in the Nova API code and ignore in Rocky,
2305-
# blow up in Stein.
2306-
if rp is None:
2307-
raise exception.PlacementAPIConnectFailure()
2308-
rp_uuid = rp['uuid']
2309-
2306+
rp_uuid = self.get_provider_by_name(context, host_name)['uuid']
23102307
# Now attempt to remove the aggregate from the resource provider. We
23112308
# don't want to overwrite any other aggregates the provider may be
23122309
# associated with, however, so we first grab the list of aggregates for

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

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3792,7 +3792,7 @@ def test_get_provider_by_name_success(self):
37923792
}
37933793
self.mock_get.return_value = get_resp
37943794
name = 'cn1'
3795-
res = self.client._get_provider_by_name(self.context, name)
3795+
res = self.client.get_provider_by_name(self.context, name)
37963796

37973797
exp_url = "/resource_providers?name=%s" % name
37983798
self.mock_get.assert_called_once_with(
@@ -3817,7 +3817,7 @@ def test_get_provider_by_name_multiple_results(self, mock_log):
38173817
name = 'cn1'
38183818
self.assertRaises(
38193819
exception.ResourceProviderNotFound,
3820-
self.client._get_provider_by_name, self.context, name)
3820+
self.client.get_provider_by_name, self.context, name)
38213821
mock_log.assert_called_once()
38223822

38233823
@mock.patch.object(report.LOG, 'warning')
@@ -3828,7 +3828,7 @@ def test_get_provider_by_name_500(self, mock_log):
38283828
name = 'cn1'
38293829
self.assertRaises(
38303830
exception.ResourceProviderNotFound,
3831-
self.client._get_provider_by_name, self.context, name)
3831+
self.client.get_provider_by_name, self.context, name)
38323832
mock_log.assert_called_once()
38333833

38343834
@mock.patch.object(report.LOG, 'warning')
@@ -3839,15 +3839,15 @@ def test_get_provider_by_name_404(self, mock_log):
38393839
name = 'cn1'
38403840
self.assertRaises(
38413841
exception.ResourceProviderNotFound,
3842-
self.client._get_provider_by_name, self.context, name)
3842+
self.client.get_provider_by_name, self.context, name)
38433843
mock_log.assert_not_called()
38443844

38453845
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
38463846
'set_aggregates_for_provider')
38473847
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
38483848
'_get_provider_aggregates')
38493849
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
3850-
'_get_provider_by_name')
3850+
'get_provider_by_name')
38513851
def test_aggregate_add_host_success_no_existing(
38523852
self, mock_get_by_name, mock_get_aggs, mock_set_aggs):
38533853
mock_get_by_name.return_value = {
@@ -3868,7 +3868,7 @@ def test_aggregate_add_host_success_no_existing(
38683868
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
38693869
'_get_provider_aggregates')
38703870
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
3871-
'_get_provider_by_name', new=mock.NonCallableMock())
3871+
'get_provider_by_name', new=mock.NonCallableMock())
38723872
def test_aggregate_add_host_rp_uuid(self, mock_get_aggs, mock_set_aggs):
38733873
mock_get_aggs.return_value = report.AggInfo(
38743874
aggregates=set([]), generation=42)
@@ -3883,7 +3883,7 @@ def test_aggregate_add_host_rp_uuid(self, mock_get_aggs, mock_set_aggs):
38833883
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
38843884
'_get_provider_aggregates')
38853885
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
3886-
'_get_provider_by_name')
3886+
'get_provider_by_name')
38873887
def test_aggregate_add_host_success_already_existing(
38883888
self, mock_get_by_name, mock_get_aggs, mock_set_aggs):
38893889
mock_get_by_name.return_value = {
@@ -3908,14 +3908,12 @@ def test_aggregate_add_host_success_already_existing(
39083908
use_cache=False, generation=43)
39093909

39103910
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
3911-
'_get_provider_by_name')
3911+
'get_provider_by_name',
3912+
side_effect=exception.PlacementAPIConnectFailure)
39123913
def test_aggregate_add_host_no_placement(self, mock_get_by_name):
3913-
"""In Rocky, we allow nova-api to not be able to communicate with
3914-
placement, so the @safe_connect decorator will return None. Check that
3915-
an appropriate exception is raised back to the nova-api code in this
3916-
case.
3914+
"""Tests that PlacementAPIConnectFailure will be raised up from
3915+
aggregate_add_host if get_provider_by_name raises that error.
39173916
"""
3918-
mock_get_by_name.return_value = None # emulate @safe_connect...
39193917
name = 'cn1'
39203918
agg_uuid = uuids.agg1
39213919
self.assertRaises(
@@ -3929,7 +3927,7 @@ def test_aggregate_add_host_no_placement(self, mock_get_by_name):
39293927
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
39303928
'_get_provider_aggregates')
39313929
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
3932-
'_get_provider_by_name')
3930+
'get_provider_by_name')
39333931
def test_aggregate_add_host_retry_success(
39343932
self, mock_get_by_name, mock_get_aggs, mock_set_aggs):
39353933
mock_get_by_name.return_value = {
@@ -3957,7 +3955,7 @@ def test_aggregate_add_host_retry_success(
39573955
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
39583956
'_get_provider_aggregates')
39593957
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
3960-
'_get_provider_by_name')
3958+
'get_provider_by_name')
39613959
def test_aggregate_add_host_retry_raises(
39623960
self, mock_get_by_name, mock_get_aggs, mock_set_aggs):
39633961
mock_get_by_name.return_value = {
@@ -3984,14 +3982,12 @@ def test_aggregate_add_host_no_host_name_or_rp_uuid(self):
39843982
self.client.aggregate_add_host, self.context, uuids.agg1)
39853983

39863984
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
3987-
'_get_provider_by_name')
3985+
'get_provider_by_name',
3986+
side_effect=exception.PlacementAPIConnectFailure)
39883987
def test_aggregate_remove_host_no_placement(self, mock_get_by_name):
3989-
"""In Rocky, we allow nova-api to not be able to communicate with
3990-
placement, so the @safe_connect decorator will return None. Check that
3991-
an appropriate exception is raised back to the nova-api code in this
3992-
case.
3988+
"""Tests that PlacementAPIConnectFailure will be raised up from
3989+
aggregate_remove_host if get_provider_by_name raises that error.
39933990
"""
3994-
mock_get_by_name.return_value = None # emulate @safe_connect...
39953991
name = 'cn1'
39963992
agg_uuid = uuids.agg1
39973993
self.assertRaises(
@@ -4004,7 +4000,7 @@ def test_aggregate_remove_host_no_placement(self, mock_get_by_name):
40044000
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
40054001
'_get_provider_aggregates')
40064002
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
4007-
'_get_provider_by_name')
4003+
'get_provider_by_name')
40084004
def test_aggregate_remove_host_success_already_existing(
40094005
self, mock_get_by_name, mock_get_aggs, mock_set_aggs):
40104006
mock_get_by_name.return_value = {
@@ -4024,7 +4020,7 @@ def test_aggregate_remove_host_success_already_existing(
40244020
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
40254021
'_get_provider_aggregates')
40264022
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
4027-
'_get_provider_by_name')
4023+
'get_provider_by_name')
40284024
def test_aggregate_remove_host_success_no_existing(
40294025
self, mock_get_by_name, mock_get_aggs, mock_set_aggs):
40304026
mock_get_by_name.return_value = {
@@ -4053,7 +4049,7 @@ def test_aggregate_remove_host_success_no_existing(
40534049
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
40544050
'_get_provider_aggregates')
40554051
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
4056-
'_get_provider_by_name')
4052+
'get_provider_by_name')
40574053
def test_aggregate_remove_host_retry_success(
40584054
self, mock_get_by_name, mock_get_aggs, mock_set_aggs):
40594055
mock_get_by_name.return_value = {
@@ -4081,7 +4077,7 @@ def test_aggregate_remove_host_retry_success(
40814077
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
40824078
'_get_provider_aggregates')
40834079
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
4084-
'_get_provider_by_name')
4080+
'get_provider_by_name')
40854081
def test_aggregate_remove_host_retry_raises(
40864082
self, mock_get_by_name, mock_get_aggs, mock_set_aggs):
40874083
mock_get_by_name.return_value = {

0 commit comments

Comments
 (0)