Disable limits if force_hosts or force_nodes is set
Setting max_placement_results will make force_host invaild sometimes, especially in large-scale enviroment. Disable limit param in GET /allocation_candidates if force_hosts or force_nodes is set. Change-Id: Iff1b49fe7e6347e3c2bb5992494b2450809719a2 Closes-Bug: #1777591
This commit is contained in:
parent
08a618d0c4
commit
1d91811ad4
|
@ -58,6 +58,8 @@ class ResourceRequest(object):
|
|||
# { ident: RequestGroup }
|
||||
self._rg_by_id = {}
|
||||
self._group_policy = None
|
||||
# Default to the configured limit but _limit can be
|
||||
# set to None to indicate "no limit".
|
||||
self._limit = CONF.scheduler.max_placement_results
|
||||
|
||||
def __str__(self):
|
||||
|
@ -272,7 +274,10 @@ class ResourceRequest(object):
|
|||
qs_params.extend(sorted(aggs))
|
||||
return qs_params
|
||||
|
||||
qparams = [('limit', self._limit)]
|
||||
if self._limit is not None:
|
||||
qparams = [('limit', self._limit)]
|
||||
else:
|
||||
qparams = []
|
||||
if self._group_policy is not None:
|
||||
qparams.append(('group_policy', self._group_policy))
|
||||
for ident, rg in self._rg_by_id.items():
|
||||
|
@ -449,6 +454,12 @@ def resources_from_request_spec(spec_obj):
|
|||
grp.member_of = [tuple(ored.split(','))
|
||||
for ored in destination.aggregates]
|
||||
|
||||
# Don't limit allocation candidates when using force_hosts or force_nodes.
|
||||
if 'force_hosts' in spec_obj and spec_obj.force_hosts:
|
||||
res_req._limit = None
|
||||
if 'force_nodes' in spec_obj and spec_obj.force_nodes:
|
||||
res_req._limit = None
|
||||
|
||||
return res_req
|
||||
|
||||
|
||||
|
|
|
@ -370,6 +370,76 @@ class TestUtils(test.NoDBTestCase):
|
|||
fake_spec = objects.RequestSpec(flavor=flavor)
|
||||
utils.resources_from_request_spec(fake_spec)
|
||||
|
||||
def test_process_no_force_hosts_or_force_nodes(self):
|
||||
flavor = objects.Flavor(vcpus=1,
|
||||
memory_mb=1024,
|
||||
root_gb=15,
|
||||
ephemeral_gb=0,
|
||||
swap=0)
|
||||
expected = utils.ResourceRequest()
|
||||
expected._rg_by_id[None] = plib.RequestGroup(
|
||||
use_same_provider=False,
|
||||
resources={
|
||||
'VCPU': 1,
|
||||
'MEMORY_MB': 1024,
|
||||
'DISK_GB': 15,
|
||||
},
|
||||
)
|
||||
rr = self._test_resources_from_request_spec(expected, flavor)
|
||||
expected_querystring = (
|
||||
'limit=1000&'
|
||||
'resources=DISK_GB%3A15%2CMEMORY_MB%3A1024%2CVCPU%3A1'
|
||||
)
|
||||
self.assertEqual(expected_querystring, rr.to_querystring())
|
||||
|
||||
def test_process_use_force_nodes(self):
|
||||
flavor = objects.Flavor(vcpus=1,
|
||||
memory_mb=1024,
|
||||
root_gb=15,
|
||||
ephemeral_gb=0,
|
||||
swap=0)
|
||||
fake_spec = objects.RequestSpec(flavor=flavor, force_nodes=['test'])
|
||||
expected = utils.ResourceRequest()
|
||||
expected._rg_by_id[None] = plib.RequestGroup(
|
||||
use_same_provider=False,
|
||||
resources={
|
||||
'VCPU': 1,
|
||||
'MEMORY_MB': 1024,
|
||||
'DISK_GB': 15,
|
||||
},
|
||||
)
|
||||
expected._limit = None
|
||||
resources = utils.resources_from_request_spec(fake_spec)
|
||||
self.assertResourceRequestsEqual(expected, resources)
|
||||
expected_querystring = (
|
||||
'resources=DISK_GB%3A15%2CMEMORY_MB%3A1024%2CVCPU%3A1'
|
||||
)
|
||||
self.assertEqual(expected_querystring, resources.to_querystring())
|
||||
|
||||
def test_process_use_force_hosts(self):
|
||||
flavor = objects.Flavor(vcpus=1,
|
||||
memory_mb=1024,
|
||||
root_gb=15,
|
||||
ephemeral_gb=0,
|
||||
swap=0)
|
||||
fake_spec = objects.RequestSpec(flavor=flavor, force_hosts=['test'])
|
||||
expected = utils.ResourceRequest()
|
||||
expected._rg_by_id[None] = plib.RequestGroup(
|
||||
use_same_provider=False,
|
||||
resources={
|
||||
'VCPU': 1,
|
||||
'MEMORY_MB': 1024,
|
||||
'DISK_GB': 15,
|
||||
},
|
||||
)
|
||||
expected._limit = None
|
||||
resources = utils.resources_from_request_spec(fake_spec)
|
||||
self.assertResourceRequestsEqual(expected, resources)
|
||||
expected_querystring = (
|
||||
'resources=DISK_GB%3A15%2CMEMORY_MB%3A1024%2CVCPU%3A1'
|
||||
)
|
||||
self.assertEqual(expected_querystring, resources.to_querystring())
|
||||
|
||||
@mock.patch('nova.compute.utils.is_volume_backed_instance',
|
||||
return_value=False)
|
||||
def test_resources_from_flavor_no_bfv(self, mock_is_bfv):
|
||||
|
|
Loading…
Reference in New Issue