ff6d4560fe
This adds a limit query parameter to GET /allocation_candidates?limit=5&resource=VCPU:1 A 'limit' filter is added to the AllocationCandidates. If set, after the database query has been run to create the allocation requests and provider summaries, a slice or sample of the allocation requests is taken to limit the results. The summaries are then filtered to only include those in the allocation requests. This method avoids needing to make changes to the generated SQL, the creation of which is fairly complex, or the database tables. The amount of data queried is still high in the extreme case, but the amount of data sent over the wire (as JSON) is shrunk. This is a trade-off that was discussed in the spec and the discussion surrounding its review. If it turns out that memory use server-side is an issue we can investigate changing the SQL. A configuration setting, [placement]/randomize_allocation_candidates, is added to allow deployers to declare whether they want the results to be returned in whatever order the database chooses or a random order. The default is "False" which is expected to preserve existing behavior and impose a packing placement strategy. When the config setting is combined with the limit parameter, if "True" the limited results are a random sampling from the full results. If "False", it is a slice from the front. This is done as a new microversion, 1.16, with updates to docs, a reno and adjustments to the api history doc. Change-Id: I5f3d4f49c34fd3cd6b9d2e12b3c3c4cdcb409bec Implements: bp allocation-candidates-limit
92 lines
3.4 KiB
Python
92 lines
3.4 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from keystoneauth1 import loading as ks_loading
|
|
from oslo_config import cfg
|
|
|
|
from nova.conf import utils as confutils
|
|
|
|
|
|
DEFAULT_SERVICE_TYPE = 'placement'
|
|
|
|
placement_group = cfg.OptGroup(
|
|
'placement',
|
|
title='Placement Service Options',
|
|
help="Configuration options for connecting to the placement API service")
|
|
|
|
placement_opts = [
|
|
cfg.StrOpt(
|
|
'os_region_name',
|
|
deprecated_for_removal=True,
|
|
deprecated_since='17.0.0',
|
|
deprecated_reason='Endpoint lookup uses the service catalog via '
|
|
'common keystoneauth1 Adapter configuration '
|
|
'options. Use the region_name option instead.',
|
|
help="""
|
|
Region name of this node. This is used when picking the URL in the service
|
|
catalog.
|
|
|
|
Possible values:
|
|
|
|
* Any string representing region name
|
|
"""),
|
|
cfg.StrOpt(
|
|
'os_interface',
|
|
deprecated_for_removal=True,
|
|
deprecated_since='17.0.0',
|
|
deprecated_reason='Endpoint lookup uses the service catalog via '
|
|
'common keystoneauth1 Adapter configuration '
|
|
'options. Use the valid_interfaces option instead.',
|
|
help="""
|
|
Endpoint interface for this node. This is used when picking the URL in the
|
|
service catalog.
|
|
"""),
|
|
cfg.BoolOpt('randomize_allocation_candidates',
|
|
default=False,
|
|
help="""
|
|
If True, when limiting allocation candidate results, the results will be
|
|
a random sampling of the full result set. If False, allocation candidates
|
|
are returned in a deterministic but undefined order. That is, all things
|
|
being equal, two requests for allocation candidates will return the same
|
|
results in the same order; but no guarantees are made as to how that order
|
|
is determined.
|
|
"""),
|
|
]
|
|
|
|
deprecated_opts = {
|
|
'region_name': [cfg.DeprecatedOpt('os_region_name',
|
|
group=placement_group.name)],
|
|
'valid_interfaces': [cfg.DeprecatedOpt('os_interface',
|
|
group=placement_group.name)]
|
|
}
|
|
|
|
|
|
def register_opts(conf):
|
|
conf.register_group(placement_group)
|
|
conf.register_opts(placement_opts, group=placement_group)
|
|
confutils.register_ksa_opts(conf, placement_group, DEFAULT_SERVICE_TYPE,
|
|
deprecated_opts=deprecated_opts)
|
|
|
|
|
|
def list_opts():
|
|
return {
|
|
placement_group.name: (
|
|
placement_opts +
|
|
ks_loading.get_session_conf_options() +
|
|
ks_loading.get_auth_common_conf_options() +
|
|
ks_loading.get_auth_plugin_conf_options('password') +
|
|
ks_loading.get_auth_plugin_conf_options('v2password') +
|
|
ks_loading.get_auth_plugin_conf_options('v3password') +
|
|
confutils.get_ksa_adapter_opts(DEFAULT_SERVICE_TYPE,
|
|
deprecated_opts=deprecated_opts))
|
|
}
|