Identity: Add --project-domain option for limits

Change-Id: Ia0930c8dbd3325e0eeadf91716e7dfaabbfd1978
Signed-off-by: 0weng <oweng@osuosl.org>
This commit is contained in:
0weng
2026-01-13 15:28:42 -08:00
parent 85e731df47
commit ea1f8134c2
4 changed files with 76 additions and 8 deletions

View File

@@ -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='<service>',
@@ -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='<project>',
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:

View File

@@ -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()

View File

@@ -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),

View File

@@ -0,0 +1,5 @@
---
features:
- |
Add ``--project-domain`` option for the ``limit list`` and ``limit create``
commands.