Merge "quota: Deprecate "force" behavior for network quotas"

This commit is contained in:
Zuul 2022-11-05 09:24:51 +00:00 committed by Gerrit Code Review
commit 837cbfbcdb
4 changed files with 59 additions and 16 deletions

View File

@ -15,6 +15,7 @@
"""Quota action implementations""" """Quota action implementations"""
import argparse
import itertools import itertools
import logging import logging
import sys import sys
@ -621,20 +622,37 @@ class SetQuota(common.NetDetectionMixin, command.Command):
metavar='<volume-type>', metavar='<volume-type>',
help=_('Set quotas for a specific <volume-type>'), help=_('Set quotas for a specific <volume-type>'),
) )
parser.add_argument( force_group = parser.add_mutually_exclusive_group()
force_group.add_argument(
'--force', '--force',
action='store_true', action='store_true',
dest='force',
# TODO(stephenfin): Change the default to False in Z or later
default=None,
help=_( help=_(
'Force quota update (only supported by compute and network)' 'Force quota update (only supported by compute and network) '
'(default for network)'
), ),
) )
parser.add_argument( force_group.add_argument(
'--check-limit', '--no-force',
action='store_true', action='store_false',
dest='force',
default=None,
help=_( help=_(
'Check quota limit when updating (only supported by network)' 'Do not force quota update '
'(only supported by compute and network) '
'(default for compute)'
), ),
) )
# kept here for backwards compatibility/to keep the neutron folks happy
force_group.add_argument(
'--check-limit',
action='store_false',
dest='force',
default=None,
help=argparse.SUPPRESS,
)
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
@ -657,8 +675,8 @@ class SetQuota(common.NetDetectionMixin, command.Command):
if value is not None: if value is not None:
compute_kwargs[k] = value compute_kwargs[k] = value
if parsed_args.force: if parsed_args.force is not None:
compute_kwargs['force'] = True compute_kwargs['force'] = parsed_args.force
volume_kwargs = {} volume_kwargs = {}
for k, v in VOLUME_QUOTAS.items(): for k, v in VOLUME_QUOTAS.items():
@ -669,10 +687,21 @@ class SetQuota(common.NetDetectionMixin, command.Command):
volume_kwargs[k] = value volume_kwargs[k] = value
network_kwargs = {} network_kwargs = {}
if parsed_args.check_limit: if parsed_args.force is True:
network_kwargs['check_limit'] = True # Unlike compute, network doesn't provide a simple boolean option.
if parsed_args.force: # Instead, it provides two options: 'force' and 'check_limit'
# (a.k.a. 'not force')
network_kwargs['force'] = True network_kwargs['force'] = True
elif parsed_args.force is False:
network_kwargs['check_limit'] = True
else:
msg = _(
"This command currently defaults to '--force' when modifying "
"network quotas. This behavior will change in a future "
"release. Consider explicitly providing '--force' or "
"'--no-force' options to avoid changes in behavior."
)
self.log.warning(msg)
if self.app.client_manager.is_network_endpoint_enabled(): if self.app.client_manager.is_network_endpoint_enabled():
for k, v in NETWORK_QUOTAS.items(): for k, v in NETWORK_QUOTAS.items():

View File

@ -176,7 +176,7 @@ class QuotaTests(base.TestCase):
def _restore_quota_limit(self, resource, limit, project): def _restore_quota_limit(self, resource, limit, project):
self.openstack('quota set --%s %s %s' % (resource, limit, project)) self.openstack('quota set --%s %s %s' % (resource, limit, project))
def test_quota_network_set_with_check_limit(self): def test_quota_network_set_with_no_force(self):
if not self.haz_network: if not self.haz_network:
self.skipTest('No Network service present') self.skipTest('No Network service present')
if not self.is_extension_enabled('quota-check-limit'): if not self.is_extension_enabled('quota-check-limit'):
@ -201,7 +201,7 @@ class QuotaTests(base.TestCase):
(self.PROJECT_NAME, uuid.uuid4().hex)) (self.PROJECT_NAME, uuid.uuid4().hex))
self.assertRaises(exceptions.CommandFailed, self.openstack, self.assertRaises(exceptions.CommandFailed, self.openstack,
'quota set --networks 1 --check-limit ' + 'quota set --networks 1 --no-force ' +
self.PROJECT_NAME) self.PROJECT_NAME)
def test_quota_network_set_with_force(self): def test_quota_network_set_with_force(self):

View File

@ -983,19 +983,19 @@ class TestQuotaSet(TestQuota):
) )
self.assertIsNone(result) self.assertIsNone(result)
def test_quota_set_with_check_limit(self): def test_quota_set_with_no_force(self):
arglist = [ arglist = [
'--subnets', str(network_fakes.QUOTA['subnet']), '--subnets', str(network_fakes.QUOTA['subnet']),
'--volumes', str(volume_fakes.QUOTA['volumes']), '--volumes', str(volume_fakes.QUOTA['volumes']),
'--cores', str(compute_fakes.core_num), '--cores', str(compute_fakes.core_num),
'--check-limit', '--no-force',
self.projects[0].name, self.projects[0].name,
] ]
verifylist = [ verifylist = [
('subnet', network_fakes.QUOTA['subnet']), ('subnet', network_fakes.QUOTA['subnet']),
('volumes', volume_fakes.QUOTA['volumes']), ('volumes', volume_fakes.QUOTA['volumes']),
('cores', compute_fakes.core_num), ('cores', compute_fakes.core_num),
('check_limit', True), ('force', False),
('project', self.projects[0].name), ('project', self.projects[0].name),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -1004,6 +1004,7 @@ class TestQuotaSet(TestQuota):
kwargs_compute = { kwargs_compute = {
'cores': compute_fakes.core_num, 'cores': compute_fakes.core_num,
'force': False,
} }
kwargs_volume = { kwargs_volume = {
'volumes': volume_fakes.QUOTA['volumes'], 'volumes': volume_fakes.QUOTA['volumes'],

View File

@ -0,0 +1,13 @@
---
features:
- Add ``--no-force`` option to the ``openstack quota set`` command (only
for compute and network commands). When specified, the compute and network
quota engine will check the resource usage before setting the new quota
limit. This is the default behavior of the compute quota engine and will
become the default for the network quota engine in a future release.
deprecations:
- The ``openstack quota set`` command currently defaults to ``--force``
behavior for network quotas. This behavior is now deprecated and a future
release will switch to ``--no-force`` behavior. Users should explicitly
specify one of these options to prevent a potentially breaking change in
behavior.