Skip to content

Commit 7d8baa8

Browse files
committed
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>
1 parent ba2d235 commit 7d8baa8

3 files changed

Lines changed: 111 additions & 11 deletions

File tree

openstackclient/common/quota.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -461,10 +461,15 @@ def get_parser(self, prog_name):
461461
parser.add_argument(
462462
'project',
463463
metavar='<project/class>',
464-
help=_('Set quotas for this project or class (name or ID)'),
464+
nargs='?',
465+
help=_(
466+
'Set quotas for this project or class (name or ID) '
467+
'(defaults to current project)'
468+
),
465469
)
466470
# TODO(stephenfin): Remove in OSC 8.0
467-
parser.add_argument(
471+
type_group = parser.add_mutually_exclusive_group()
472+
type_group.add_argument(
468473
'--class',
469474
dest='quota_class',
470475
action='store_true',
@@ -476,6 +481,13 @@ def get_parser(self, prog_name):
476481
'(compute and volume only)'
477482
),
478483
)
484+
type_group.add_argument(
485+
'--default',
486+
dest='default',
487+
action='store_true',
488+
default=False,
489+
help=_('Set default quotas for <project>'),
490+
)
479491
for k, v, h in self._build_options_list():
480492
parser.add_argument(
481493
'--%s' % v,
@@ -529,13 +541,13 @@ def take_action(self, parsed_args):
529541
"never fully implemented and the compute and volume services "
530542
"only support a single 'default' quota class while the "
531543
"network service does not support quota classes at all. "
532-
"Please use 'openstack quota show --default' instead."
544+
"Please use 'openstack quota set --default' instead."
533545
)
534546
self.log.warning(msg)
535547

536-
identity_client = self.app.client_manager.identity
537548
compute_client = self.app.client_manager.compute
538549
volume_client = self.app.client_manager.volume
550+
539551
compute_kwargs = {}
540552
for k, v in COMPUTE_QUOTAS.items():
541553
value = getattr(parsed_args, k, None)
@@ -581,15 +593,15 @@ def take_action(self, parsed_args):
581593
if value is not None:
582594
compute_kwargs[k] = value
583595

584-
if parsed_args.quota_class:
596+
if parsed_args.quota_class or parsed_args.default:
585597
if compute_kwargs:
586598
compute_client.quota_classes.update(
587-
parsed_args.project,
599+
parsed_args.project or 'default',
588600
**compute_kwargs,
589601
)
590602
if volume_kwargs:
591603
volume_client.quota_classes.update(
592-
parsed_args.project,
604+
parsed_args.project or 'default',
593605
**volume_kwargs,
594606
)
595607
if network_kwargs:
@@ -600,10 +612,8 @@ def take_action(self, parsed_args):
600612

601613
return
602614

603-
project = utils.find_resource(
604-
identity_client.projects,
605-
parsed_args.project,
606-
).id
615+
project_info = get_project(self.app, parsed_args.project)
616+
project = project_info['id']
607617

608618
if compute_kwargs:
609619
compute_client.quotas.update(project, **compute_kwargs)

openstackclient/tests/unit/common/test_quota.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,89 @@ def test_quota_set_with_class(self):
788788
self.assertNotCalled(self.network_client.update_quota)
789789
self.assertIsNone(result)
790790

791+
def test_quota_set_default(self):
792+
arglist = [
793+
'--injected-files',
794+
str(compute_fakes.injected_file_num),
795+
'--injected-file-size',
796+
str(compute_fakes.injected_file_size_num),
797+
'--injected-path-size',
798+
str(compute_fakes.injected_path_size_num),
799+
'--key-pairs',
800+
str(compute_fakes.key_pair_num),
801+
'--cores',
802+
str(compute_fakes.core_num),
803+
'--ram',
804+
str(compute_fakes.ram_num),
805+
'--instances',
806+
str(compute_fakes.instance_num),
807+
'--properties',
808+
str(compute_fakes.property_num),
809+
'--server-groups',
810+
str(compute_fakes.servgroup_num),
811+
'--server-group-members',
812+
str(compute_fakes.servgroup_members_num),
813+
'--gigabytes',
814+
str(compute_fakes.floating_ip_num),
815+
'--snapshots',
816+
str(compute_fakes.fix_ip_num),
817+
'--volumes',
818+
str(volume_fakes.QUOTA['volumes']),
819+
'--network',
820+
str(network_fakes.QUOTA['network']),
821+
'--default',
822+
]
823+
verifylist = [
824+
('injected_files', compute_fakes.injected_file_num),
825+
(
826+
'injected_file_content_bytes',
827+
compute_fakes.injected_file_size_num,
828+
),
829+
('injected_file_path_bytes', compute_fakes.injected_path_size_num),
830+
('key_pairs', compute_fakes.key_pair_num),
831+
('cores', compute_fakes.core_num),
832+
('ram', compute_fakes.ram_num),
833+
('instances', compute_fakes.instance_num),
834+
('metadata_items', compute_fakes.property_num),
835+
('server_groups', compute_fakes.servgroup_num),
836+
('server_group_members', compute_fakes.servgroup_members_num),
837+
('gigabytes', compute_fakes.floating_ip_num),
838+
('snapshots', compute_fakes.fix_ip_num),
839+
('volumes', volume_fakes.QUOTA['volumes']),
840+
('network', network_fakes.QUOTA['network']),
841+
('default', True),
842+
]
843+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
844+
845+
result = self.cmd.take_action(parsed_args)
846+
847+
kwargs_compute = {
848+
'injected_files': compute_fakes.injected_file_num,
849+
'injected_file_content_bytes': compute_fakes.injected_file_size_num, # noqa: E501
850+
'injected_file_path_bytes': compute_fakes.injected_path_size_num,
851+
'key_pairs': compute_fakes.key_pair_num,
852+
'cores': compute_fakes.core_num,
853+
'ram': compute_fakes.ram_num,
854+
'instances': compute_fakes.instance_num,
855+
'metadata_items': compute_fakes.property_num,
856+
'server_groups': compute_fakes.servgroup_num,
857+
'server_group_members': compute_fakes.servgroup_members_num,
858+
}
859+
kwargs_volume = {
860+
'gigabytes': compute_fakes.floating_ip_num,
861+
'snapshots': compute_fakes.fix_ip_num,
862+
'volumes': volume_fakes.QUOTA['volumes'],
863+
}
864+
865+
self.compute_quotas_class_mock.update.assert_called_with(
866+
'default', **kwargs_compute
867+
)
868+
self.volume_quotas_class_mock.update.assert_called_with(
869+
'default', **kwargs_volume
870+
)
871+
self.assertNotCalled(self.network_client.update_quota)
872+
self.assertIsNone(result)
873+
791874
def test_quota_set_with_force(self):
792875
arglist = [
793876
'--cores',
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
features:
3+
- |
4+
The ``quota set`` command now supports a ``--default`` option. When
5+
provided, this will allow you to set quotas for the default quota class
6+
which is the only quota class supported by the Compute and Block Storage
7+
services. This replaces the deprecated ``quota set --class`` option.

0 commit comments

Comments
 (0)