Merge "quota: Deprecate "force" behavior for network quotas"
This commit is contained in:
commit
837cbfbcdb
@ -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():
|
||||||
|
@ -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):
|
||||||
|
@ -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'],
|
||||||
|
@ -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.
|
Loading…
x
Reference in New Issue
Block a user