Merge "Stop using ResourceProvider in scheduler and RT"

This commit is contained in:
Jenkins 2017-04-07 16:24:20 +00:00 committed by Gerrit Code Review
commit ae71b5d181
4 changed files with 55 additions and 68 deletions
nova
scheduler
tests/unit/scheduler

@ -265,12 +265,7 @@ class SchedulerReportClient(object):
version='1.4')
if resp.status_code == 200:
data = resp.json()
raw_rps = data.get('resource_providers', [])
rps = [objects.ResourceProvider(uuid=rp['uuid'],
name=rp['name'],
generation=rp['generation'],
) for rp in raw_rps]
return objects.ResourceProviderList(objects=rps)
return data.get('resource_providers', [])
else:
msg = _LE("Failed to retrieve filtered list of resource providers "
"from placement API for filters %(filters)s. "
@ -324,7 +319,7 @@ class SchedulerReportClient(object):
"""Queries the placement API for a resource provider record with the
supplied UUID.
Returns an `objects.ResourceProvider` object if found or None if no
Returns a dict of resource provider information if found or None if no
such resource provider could be found.
:param uuid: UUID identifier for the resource provider to look up
@ -332,11 +327,7 @@ class SchedulerReportClient(object):
resp = self.get("/resource_providers/%s" % uuid)
if resp.status_code == 200:
data = resp.json()
return objects.ResourceProvider(
uuid=uuid,
name=data['name'],
generation=data['generation'],
)
return data
elif resp.status_code == 404:
return None
else:
@ -356,8 +347,8 @@ class SchedulerReportClient(object):
def _create_resource_provider(self, uuid, name):
"""Calls the placement API to create a new resource provider record.
Returns an `objects.ResourceProvider` object representing the
newly-created resource provider object.
Returns a dict of resource provider information object representing
the newly-created resource provider.
:param uuid: UUID of the new resource provider
:param name: Name of the resource provider
@ -379,7 +370,7 @@ class SchedulerReportClient(object):
'placement_req_id': placement_req_id,
}
LOG.info(msg, args)
return objects.ResourceProvider(
return dict(
uuid=uuid,
name=name,
generation=0,
@ -473,12 +464,12 @@ class SchedulerReportClient(object):
server_gen = curr.get('resource_provider_generation')
if server_gen:
my_rp = self._resource_providers[rp_uuid]
if server_gen != my_rp.generation:
if server_gen != my_rp['generation']:
LOG.debug('Updating our resource provider generation '
'from %(old)i to %(new)i',
{'old': my_rp.generation,
{'old': my_rp['generation'],
'new': server_gen})
my_rp.generation = server_gen
my_rp['generation'] = server_gen
return curr
def _update_inventory_attempt(self, rp_uuid, inv_data):
@ -495,7 +486,7 @@ class SchedulerReportClient(object):
if inv_data == curr.get('inventories', {}):
return True
cur_rp_gen = self._resource_providers[rp_uuid].generation
cur_rp_gen = self._resource_providers[rp_uuid]['generation']
payload = {
'resource_provider_generation': cur_rp_gen,
'inventories': inv_data,
@ -586,7 +577,7 @@ class SchedulerReportClient(object):
updated_inventories_result = result.json()
new_gen = updated_inventories_result['resource_provider_generation']
self._resource_providers[rp_uuid].generation = new_gen
self._resource_providers[rp_uuid]['generation'] = new_gen
LOG.debug('Updated inventory for %s at generation %i',
rp_uuid, new_gen)
return True
@ -626,7 +617,7 @@ class SchedulerReportClient(object):
LOG.info(msg, rp_uuid)
url = '/resource_providers/%s/inventories' % rp_uuid
cur_rp_gen = self._resource_providers[rp_uuid].generation
cur_rp_gen = self._resource_providers[rp_uuid]['generation']
payload = {
'resource_provider_generation': cur_rp_gen,
'inventories': {},
@ -638,7 +629,7 @@ class SchedulerReportClient(object):
updated_inv = r.json()
new_gen = updated_inv['resource_provider_generation']
self._resource_providers[rp_uuid].generation = new_gen
self._resource_providers[rp_uuid]['generation'] = new_gen
msg_args = {
'rp_uuid': rp_uuid,
'generation': new_gen,

@ -169,12 +169,12 @@ class FilterScheduler(driver.Scheduler):
reportclient = self.scheduler_client.reportclient
rps = reportclient.get_filtered_resource_providers(filters)
# NOTE(sbauza): In case the Placement service is not running yet or
# when returning an exception, we wouldn't get any ResourceProviders.
# when returning an exception, we wouldn't get any resource providers.
# If so, let's return an empty list so _schedule would raise a
# NoValidHosts.
if not rps:
return []
compute_uuids = [rp.uuid for rp in rps]
compute_uuids = [rp['uuid'] for rp in rps]
return self.host_manager.get_host_states_by_uuids(context,
compute_uuids,
spec_obj)

@ -19,7 +19,6 @@ import nova.conf
from nova import context
from nova import exception
from nova import objects
from nova.objects import base as obj_base
from nova.scheduler.client import report
from nova import test
from nova.tests import uuidsentinel as uuids
@ -313,7 +312,7 @@ class TestProviderOperations(SchedulerReportClientTestCase):
result = self.client.get_filtered_resource_providers(filters)
expected_provider = objects.ResourceProvider(
expected_provider_dict = dict(
uuid=uuid,
name=uuid,
generation=42,
@ -323,8 +322,7 @@ class TestProviderOperations(SchedulerReportClientTestCase):
self.ks_sess_mock.get.assert_called_once_with(
expected_url, endpoint_filter=mock.ANY, raise_exc=False,
headers={'OpenStack-API-Version': 'placement 1.4'})
self.assertTrue(obj_base.obj_equal_prims(expected_provider,
result[0]))
self.assertEqual(expected_provider_dict, result[0])
def test_get_filtered_resource_providers_not_found(self):
# Ensure _get_resource_provider() just returns None when the placement
@ -341,8 +339,8 @@ class TestProviderOperations(SchedulerReportClientTestCase):
self.assertIsNone(result)
def test_get_resource_provider_found(self):
# Ensure _get_resource_provider() returns a ResourceProvider object if
# it finds a resource provider record from the placement API
# Ensure _get_resource_provider() returns a dict of resource provider
# if it finds a resource provider record from the placement API
uuid = uuids.compute_node
resp_mock = mock.Mock(status_code=200)
json_data = {
@ -355,7 +353,7 @@ class TestProviderOperations(SchedulerReportClientTestCase):
result = self.client._get_resource_provider(uuid)
expected_provider = objects.ResourceProvider(
expected_provider_dict = dict(
uuid=uuid,
name=uuid,
generation=42,
@ -364,8 +362,7 @@ class TestProviderOperations(SchedulerReportClientTestCase):
self.ks_sess_mock.get.assert_called_once_with(expected_url,
endpoint_filter=mock.ANY,
raise_exc=False)
self.assertTrue(obj_base.obj_equal_prims(expected_provider,
result))
self.assertEqual(expected_provider_dict, result)
def test_get_resource_provider_not_found(self):
# Ensure _get_resource_provider() just returns None when the placement
@ -408,8 +405,8 @@ class TestProviderOperations(SchedulerReportClientTestCase):
self.assertIsNone(result)
def test_create_resource_provider(self):
# Ensure _create_resource_provider() returns a ResourceProvider object
# constructed after creating a resource provider record in the
# Ensure _create_resource_provider() returns a dict of resource
# provider constructed after creating a resource provider record in the
# placement API
uuid = uuids.compute_node
name = 'computehost'
@ -422,7 +419,7 @@ class TestProviderOperations(SchedulerReportClientTestCase):
'uuid': uuid,
'name': name,
}
expected_provider = objects.ResourceProvider(
expected_provider_dict = dict(
uuid=uuid,
name=name,
generation=0,
@ -433,17 +430,16 @@ class TestProviderOperations(SchedulerReportClientTestCase):
endpoint_filter=mock.ANY,
json=expected_payload,
raise_exc=False)
self.assertTrue(obj_base.obj_equal_prims(expected_provider,
result))
self.assertEqual(expected_provider_dict, result)
@mock.patch.object(report.LOG, 'info')
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
'_get_resource_provider')
def test_create_resource_provider_concurrent_create(self, get_rp_mock,
logging_mock):
# Ensure _create_resource_provider() returns a ResourceProvider object
# gotten from _get_resource_provider() if the call to create the
# resource provider in the placement API returned a 409 Conflict,
# Ensure _create_resource_provider() returns a dict of resource
# provider gotten from _get_resource_provider() if the call to create
# the resource provider in the placement API returned a 409 Conflict,
# indicating another thread concurrently created the resource provider
# record.
uuid = uuids.compute_node
@ -713,8 +709,8 @@ class TestInventory(SchedulerReportClientTestCase):
def test_delete_inventory_already_no_inventory(self, mock_get, mock_put,
mock_extract):
cn = self.compute_node
rp = objects.ResourceProvider(uuid=cn.uuid, generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=cn.uuid, generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[cn.uuid] = rp
mock_get.return_value.json.return_value = {
@ -726,7 +722,7 @@ class TestInventory(SchedulerReportClientTestCase):
self.assertIsNone(result)
self.assertFalse(mock_put.called)
self.assertFalse(mock_extract.called)
new_gen = self.client._resource_providers[cn.uuid].generation
new_gen = self.client._resource_providers[cn.uuid]['generation']
self.assertEqual(1, new_gen)
@mock.patch.object(report.LOG, 'info')
@ -738,8 +734,8 @@ class TestInventory(SchedulerReportClientTestCase):
def test_delete_inventory(self, mock_get, mock_put, mock_extract,
mock_info):
cn = self.compute_node
rp = objects.ResourceProvider(uuid=cn.uuid, generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=cn.uuid, generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[cn.uuid] = rp
mock_get.return_value.json.return_value = {
@ -761,7 +757,7 @@ class TestInventory(SchedulerReportClientTestCase):
result = self.client._delete_inventory(cn.uuid)
self.assertIsNone(result)
self.assertFalse(mock_extract.called)
new_gen = self.client._resource_providers[cn.uuid].generation
new_gen = self.client._resource_providers[cn.uuid]['generation']
self.assertEqual(44, new_gen)
self.assertTrue(mock_info.called)
self.assertEqual(uuids.request_id,
@ -775,8 +771,8 @@ class TestInventory(SchedulerReportClientTestCase):
def test_delete_inventory_inventory_in_use(self, mock_get, mock_put,
mock_warn):
cn = self.compute_node
rp = objects.ResourceProvider(uuid=cn.uuid, generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=cn.uuid, generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[cn.uuid] = rp
mock_get.return_value.json.return_value = {
@ -823,8 +819,8 @@ There was a conflict when trying to complete your request.
def test_delete_inventory_inventory_error(self, mock_get, mock_put,
mock_warn, mock_error):
cn = self.compute_node
rp = objects.ResourceProvider(uuid=cn.uuid, generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=cn.uuid, generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[cn.uuid] = rp
mock_get.return_value.json.return_value = {
@ -862,8 +858,8 @@ There was a conflict when trying to complete your request.
# after creating or updating the existing values
uuid = uuids.compute_node
compute_node = self.compute_node
rp = objects.ResourceProvider(uuid=uuid, name='foo', generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=uuid, name='foo', generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[uuid] = rp
mock_get.return_value.json.return_value = {
@ -893,7 +889,7 @@ There was a conflict when trying to complete your request.
exp_url = '/resource_providers/%s/inventories' % uuid
mock_get.assert_called_once_with(exp_url)
# Updated with the new inventory from the PUT call
self.assertEqual(44, rp.generation)
self.assertEqual(44, rp['generation'])
expected = {
# Called with the newly-found generation from the existing
# inventory
@ -934,7 +930,7 @@ There was a conflict when trying to complete your request.
def test_update_inventory_no_update(self, mock_put, mock_get):
uuid = uuids.compute_node
compute_node = self.compute_node
rp = objects.ResourceProvider(uuid=uuid, name='foo', generation=42)
rp = dict(uuid=uuid, name='foo', generation=42)
self.client._resource_providers[uuid] = rp
mock_get.return_value.json.return_value = {
'resource_provider_generation': 43,
@ -975,7 +971,7 @@ There was a conflict when trying to complete your request.
# No update so put should not be called
self.assertFalse(mock_put.called)
# Make sure we updated the generation from the inventory records
self.assertEqual(43, rp.generation)
self.assertEqual(43, rp['generation'])
@mock.patch.object(report.LOG, 'info')
@mock.patch('nova.scheduler.client.report.SchedulerReportClient.'
@ -990,8 +986,8 @@ There was a conflict when trying to complete your request.
# after creating or updating the existing values
uuid = uuids.compute_node
compute_node = self.compute_node
rp = objects.ResourceProvider(uuid=uuid, name='foo', generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=uuid, name='foo', generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[uuid] = rp
mock_get.return_value = {}
@ -1023,8 +1019,8 @@ There was a conflict when trying to complete your request.
# after creating or updating the existing values
uuid = uuids.compute_node
compute_node = self.compute_node
rp = objects.ResourceProvider(uuid=uuid, name='foo', generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=uuid, name='foo', generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[uuid] = rp
mock_get.return_value = {}
@ -1056,8 +1052,8 @@ There was a conflict when trying to complete your request.
# after creating or updating the existing values
uuid = uuids.compute_node
compute_node = self.compute_node
rp = objects.ResourceProvider(uuid=uuid, name='foo', generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=uuid, name='foo', generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[uuid] = rp
mock_get.return_value = {}
@ -1089,8 +1085,8 @@ There was a conflict when trying to complete your request.
# after creating or updating the existing values
uuid = uuids.compute_node
compute_node = self.compute_node
rp = objects.ResourceProvider(uuid=uuid, name='foo', generation=42)
# Make sure the ResourceProvider exists for preventing to call the API
rp = dict(uuid=uuid, name='foo', generation=42)
# Make sure the resource provider exists for preventing to call the API
self.client._resource_providers[uuid] = rp
mock_get.return_value = {}

@ -123,19 +123,19 @@ COMPUTE_NODES = [
]
RESOURCE_PROVIDERS = [
objects.ResourceProvider(
dict(
uuid=uuidsentinel.rp1,
name='host1',
generation=1),
objects.ResourceProvider(
dict(
uuid=uuidsentinel.rp2,
name='host2',
generation=1),
objects.ResourceProvider(
dict(
uuid=uuidsentinel.rp3,
name='host3',
generation=1),
objects.ResourceProvider(
dict(
uuid=uuidsentinel.rp4,
name='host4',
generation=1),