Merge "Stop using ResourceProvider in scheduler and RT"
This commit is contained in:
commit
ae71b5d181
nova
@ -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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user