Include requested_resources to allocation candidate query

The RequestSpec.requested_resources now can hold RequestGroup objects
describing extra resources that are needed for this instance. So this
patch makes sure that such RequestGroups are included into the
allocation candidate query.

blueprint bandwidth-resource-provider

Change-Id: I7b2718f1a97417693e1176a204d0133f6f5ac098
This commit is contained in:
Balazs Gibizer 2018-12-18 15:18:26 +01:00
parent 1d44fbddef
commit a5d6833d77
2 changed files with 80 additions and 0 deletions

View File

@ -71,6 +71,20 @@ class ResourceRequest(object):
self._rg_by_id[ident] = rq_grp
return self._rg_by_id[ident]
def add_request_group(self, request_group):
"""Inserts the existing group with a unique integer id
The groups coming from the flavor can have arbitrary ids but every id
is an integer. So this function can ensure unique ids by using bigger
ids than the maximum of existing ids.
:param request_group: the RequestGroup to be added
"""
# NOTE(gibi) [0] just here to always have a defined maximum
group_idents = [0] + [int(ident) for ident in self._rg_by_id if ident]
ident = max(group_idents) + 1
self._rg_by_id[ident] = request_group
def _add_resource(self, groupid, rclass, amount):
# Validate the class.
if not (rclass.startswith(fields.ResourceClass.CUSTOM_NAMESPACE) or
@ -453,6 +467,13 @@ def resources_from_request_spec(spec_obj):
for rclass, amount in spec_resources.items():
res_req.get_request_group(None).resources[rclass] = amount
requested_resources = (spec_obj.requested_resources
if 'requested_resources' in spec_obj
and spec_obj.requested_resources
else [])
for group in requested_resources:
res_req.add_request_group(group)
if 'requested_destination' in spec_obj:
destination = spec_obj.requested_destination
if destination and destination.aggregates:

View File

@ -431,6 +431,42 @@ class TestUtils(test.NoDBTestCase):
)
self.assertEqual(expected_querystring, resources.to_querystring())
def test_resources_from_request_spec_having_requested_resources(self):
flavor = objects.Flavor(
vcpus=1,
memory_mb=1024,
root_gb=10,
ephemeral_gb=5,
swap=0)
rg1 = objects.RequestGroup()
rg2 = objects.RequestGroup()
reqspec = objects.RequestSpec(flavor=flavor,
requested_resources=[rg1, rg2])
req = utils.resources_from_request_spec(reqspec)
self.assertEqual({'MEMORY_MB': 1024, 'DISK_GB': 15, 'VCPU': 1},
req.get_request_group(None).resources)
self.assertIs(rg1, req.get_request_group(1))
self.assertIs(rg2, req.get_request_group(2))
def test_resources_from_request_spec_requested_resources_unfilled(self):
flavor = objects.Flavor(
vcpus=1,
memory_mb=1024,
root_gb=10,
ephemeral_gb=5,
swap=0)
reqspec = objects.RequestSpec(flavor=flavor)
req = utils.resources_from_request_spec(reqspec)
self.assertEqual({'MEMORY_MB': 1024, 'DISK_GB': 15, 'VCPU': 1},
req.get_request_group(None).resources)
self.assertEqual(1, len(list(req.resource_groups())))
reqspec = objects.RequestSpec(flavor=flavor, requested_resources=[])
req = utils.resources_from_request_spec(reqspec)
self.assertEqual({'MEMORY_MB': 1024, 'DISK_GB': 15, 'VCPU': 1},
req.get_request_group(None).resources)
self.assertEqual(1, len(list(req.resource_groups())))
@mock.patch('nova.compute.utils.is_volume_backed_instance',
return_value=False)
def test_resources_from_flavor_no_bfv(self, mock_is_bfv):
@ -667,6 +703,29 @@ class TestUtils(test.NoDBTestCase):
expected, utils.ResourceRequest.from_image_props(image_meta_props,
req=existing_req))
def test_resource_request_add_group_inserts_the_group(self):
req = utils.ResourceRequest()
rg1 = objects.RequestGroup()
req.add_request_group(rg1)
rg2 = objects.RequestGroup()
req.add_request_group(rg2)
self.assertIs(rg1, req.get_request_group(1))
self.assertIs(rg2, req.get_request_group(2))
def test_resource_request_add_group_inserts_the_group_implicit_group(self):
req = utils.ResourceRequest()
# this implicitly creates the unnumbered group
unnumbered_rg = req.get_request_group(None)
rg1 = objects.RequestGroup()
req.add_request_group(rg1)
rg2 = objects.RequestGroup()
req.add_request_group(rg2)
self.assertIs(rg1, req.get_request_group(1))
self.assertIs(rg2, req.get_request_group(2))
self.assertIs(unnumbered_rg, req.get_request_group(None))
def test_merge_resources(self):
resources = {
'VCPU': 1, 'MEMORY_MB': 1024,