Skip to content

Commit bc60e3b

Browse files
committed
Fix "access rule" commands to only use ID
This patch modifies the access rule commands to use only the resource ID. The previous logic incorrectly assumed that access rules have a "name" property, which resulted in unexpected behaviors. For example, "access rule delete {non-existent-id}" now results in a "not found" error instead of sometimes deleting an unrelated rule. Story: 2010775 Task: 48163 Change-Id: Ib5c3b7f86acf1dfe7cc76dfa99fa4c118388bd71
1 parent f3a51b0 commit bc60e3b

File tree

4 files changed

+34
-18
lines changed

4 files changed

+34
-18
lines changed

openstackclient/identity/common.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,18 @@ def get_resource(manager, name_type_or_id):
9292
raise exceptions.CommandError(msg % name_type_or_id)
9393

9494

95+
def get_resource_by_id(manager, resource_id):
96+
"""Get resource by ID
97+
98+
Raises CommandError if the resource is not found
99+
"""
100+
try:
101+
return manager.get(resource_id)
102+
except identity_exc.NotFound:
103+
msg = _("Resource with id {} not found")
104+
raise exceptions.CommandError(msg.format(resource_id))
105+
106+
95107
def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
96108
"""Peek into the user's auth token to get resource IDs
97109

openstackclient/identity/v3/access_rule.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def get_parser(self, prog_name):
3737
'access_rule',
3838
metavar='<access-rule>',
3939
nargs="+",
40-
help=_('Access rule(s) to delete (name or ID)'),
40+
help=_('Access rule ID(s) to delete'),
4141
)
4242
return parser
4343

@@ -47,7 +47,7 @@ def take_action(self, parsed_args):
4747
errors = 0
4848
for ac in parsed_args.access_rule:
4949
try:
50-
access_rule = utils.find_resource(
50+
access_rule = common.get_resource_by_id(
5151
identity_client.access_rules, ac
5252
)
5353
identity_client.access_rules.delete(access_rule.id)
@@ -114,13 +114,13 @@ def get_parser(self, prog_name):
114114
parser.add_argument(
115115
'access_rule',
116116
metavar='<access-rule>',
117-
help=_('Access rule to display (name or ID)'),
117+
help=_('Access rule ID to display'),
118118
)
119119
return parser
120120

121121
def take_action(self, parsed_args):
122122
identity_client = self.app.client_manager.identity
123-
access_rule = utils.find_resource(
123+
access_rule = common.get_resource_by_id(
124124
identity_client.access_rules, parsed_args.access_rule
125125
)
126126

openstackclient/tests/unit/identity/v3/test_access_rule.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@
1414
#
1515

1616
import copy
17-
from unittest import mock
1817

18+
from keystoneclient import exceptions as identity_exc
1919
from osc_lib import exceptions
20-
from osc_lib import utils
2120

2221
from openstackclient.identity.v3 import access_rule
2322
from openstackclient.tests.unit import fakes
@@ -64,11 +63,12 @@ def test_access_rule_delete(self):
6463
)
6564
self.assertIsNone(result)
6665

67-
@mock.patch.object(utils, 'find_resource')
68-
def test_delete_multi_access_rules_with_exception(self, find_mock):
69-
find_mock.side_effect = [
70-
self.access_rules_mock.get.return_value,
71-
exceptions.CommandError,
66+
def test_delete_multi_access_rules_with_exception(self):
67+
# mock returns for common.get_resource_by_id
68+
mock_get = self.access_rules_mock.get
69+
mock_get.side_effect = [
70+
mock_get.return_value,
71+
identity_exc.NotFound,
7272
]
7373
arglist = [
7474
identity_fakes.access_rule_id,
@@ -87,14 +87,10 @@ def test_delete_multi_access_rules_with_exception(self, find_mock):
8787
'1 of 2 access rules failed to' ' delete.', str(e)
8888
)
8989

90-
find_mock.assert_any_call(
91-
self.access_rules_mock, identity_fakes.access_rule_id
92-
)
93-
find_mock.assert_any_call(
94-
self.access_rules_mock, 'nonexistent_access_rule'
95-
)
90+
mock_get.assert_any_call(identity_fakes.access_rule_id)
91+
mock_get.assert_any_call('nonexistent_access_rule')
9692

97-
self.assertEqual(2, find_mock.call_count)
93+
self.assertEqual(2, mock_get.call_count)
9894
self.access_rules_mock.delete.assert_called_once_with(
9995
identity_fakes.access_rule_id
10096
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed a bug in "access rule" subcommands where the client logic incorrectly
5+
assumed that access rules have a "name" property which resulted in
6+
unpredictable behaviors. e.g. "access rule delete {non-existent-id}" now
7+
results in a not-found error instead of sometimes deleting an unrelated
8+
rule.

0 commit comments

Comments
 (0)