diff --git a/openstackclient/common/quota.py b/openstackclient/common/quota.py index d412e05cfd..abbbe3cdb0 100644 --- a/openstackclient/common/quota.py +++ b/openstackclient/common/quota.py @@ -461,10 +461,15 @@ class SetQuota(common.NetDetectionMixin, command.Command): parser.add_argument( 'project', metavar='', - 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 '), + ) 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) diff --git a/openstackclient/tests/unit/common/test_quota.py b/openstackclient/tests/unit/common/test_quota.py index f18e917b2b..78c84e163c 100644 --- a/openstackclient/tests/unit/common/test_quota.py +++ b/openstackclient/tests/unit/common/test_quota.py @@ -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', diff --git a/releasenotes/notes/quota-set-default-option-bc26d37dc150533b.yaml b/releasenotes/notes/quota-set-default-option-bc26d37dc150533b.yaml new file mode 100644 index 0000000000..d3ba34d652 --- /dev/null +++ b/releasenotes/notes/quota-set-default-option-bc26d37dc150533b.yaml @@ -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.