Change the default values of XXX_allocation_ratio
This patch including 2 changes: 1. Change the default values for CONF.(cpu|ram|disk)_allocation_ratio to ``None`` 2. Change the resource tracker to overwrite the compute node's allocations ratios to the value of the XXX_allocation_ratio if the value of these options is NOT ``None`` or ``0.0``. The "0.0" condition is for upgrade impact, and it will be removed in the next version (T version). Change-Id: I6893d63dc5f29bc2eb348fe0aa9fbc8490e6eb40 blueprint: initial-allocation-ratios
This commit is contained in:
parent
5d536b0d3a
commit
212eff600a
|
@ -621,29 +621,33 @@ class ResourceTracker(object):
|
||||||
compute_node.stats = stats
|
compute_node.stats = stats
|
||||||
|
|
||||||
# Update the allocation ratios for the related ComputeNode object
|
# Update the allocation ratios for the related ComputeNode object
|
||||||
# but only if the configured values are not the default 0.0; the
|
# but only if the configured values are not the default; the
|
||||||
# ComputeNode._from_db_object method takes care of providing default
|
# ComputeNode._from_db_object method takes care of providing default
|
||||||
# allocation ratios when the config is left at the 0.0 default, so
|
# allocation ratios when the config is left at the default, so
|
||||||
# we'll really end up with something like a
|
# we'll really end up with something like a
|
||||||
# ComputeNode.cpu_allocation_ratio of 16.0, not 0.0. We want to avoid
|
# ComputeNode.cpu_allocation_ratio of 16.0. We want to avoid
|
||||||
# resetting the ComputeNode fields to 0.0 because that will make
|
# resetting the ComputeNode fields to None because that will make
|
||||||
# the _resource_change method think something changed when really it
|
# the _resource_change method think something changed when really it
|
||||||
# didn't.
|
# didn't.
|
||||||
# TODO(mriedem): Will this break any scenarios where an operator is
|
# TODO(mriedem): Will this break any scenarios where an operator is
|
||||||
# trying to *reset* the allocation ratios by changing config from
|
# trying to *reset* the allocation ratios by changing config from
|
||||||
# non-0.0 back to 0.0? Maybe we should only do this if the fields on
|
# non-None back to None? Maybe we should only do this if the fields on
|
||||||
# the ComputeNode object are not already set. For example, let's say
|
# the ComputeNode object are not already set. For example, let's say
|
||||||
# the cpu_allocation_ratio config was 1.0 and then the operator wants
|
# the cpu_allocation_ratio config was 1.0 and then the operator wants
|
||||||
# to get back to the default (16.0 via the facade), and to do that they
|
# to get back to the default (16.0 via the facade), and to do that they
|
||||||
# change the config back to 0.0 (or just unset the config option).
|
# change the config back to None (or just unset the config option).
|
||||||
# Should we support that or treat these config options as "sticky" in
|
# Should we support that or treat these config options as "sticky" in
|
||||||
# that once you start setting them, you can't go back to the implied
|
# that once you start setting them, you can't go back to the implied
|
||||||
# defaults by unsetting or resetting to 0.0? Sort of like how
|
# defaults by unsetting or resetting to None? Sort of like how
|
||||||
# per-tenant quota is sticky once you change it in the API.
|
# per-tenant quota is sticky once you change it in the API.
|
||||||
for res in ('cpu', 'disk', 'ram'):
|
for res in ('cpu', 'disk', 'ram'):
|
||||||
attr = '%s_allocation_ratio' % res
|
attr = '%s_allocation_ratio' % res
|
||||||
conf_alloc_ratio = getattr(self, attr)
|
conf_alloc_ratio = getattr(self, attr)
|
||||||
if conf_alloc_ratio != 0.0:
|
# NOTE(yikun): In Stein version, we change the default value of
|
||||||
|
# (cpu|ram|disk)_allocation_ratio from 0.0 to None, but we still
|
||||||
|
# should allow 0.0 to keep compatibility, and this 0.0 condition
|
||||||
|
# will be removed in the next version (T version).
|
||||||
|
if conf_alloc_ratio not in (0.0, None):
|
||||||
setattr(compute_node, attr, conf_alloc_ratio)
|
setattr(compute_node, attr, conf_alloc_ratio)
|
||||||
|
|
||||||
# now copy rest to compute_node
|
# now copy rest to compute_node
|
||||||
|
|
|
@ -381,7 +381,7 @@ Possible values:
|
||||||
|
|
||||||
allocation_ratio_opts = [
|
allocation_ratio_opts = [
|
||||||
cfg.FloatOpt('cpu_allocation_ratio',
|
cfg.FloatOpt('cpu_allocation_ratio',
|
||||||
default=0.0,
|
default=None,
|
||||||
min=0.0,
|
min=0.0,
|
||||||
help="""
|
help="""
|
||||||
This option helps you specify virtual CPU to physical CPU allocation ratio.
|
This option helps you specify virtual CPU to physical CPU allocation ratio.
|
||||||
|
@ -395,18 +395,18 @@ This configuration specifies ratio for CoreFilter which can be set
|
||||||
per compute node. For AggregateCoreFilter, it will fall back to this
|
per compute node. For AggregateCoreFilter, it will fall back to this
|
||||||
configuration value if no per-aggregate setting is found.
|
configuration value if no per-aggregate setting is found.
|
||||||
|
|
||||||
NOTE: This can be set per-compute, or if set to 0.0, the value
|
NOTE: If this option is set to something *other than* ``None`` or ``0.0``, the
|
||||||
set on the scheduler node(s) or compute node(s) will be used
|
allocation ratio will be overwritten by the value of this option, otherwise,
|
||||||
and defaulted to 16.0. Once set to a non-default value, it is not possible
|
the allocation ratio will not change. Once set to a non-default value, it is
|
||||||
to "unset" the config to get back to the default behavior. If you want
|
not possible to "unset" the config to get back to the default behavior. If you
|
||||||
to reset back to the default, explicitly specify 16.0.
|
want to reset back to the default, explicitly specify 16.0.
|
||||||
|
|
||||||
Possible values:
|
Possible values:
|
||||||
|
|
||||||
* Any valid positive integer or float value
|
* Any valid positive integer or float value
|
||||||
"""),
|
"""),
|
||||||
cfg.FloatOpt('ram_allocation_ratio',
|
cfg.FloatOpt('ram_allocation_ratio',
|
||||||
default=0.0,
|
default=None,
|
||||||
min=0.0,
|
min=0.0,
|
||||||
help="""
|
help="""
|
||||||
This option helps you specify virtual RAM to physical RAM
|
This option helps you specify virtual RAM to physical RAM
|
||||||
|
@ -421,18 +421,18 @@ This configuration specifies ratio for RamFilter which can be set
|
||||||
per compute node. For AggregateRamFilter, it will fall back to this
|
per compute node. For AggregateRamFilter, it will fall back to this
|
||||||
configuration value if no per-aggregate setting found.
|
configuration value if no per-aggregate setting found.
|
||||||
|
|
||||||
NOTE: This can be set per-compute, or if set to 0.0, the value
|
NOTE: If this option is set to something *other than* ``None`` or ``0.0``, the
|
||||||
set on the scheduler node(s) or compute node(s) will be used and
|
allocation ratio will be overwritten by the value of this option, otherwise,
|
||||||
defaulted to 1.5. Once set to a non-default value, it is not possible
|
the allocation ratio will not change. Once set to a non-default value, it is
|
||||||
to "unset" the config to get back to the default behavior. If you want
|
not possible to "unset" the config to get back to the default behavior. If you
|
||||||
to reset back to the default, explicitly specify 1.5.
|
want to reset back to the default, explicitly specify 1.5.
|
||||||
|
|
||||||
Possible values:
|
Possible values:
|
||||||
|
|
||||||
* Any valid positive integer or float value
|
* Any valid positive integer or float value
|
||||||
"""),
|
"""),
|
||||||
cfg.FloatOpt('disk_allocation_ratio',
|
cfg.FloatOpt('disk_allocation_ratio',
|
||||||
default=0.0,
|
default=None,
|
||||||
min=0.0,
|
min=0.0,
|
||||||
help="""
|
help="""
|
||||||
This option helps you specify virtual disk to physical disk
|
This option helps you specify virtual disk to physical disk
|
||||||
|
@ -451,11 +451,11 @@ images. It can be set to a value between 0.0 and 1.0 in order
|
||||||
to preserve a percentage of the disk for uses other than
|
to preserve a percentage of the disk for uses other than
|
||||||
instances.
|
instances.
|
||||||
|
|
||||||
NOTE: This can be set per-compute, or if set to 0.0, the value
|
NOTE: If this option is set to something *other than* ``None`` or ``0.0``, the
|
||||||
set on the scheduler node(s) or compute node(s) will be used and
|
allocation ratio will be overwritten by the value of this option, otherwise,
|
||||||
defaulted to 1.0. Once set to a non-default value, it is not possible
|
the allocation ratio will not change. Once set to a non-default value, it is
|
||||||
to "unset" the config to get back to the default behavior. If you want
|
not possible to "unset" the config to get back to the default behavior. If you
|
||||||
to reset back to the default, explicitly specify 1.0.
|
want to reset back to the default, explicitly specify 1.0.
|
||||||
|
|
||||||
Possible values:
|
Possible values:
|
||||||
|
|
||||||
|
|
|
@ -197,13 +197,16 @@ class ComputeNode(base.NovaPersistentObject, base.NovaObject):
|
||||||
# or the compute node is updated but the default value has
|
# or the compute node is updated but the default value has
|
||||||
# not been changed
|
# not been changed
|
||||||
value = getattr(CONF, key)
|
value = getattr(CONF, key)
|
||||||
if value == 0.0 and key == 'cpu_allocation_ratio':
|
if value in (0.0, None) \
|
||||||
|
and key == 'cpu_allocation_ratio':
|
||||||
# It's not specified either on the controller
|
# It's not specified either on the controller
|
||||||
value = 16.0
|
value = 16.0
|
||||||
if value == 0.0 and key == 'ram_allocation_ratio':
|
if value in (0.0, None) \
|
||||||
|
and key == 'ram_allocation_ratio':
|
||||||
# It's not specified either on the controller
|
# It's not specified either on the controller
|
||||||
value = 1.5
|
value = 1.5
|
||||||
if value == 0.0 and key == 'disk_allocation_ratio':
|
if value in (0.0, None) \
|
||||||
|
and key == 'disk_allocation_ratio':
|
||||||
# It's not specified either on the controller
|
# It's not specified either on the controller
|
||||||
value = 1.0
|
value = 1.0
|
||||||
elif key == 'mapped':
|
elif key == 'mapped':
|
||||||
|
|
|
@ -1550,7 +1550,7 @@ class TestUpdateComputeNode(BaseTestCase):
|
||||||
|
|
||||||
def test_copy_resources_no_update_allocation_ratios(self):
|
def test_copy_resources_no_update_allocation_ratios(self):
|
||||||
"""Tests that a ComputeNode object's allocation ratio fields are
|
"""Tests that a ComputeNode object's allocation ratio fields are
|
||||||
not set if the configured allocation ratio values are default 0.0.
|
not set if the configured allocation ratio values are default None.
|
||||||
"""
|
"""
|
||||||
self._setup_rt()
|
self._setup_rt()
|
||||||
compute = _COMPUTE_NODE_FIXTURES[0].obj_clone()
|
compute = _COMPUTE_NODE_FIXTURES[0].obj_clone()
|
||||||
|
@ -1563,11 +1563,34 @@ class TestUpdateComputeNode(BaseTestCase):
|
||||||
attr_name = '%s_allocation_ratio' % res
|
attr_name = '%s_allocation_ratio' % res
|
||||||
self.assertNotIn(attr_name, changes)
|
self.assertNotIn(attr_name, changes)
|
||||||
|
|
||||||
|
def test_copy_resources_update_allocation_zero_ratios(self):
|
||||||
|
"""Tests that a ComputeNode object's allocation ratio fields are
|
||||||
|
not set if the configured allocation ratio values are 0.0.
|
||||||
|
"""
|
||||||
|
# NOTE(yikun): In Stein version, we change the default value of
|
||||||
|
# (cpu|ram|disk)_allocation_ratio from 0.0 to None, but we still
|
||||||
|
# should allow 0.0 to keep compatibility, and this 0.0 condition
|
||||||
|
# will be removed in the next version (T version).
|
||||||
|
# Set explicit ratio config values to 0.0 (the default is None).
|
||||||
|
for res in ('cpu', 'disk', 'ram'):
|
||||||
|
opt_name = '%s_allocation_ratio' % res
|
||||||
|
CONF.set_override(opt_name, 0.0)
|
||||||
|
self._setup_rt()
|
||||||
|
compute = _COMPUTE_NODE_FIXTURES[0].obj_clone()
|
||||||
|
compute.obj_reset_changes() # make sure we start clean
|
||||||
|
self.rt._copy_resources(
|
||||||
|
compute, self.driver_mock.get_available_resource.return_value)
|
||||||
|
# Assert that the ComputeNode fields were not changed.
|
||||||
|
changes = compute.obj_get_changes()
|
||||||
|
for res in ('cpu', 'disk', 'ram'):
|
||||||
|
attr_name = '%s_allocation_ratio' % res
|
||||||
|
self.assertNotIn(attr_name, changes)
|
||||||
|
|
||||||
def test_copy_resources_update_allocation_ratios_from_config(self):
|
def test_copy_resources_update_allocation_ratios_from_config(self):
|
||||||
"""Tests that a ComputeNode object's allocation ratio fields are
|
"""Tests that a ComputeNode object's allocation ratio fields are
|
||||||
set if the configured allocation ratio values are not 0.0.
|
set if the configured allocation ratio values are not default.
|
||||||
"""
|
"""
|
||||||
# Set explicit ratio config values to 1.0 (the default is 0.0).
|
# Set explicit ratio config values to 1.0 (the default is None).
|
||||||
for res in ('cpu', 'disk', 'ram'):
|
for res in ('cpu', 'disk', 'ram'):
|
||||||
opt_name = '%s_allocation_ratio' % res
|
opt_name = '%s_allocation_ratio' % res
|
||||||
CONF.set_override(opt_name, 1.0)
|
CONF.set_override(opt_name, 1.0)
|
||||||
|
|
|
@ -565,9 +565,25 @@ class _TestComputeNodeObject(object):
|
||||||
self.assertEqual(3.0, compute.ram_allocation_ratio)
|
self.assertEqual(3.0, compute.ram_allocation_ratio)
|
||||||
self.assertEqual(0.9, compute.disk_allocation_ratio)
|
self.assertEqual(0.9, compute.disk_allocation_ratio)
|
||||||
|
|
||||||
def test_compat_allocation_ratios_default_values(self):
|
def test_compat_allocation_ratios_zero_conf(self):
|
||||||
|
self.flags(cpu_allocation_ratio=0.0, ram_allocation_ratio=0.0,
|
||||||
|
disk_allocation_ratio=0.0)
|
||||||
compute_dict = fake_compute_node.copy()
|
compute_dict = fake_compute_node.copy()
|
||||||
# new computes provide allocation ratios defaulted to 0.0
|
# the computes provide allocation ratios None
|
||||||
|
compute_dict['cpu_allocation_ratio'] = None
|
||||||
|
compute_dict['ram_allocation_ratio'] = None
|
||||||
|
compute_dict['disk_allocation_ratio'] = None
|
||||||
|
cls = objects.ComputeNode
|
||||||
|
compute = cls._from_db_object(self.context, cls(), compute_dict)
|
||||||
|
|
||||||
|
self.assertEqual(16.0, compute.cpu_allocation_ratio)
|
||||||
|
self.assertEqual(1.5, compute.ram_allocation_ratio)
|
||||||
|
self.assertEqual(1.0, compute.disk_allocation_ratio)
|
||||||
|
|
||||||
|
def test_compat_allocation_ratios_None_conf_zero_values(self):
|
||||||
|
# the CONF.x_allocation_ratio is None by default
|
||||||
|
compute_dict = fake_compute_node.copy()
|
||||||
|
# the computes provide allocation ratios 0.0
|
||||||
compute_dict['cpu_allocation_ratio'] = 0.0
|
compute_dict['cpu_allocation_ratio'] = 0.0
|
||||||
compute_dict['ram_allocation_ratio'] = 0.0
|
compute_dict['ram_allocation_ratio'] = 0.0
|
||||||
compute_dict['disk_allocation_ratio'] = 0.0
|
compute_dict['disk_allocation_ratio'] = 0.0
|
||||||
|
@ -578,9 +594,10 @@ class _TestComputeNodeObject(object):
|
||||||
self.assertEqual(1.5, compute.ram_allocation_ratio)
|
self.assertEqual(1.5, compute.ram_allocation_ratio)
|
||||||
self.assertEqual(1.0, compute.disk_allocation_ratio)
|
self.assertEqual(1.0, compute.disk_allocation_ratio)
|
||||||
|
|
||||||
def test_compat_allocation_ratios_old_compute_default_values(self):
|
def test_compat_allocation_ratios_None_conf_None_values(self):
|
||||||
|
# the CONF.x_allocation_ratio is None by default
|
||||||
compute_dict = fake_compute_node.copy()
|
compute_dict = fake_compute_node.copy()
|
||||||
# old computes don't provide allocation ratios to the table
|
# # the computes provide allocation ratios None
|
||||||
compute_dict['cpu_allocation_ratio'] = None
|
compute_dict['cpu_allocation_ratio'] = None
|
||||||
compute_dict['ram_allocation_ratio'] = None
|
compute_dict['ram_allocation_ratio'] = None
|
||||||
compute_dict['disk_allocation_ratio'] = None
|
compute_dict['disk_allocation_ratio'] = None
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
The default value for the "cpu_allocation_ratio", "ram_allocation_ratio"
|
||||||
|
and "disk_allocation_ratio" configurations have been changed to ``None``.
|
Loading…
Reference in New Issue