Disallow CONF.compute.max_disk_devices_to_attach = 0

The CONF.compute.max_disk_devices_to_attach option controls the maximum
number of disk devices allowed to attach to an instance. If it is set
to 0, it will literally allow no disk device for instances, preventing
them from being able to boot.

This adds a note to the config option help to call this out and changes
nova-compute to raise InvalidConfiguration during init_host if
[compute]max_disk_devices_to_attach has been set to 0. The nova-compute
service will fail to start if the option is set to 0.

Note: there doesn't appear to be any way to disallow particular values
in a oslo.config IntOpt other than the min/max values. Here we need the
min value to be -1 to represent unlimited. There is a 'choices' kwarg
available but that is only for enumerating valid values and we need to
allow any integer >= 1 as well.

Closes-Bug: #1897950

Change-Id: I6e30468bc28f661ddc17937ab1de04a706f05063
This commit is contained in:
melanie witt 2020-09-30 17:26:21 +00:00 committed by Lee Yarwood
parent 6c0ceda365
commit 25a632a4e1
3 changed files with 19 additions and 1 deletions

View File

@ -1403,6 +1403,13 @@ class ComputeManager(manager.Manager):
eventlet.semaphore.BoundedSemaphore(
CONF.compute.max_concurrent_disk_ops)
if CONF.compute.max_disk_devices_to_attach == 0:
msg = _('[compute]max_disk_devices_to_attach has been set to 0, '
'which will prevent instances from being able to boot. '
'Set -1 for unlimited or set >= 1 to limit the maximum '
'number of disk devices.')
raise exception.InvalidConfiguration(msg)
self.driver.init_host(host=self.host)
context = nova.context.get_admin_context()
instances = objects.InstanceList.get_by_host(

View File

@ -962,10 +962,16 @@ on compute host B.
The configured maximum is not enforced on shelved offloaded servers, as they
have no compute host.
.. warning:: If this option is set to 0, the ``nova-compute`` service will fail
to start, as 0 disk devices is an invalid configuration that would
prevent instances from being able to boot.
Possible values:
* -1 means unlimited
* Any integer >= 0 represents the maximum allowed
* Any integer >= 1 represents the maximum allowed. A value of 0 will cause the
``nova-compute`` service to fail to start, as 0 disk devices is an invalid
configuration that would prevent instances from being able to boot.
"""),
cfg.StrOpt('provider_config_location',
default='/etc/nova/provider_config/',

View File

@ -1109,6 +1109,11 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
"time this service is starting on this host, then you can ignore "
"this warning.", 'fake-node1')
def test_init_host_disk_devices_configuration_failure(self):
self.flags(max_disk_devices_to_attach=0, group='compute')
self.assertRaises(exception.InvalidConfiguration,
self.compute.init_host)
@mock.patch.object(objects.InstanceList, 'get_by_host',
new=mock.Mock())
@mock.patch('nova.compute.manager.ComputeManager.'