quota: Add 'quota set --default' option

This should have been added as a counterpart to the 'quota show
--default' option way back when we added that. Better late than never!

Change-Id: I0e3719e585353664fea6f23ec658a330086db3df
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
This commit is contained in:
Stephen Finucane 2024-07-11 11:10:50 +01:00
parent ba2d2358e6
commit 7d8baa87bb
3 changed files with 111 additions and 11 deletions

View File

@ -461,10 +461,15 @@ class SetQuota(common.NetDetectionMixin, command.Command):
parser.add_argument(
'project',
metavar='<project/class>',
help=_('Set quotas for this project or class (name or ID)'),
nargs='?',
help=_(
'Set quotas for this project or class (name or ID) '
'(defaults to current project)'
),
)
# TODO(stephenfin): Remove in OSC 8.0
parser.add_argument(
type_group = parser.add_mutually_exclusive_group()
type_group.add_argument(
'--class',
dest='quota_class',
action='store_true',
@ -476,6 +481,13 @@ class SetQuota(common.NetDetectionMixin, command.Command):
'(compute and volume only)'
),
)
type_group.add_argument(
'--default',
dest='default',
action='store_true',
default=False,
help=_('Set default quotas for <project>'),
)
for k, v, h in self._build_options_list():
parser.add_argument(
'--%s' % v,
@ -529,13 +541,13 @@ class SetQuota(common.NetDetectionMixin, command.Command):
"never fully implemented and the compute and volume services "
"only support a single 'default' quota class while the "
"network service does not support quota classes at all. "
"Please use 'openstack quota show --default' instead."
"Please use 'openstack quota set --default' instead."
)
self.log.warning(msg)
identity_client = self.app.client_manager.identity
compute_client = self.app.client_manager.compute
volume_client = self.app.client_manager.volume
compute_kwargs = {}
for k, v in COMPUTE_QUOTAS.items():
value = getattr(parsed_args, k, None)
@ -581,15 +593,15 @@ class SetQuota(common.NetDetectionMixin, command.Command):
if value is not None:
compute_kwargs[k] = value
if parsed_args.quota_class:
if parsed_args.quota_class or parsed_args.default:
if compute_kwargs:
compute_client.quota_classes.update(
parsed_args.project,
parsed_args.project or 'default',
**compute_kwargs,
)
if volume_kwargs:
volume_client.quota_classes.update(
parsed_args.project,
parsed_args.project or 'default',
**volume_kwargs,
)
if network_kwargs:
@ -600,10 +612,8 @@ class SetQuota(common.NetDetectionMixin, command.Command):
return
project = utils.find_resource(
identity_client.projects,
parsed_args.project,
).id
project_info = get_project(self.app, parsed_args.project)
project = project_info['id']
if compute_kwargs:
compute_client.quotas.update(project, **compute_kwargs)

View File

@ -788,6 +788,89 @@ class TestQuotaSet(TestQuota):
self.assertNotCalled(self.network_client.update_quota)
self.assertIsNone(result)
def test_quota_set_default(self):
arglist = [
'--injected-files',
str(compute_fakes.injected_file_num),
'--injected-file-size',
str(compute_fakes.injected_file_size_num),
'--injected-path-size',
str(compute_fakes.injected_path_size_num),
'--key-pairs',
str(compute_fakes.key_pair_num),
'--cores',
str(compute_fakes.core_num),
'--ram',
str(compute_fakes.ram_num),
'--instances',
str(compute_fakes.instance_num),
'--properties',
str(compute_fakes.property_num),
'--server-groups',
str(compute_fakes.servgroup_num),
'--server-group-members',
str(compute_fakes.servgroup_members_num),
'--gigabytes',
str(compute_fakes.floating_ip_num),
'--snapshots',
str(compute_fakes.fix_ip_num),
'--volumes',
str(volume_fakes.QUOTA['volumes']),
'--network',
str(network_fakes.QUOTA['network']),
'--default',
]
verifylist = [
('injected_files', compute_fakes.injected_file_num),
(
'injected_file_content_bytes',
compute_fakes.injected_file_size_num,
),
('injected_file_path_bytes', compute_fakes.injected_path_size_num),
('key_pairs', compute_fakes.key_pair_num),
('cores', compute_fakes.core_num),
('ram', compute_fakes.ram_num),
('instances', compute_fakes.instance_num),
('metadata_items', compute_fakes.property_num),
('server_groups', compute_fakes.servgroup_num),
('server_group_members', compute_fakes.servgroup_members_num),
('gigabytes', compute_fakes.floating_ip_num),
('snapshots', compute_fakes.fix_ip_num),
('volumes', volume_fakes.QUOTA['volumes']),
('network', network_fakes.QUOTA['network']),
('default', True),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
kwargs_compute = {
'injected_files': compute_fakes.injected_file_num,
'injected_file_content_bytes': compute_fakes.injected_file_size_num, # noqa: E501
'injected_file_path_bytes': compute_fakes.injected_path_size_num,
'key_pairs': compute_fakes.key_pair_num,
'cores': compute_fakes.core_num,
'ram': compute_fakes.ram_num,
'instances': compute_fakes.instance_num,
'metadata_items': compute_fakes.property_num,
'server_groups': compute_fakes.servgroup_num,
'server_group_members': compute_fakes.servgroup_members_num,
}
kwargs_volume = {
'gigabytes': compute_fakes.floating_ip_num,
'snapshots': compute_fakes.fix_ip_num,
'volumes': volume_fakes.QUOTA['volumes'],
}
self.compute_quotas_class_mock.update.assert_called_with(
'default', **kwargs_compute
)
self.volume_quotas_class_mock.update.assert_called_with(
'default', **kwargs_volume
)
self.assertNotCalled(self.network_client.update_quota)
self.assertIsNone(result)
def test_quota_set_with_force(self):
arglist = [
'--cores',

View File

@ -0,0 +1,7 @@
---
features:
- |
The ``quota set`` command now supports a ``--default`` option. When
provided, this will allow you to set quotas for the default quota class
which is the only quota class supported by the Compute and Block Storage
services. This replaces the deprecated ``quota set --class`` option.