Merge "Get rid of 406 paths in report client"

This commit is contained in:
Zuul 2018-04-13 06:19:01 +00:00 committed by Gerrit Code Review
commit 6846d995b7
2 changed files with 8 additions and 114 deletions

View File

@ -492,38 +492,16 @@ class SchedulerReportClient(object):
return []
aggs = ','.join(agg_uuids)
url = "/resource_providers?member_of=in:" + aggs
# First try microversion 1.18 with the `required` queryparam.
resp = self.get(
url + '&required=' + os_traits.MISC_SHARES_VIA_AGGREGATE,
version='1.18', global_request_id=context.global_id)
url = "/resource_providers?member_of=in:%s&required=%s" % (
aggs, os_traits.MISC_SHARES_VIA_AGGREGATE)
resp = self.get(url, version='1.18',
global_request_id=context.global_id)
if resp.status_code == 200:
return resp.json()['resource_providers']
if resp.status_code == 406:
# TODO(efried): Remove this branch when placement minimum is 1.18
# Fall back to less efficient algorithm - we have to get traits
# for every provider in the aggregate to filter out non-sharing.
resp = self.get(
url, version='1.3', global_request_id=context.global_id)
if resp.status_code == 200:
rps = []
for rp in resp.json()['resource_providers']:
traits = self._get_provider_traits(context, rp['uuid'])
if os_traits.MISC_SHARES_VIA_AGGREGATE in traits:
rps.append(rp)
return rps
# In this error case, the word 'sharing' isn't appropriate.
msg = _("[%(placement_req_id)s] Failed to retrieve resource "
"providers associated with the following aggregates from "
"placement API: %(aggs)s. Got %(status_code)d: "
"%(err_text)s.")
else:
msg = _("[%(placement_req_id)s] Failed to retrieve sharing "
"resource providers associated with the following "
"aggregates from placement API: %(aggs)s. Got "
"%(status_code)d: %(err_text)s.")
msg = _("[%(placement_req_id)s] Failed to retrieve sharing resource "
"providers associated with the following aggregates from "
"placement API: %(aggs)s. Got %(status_code)d: %(err_text)s.")
args = {
'aggs': aggs,
'status_code': resp.status_code,
@ -593,15 +571,6 @@ class SchedulerReportClient(object):
version=POST_RPS_RETURNS_PAYLOAD_API_VERSION,
global_request_id=context.global_id)
# TODO(efried): Remove this block when minimum placement
# version always returns new provider payload.
if resp.status_code == 406:
# Bug #1746075 cont'd: Otherwise, use the "silent" version and
# retrieve the newly-created provider via GET.
resp = self.post(
url, payload, version=NESTED_PROVIDER_API_VERSION,
global_request_id=context.global_id)
placement_req_id = get_placement_request_id(resp)
if resp:
@ -614,12 +583,7 @@ class SchedulerReportClient(object):
'placement_req_id': placement_req_id,
}
LOG.info(msg, args)
if resp.status_code == 200:
return resp.json()
else:
# TODO(efried): Remove this branch when minimum placement
# version always returns new provider payload.
return self._get_resource_provider(context, uuid)
return resp.json()
# TODO(efried): Push error codes from placement, and use 'em.
name_conflict = 'Conflicting resource provider name:'

View File

@ -1608,52 +1608,6 @@ class TestProviderOperations(SchedulerReportClientTestCase):
headers={'X-Openstack-Request-Id': self.context.global_id})
self.assertEqual(rpjson, result)
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
'_get_provider_traits')
def test_get_sharing_providers_old(self, mock_get_traits):
# Run _get_sharing_providers() through the pre-1.18 code path
resp_mock = mock.Mock(status_code=200)
rpjson = [
{
'uuid': uuids.compute_node,
'name': 'compute_host',
'generation': 42,
'parent_provider_uuid': None,
'root_provider_uuid': None,
'links': [],
},
{
'uuid': uuids.sharing,
'name': 'storage_provider',
'generation': 42,
'parent_provider_uuid': None,
'root_provider_uuid': None,
'links': [],
},
]
resp_mock.json.return_value = {'resource_providers': rpjson}
# Simulate 1.18 not supported
self.ks_adap_mock.get.side_effect = (
mock.Mock(status_code=406), resp_mock)
mock_get_traits.side_effect = [
set(['MISC_SHARES_VIA_AGGREGATE', 'CUSTOM_FOO']),
set(['CUSTOM_BAR']),
]
result = self.client._get_sharing_providers(
self.context, [uuids.agg1, uuids.agg2])
expected_url2 = ('/resource_providers?member_of=in:' +
','.join((uuids.agg1, uuids.agg2)))
expected_url1 = (expected_url2 + '&required=MISC_SHARES_VIA_AGGREGATE')
call_kwargs = dict(
raise_exc=False,
headers={'X-Openstack-Request-Id': self.context.global_id})
self.ks_adap_mock.get.assert_has_calls((
mock.call(expected_url1, microversion='1.18', **call_kwargs),
mock.call(expected_url2, microversion='1.3', **call_kwargs)))
self.assertEqual(rpjson[:1], result)
def test_get_sharing_providers_emptylist(self):
self.assertEqual(
[], self.client._get_sharing_providers(self.context, []))
@ -1739,30 +1693,6 @@ class TestProviderOperations(SchedulerReportClientTestCase):
self.assertEqual('req-' + uuids.request_id,
logging_mock.call_args[0][1]['placement_req_id'])
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
'_get_resource_provider')
def test_create_resource_provider_legacy(self, mock_get):
"""Test that _create_resource_provider() sends a dict of resource
provider information without a parent provider UUID.
"""
uuid = uuids.compute_node
name = 'computehost'
resp406_mock = mock.Mock(status_code=406)
resp201_mock = mock.Mock(status_code=201)
self.ks_adap_mock.post.side_effect = (resp406_mock, resp201_mock)
self.assertEqual(
mock_get.return_value,
self.client._create_resource_provider(self.context, uuid, name))
self.ks_adap_mock.post.assert_has_calls([
mock.call(
'/resource_providers', microversion=mver,
json={'uuid': uuid, 'name': name}, raise_exc=False,
headers={'X-Openstack-Request-Id': self.context.global_id})
for mver in ('1.20', '1.14')])
mock_get.assert_called_once_with(self.context, uuid)
def test_create_resource_provider(self):
"""Test that _create_resource_provider() sends a dict of resource
provider information without a parent provider UUID.