From ea1f8134c2f08749756044014299bf9ba12cc1f8 Mon Sep 17 00:00:00 2001 From: 0weng Date: Tue, 13 Jan 2026 15:28:42 -0800 Subject: [PATCH] Identity: Add --project-domain option for limits Change-Id: Ia0930c8dbd3325e0eeadf91716e7dfaabbfd1978 Signed-off-by: 0weng --- openstackclient/identity/v3/limit.py | 22 ++++++--- .../functional/identity/v3/test_limit.py | 47 +++++++++++++++++++ .../tests/unit/identity/v3/test_limit.py | 10 +++- ...roject-domain-option-84bfbb0e30e21b73.yaml | 5 ++ 4 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/limits-project-domain-option-84bfbb0e30e21b73.yaml diff --git a/openstackclient/identity/v3/limit.py b/openstackclient/identity/v3/limit.py index 4671c5acb7..94f6bcaf03 100644 --- a/openstackclient/identity/v3/limit.py +++ b/openstackclient/identity/v3/limit.py @@ -68,6 +68,7 @@ class CreateLimit(command.ShowOne): required=True, help=_('Project to associate the resource limit to'), ) + common_utils.add_project_domain_option_to_parser(parser) parser.add_argument( '--service', metavar='', @@ -98,12 +99,12 @@ class CreateLimit(command.ShowOne): if parsed_args.description: kwargs["description"] = parsed_args.description - # TODO(0weng): Add --project-domain option - # to support filtering project domain - kwargs["project_id"] = common_utils._find_sdk_id( - identity_client.find_project, - name_or_id=parsed_args.project, + kwargs["project_id"] = common_utils.find_project_id_sdk( + identity_client, + parsed_args.project, + domain_name_or_id=parsed_args.project_domain, ) + kwargs["service_id"] = common_utils.find_service_sdk( identity_client, parsed_args.service ).id @@ -144,6 +145,8 @@ class ListLimit(command.Lister): metavar='', help=_('List resource limits associated with project'), ) + common_utils.add_project_domain_option_to_parser(parser) + return parser def take_action(self, parsed_args): @@ -160,12 +163,17 @@ class ListLimit(command.Lister): parsed_args.region ).id - # TODO(0weng): Add --project-domain option - # to support filtering project domain if parsed_args.project: + project_domain_id = None + if parsed_args.project_domain: + project_domain_id = common_utils.find_domain_id_sdk( + identity_client, parsed_args.project_domain + ) + kwargs["project_id"] = common_utils._find_sdk_id( identity_client.find_project, name_or_id=parsed_args.project, + domain_id=project_domain_id, ) if parsed_args.resource_name: diff --git a/openstackclient/tests/functional/identity/v3/test_limit.py b/openstackclient/tests/functional/identity/v3/test_limit.py index 8c0bbcd6a9..497d33a9c3 100644 --- a/openstackclient/tests/functional/identity/v3/test_limit.py +++ b/openstackclient/tests/functional/identity/v3/test_limit.py @@ -100,6 +100,53 @@ class LimitTestCase(common.IdentityTests): self.assert_show_fields(items, self.LIMIT_FIELDS) registered_limit_id = self._create_dummy_registered_limit() + def test_limit_create_with_project_domain(self): + registered_limit_id = self._create_dummy_registered_limit() + raw_output = self.openstack( + f'registered limit show {registered_limit_id}', + cloud=SYSTEM_CLOUD, + ) + items = self.parse_show(raw_output) + service_id = self._extract_value_from_items('service_id', items) + resource_name = self._extract_value_from_items('resource_name', items) + + raw_output = self.openstack(f'service show {service_id}') + items = self.parse_show(raw_output) + service_name = self._extract_value_from_items('name', items) + + project_name = self._create_dummy_project() + raw_output = self.openstack( + f'project show {project_name}', + cloud=SYSTEM_CLOUD, + ) + items = self.parse_show(raw_output) + domain_id = self._extract_value_from_items('domain_id', items) + + params = { + 'project_name': project_name, + 'project_domain': domain_id, + 'service_name': service_name, + 'resource_name': resource_name, + 'resource_limit': 15, + } + raw_output = self.openstack( + 'limit create' + ' --project {project_name}' + ' --project-domain {project_domain}' + ' --service {service_name}' + ' --resource-limit {resource_limit}' + ' {resource_name}'.format(**params), + cloud=SYSTEM_CLOUD, + ) + items = self.parse_show(raw_output) + limit_id = self._extract_value_from_items('id', items) + self.addCleanup( + self.openstack, f'limit delete {limit_id}', cloud=SYSTEM_CLOUD + ) + + self.assert_show_fields(items, self.LIMIT_FIELDS) + registered_limit_id = self._create_dummy_registered_limit() + def test_limit_create_with_service_id(self): self._create_dummy_limit() diff --git a/openstackclient/tests/unit/identity/v3/test_limit.py b/openstackclient/tests/unit/identity/v3/test_limit.py index a0c045e663..4c2184c2aa 100644 --- a/openstackclient/tests/unit/identity/v3/test_limit.py +++ b/openstackclient/tests/unit/identity/v3/test_limit.py @@ -11,6 +11,7 @@ # under the License. from openstack import exceptions as sdk_exc +from openstack.identity.v3 import domain as _domain from openstack.identity.v3 import limit as _limit from openstack.identity.v3 import project as _project from openstack.identity.v3 import region as _region @@ -26,7 +27,10 @@ class TestLimitCreate(identity_fakes.TestIdentityv3): def setUp(self): super().setUp() - self.project = sdk_fakes.generate_fake_resource(_project.Project) + self.domain = sdk_fakes.generate_fake_resource(_domain.Domain) + self.project = sdk_fakes.generate_fake_resource( + _project.Project, domain_id=self.domain.id + ) self.region = sdk_fakes.generate_fake_resource(_region.Region) self.service = sdk_fakes.generate_fake_resource(_service.Service) @@ -35,6 +39,7 @@ class TestLimitCreate(identity_fakes.TestIdentityv3): self.identity_sdk_client.find_service.return_value = self.service self.identity_sdk_client.get_region.return_value = self.region self.identity_sdk_client.find_project.return_value = self.project + self.identity_sdk_client.find_domain.return_value = self.domain self.limit = sdk_fakes.generate_fake_resource( resource_type=_limit.Limit, @@ -116,6 +121,8 @@ class TestLimitCreate(identity_fakes.TestIdentityv3): arglist = [ '--project', self.project.id, + '--project-domain', + self.domain.name, '--service', self.service.id, '--resource-limit', @@ -128,6 +135,7 @@ class TestLimitCreate(identity_fakes.TestIdentityv3): ] verifylist = [ ('project', self.project.id), + ('project_domain', self.domain.name), ('service', self.service.id), ('resource_name', self.limit_with_options.resource_name), ('resource_limit', resource_limit), diff --git a/releasenotes/notes/limits-project-domain-option-84bfbb0e30e21b73.yaml b/releasenotes/notes/limits-project-domain-option-84bfbb0e30e21b73.yaml new file mode 100644 index 0000000000..ab9468022c --- /dev/null +++ b/releasenotes/notes/limits-project-domain-option-84bfbb0e30e21b73.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Add ``--project-domain`` option for the ``limit list`` and ``limit create`` + commands.