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:
parent
1d44fbddef
commit
a5d6833d77
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue