Skip to content

Commit db4a8b4

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "common: Replace remaining use of keystoneclient"
2 parents f6bb0db + 6617650 commit db4a8b4

5 files changed

Lines changed: 80 additions & 101 deletions

File tree

openstackclient/common/extension.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from collections.abc import Iterable, Sequence
2121
from typing import Any
2222

23+
from openstack.identity import v2 as identity_v2
2324
from osc_lib import utils
2425

2526
from openstackclient import command
@@ -55,7 +56,9 @@ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5556
'--identity',
5657
action='store_true',
5758
default=False,
58-
help=_('List extensions for the Identity API'),
59+
help=_(
60+
'List extensions for the Identity API (only supported by v2)'
61+
),
5962
)
6063
parser.add_argument(
6164
'--network',
@@ -84,7 +87,7 @@ def take_action(
8487
if parsed_args.long:
8588
columns += ('Namespace', 'Updated At', 'Links')
8689

87-
data = []
90+
data: list[Any] = []
8891

8992
# by default we want to show everything, unless the
9093
# user specifies one or more of the APIs to show
@@ -97,12 +100,16 @@ def take_action(
97100
)
98101

99102
if parsed_args.identity or show_all:
100-
identity_client = self.app.client_manager.identity
101-
try:
102-
data += identity_client.extensions.list()
103-
except Exception:
104-
message = _("Extensions list not supported by Identity API")
105-
LOG.warning(message)
103+
identity_client = self.app.client_manager.sdk_connection.identity
104+
# only identity v2 support extensions
105+
if isinstance(identity_client, identity_v2.Proxy):
106+
try:
107+
data += identity_client.extensions()
108+
except Exception:
109+
message = _(
110+
"Extensions list not supported by Identity API"
111+
)
112+
LOG.warning(message)
106113

107114
if parsed_args.compute or show_all:
108115
compute_client = self.app.client_manager.compute

openstackclient/common/limits.py

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from collections.abc import Iterable, Sequence
2121
from typing import Any
2222

23-
from osc_lib import utils
23+
from openstack import utils as sdk_utils
2424

2525
from openstackclient import command
2626
from openstackclient.i18n import _
@@ -93,13 +93,13 @@ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
9393
'(only valid with --absolute)'
9494
),
9595
)
96+
identity_common.add_project_domain_option_to_parser(parser)
97+
# deprecated alias for --project-domain
9698
parser.add_argument(
9799
'--domain',
98100
metavar='<domain>',
99-
help=_(
100-
'Domain the project belongs to (name or ID) '
101-
'(only valid with --absolute)'
102-
),
101+
dest='project_domain',
102+
help=argparse.SUPPRESS,
103103
)
104104
return parser
105105

@@ -108,20 +108,14 @@ def take_action(
108108
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
109109
project_id = None
110110
if parsed_args.project is not None:
111-
identity_client = self.app.client_manager.identity
112-
if parsed_args.domain is not None:
113-
domain = identity_common.find_domain(
114-
identity_client, parsed_args.domain
115-
)
116-
project_id = utils.find_resource(
117-
identity_client.projects,
118-
parsed_args.project,
119-
domain_id=domain.id,
120-
).id
121-
else:
122-
project_id = utils.find_resource(
123-
identity_client.projects, parsed_args.project
124-
).id
111+
identity_client = sdk_utils.ensure_service_version(
112+
self.app.client_manager.sdk_connection.identity, '3'
113+
)
114+
project_id = identity_common.find_project_id_sdk(
115+
identity_client,
116+
parsed_args.project,
117+
parsed_args.project_domain,
118+
)
125119

126120
compute_limits = None
127121
volume_limits = None

openstackclient/tests/unit/common/test_extension.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
# License for the specific language governing permissions and limitations
1111
# under the License.
1212

13+
from openstack.identity.v2 import extension as _extension
14+
from openstack.test import fakes as sdk_fakes
1315

1416
from openstackclient.common import extension
1517
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
@@ -41,14 +43,14 @@ class TestExtensionList(TestExtension):
4143
)
4244

4345
volume_extension = volume_fakes.create_one_extension()
44-
identity_extension = identity_fakes.FakeExtension.create_one_extension()
46+
identity_extension = sdk_fakes.generate_fake_resource(_extension.Extension)
4547
compute_extension = compute_fakes.create_one_extension()
4648
network_extension = network_fakes.create_one_extension()
4749

4850
def setUp(self):
4951
super().setUp()
5052

51-
self.identity_client.extensions.list.return_value = [
53+
self.identity_sdk_client.extensions.return_value = [
5254
self.identity_extension
5355
]
5456
self.compute_client.extensions.return_value = [self.compute_extension]
@@ -102,7 +104,7 @@ def test_extension_list_no_options(self):
102104
),
103105
)
104106
self._test_extension_list_helper(arglist, verifylist, datalist)
105-
self.identity_client.extensions.list.assert_called_with()
107+
self.identity_sdk_client.extensions.assert_called_with()
106108
self.compute_client.extensions.assert_called_with()
107109
self.volume_sdk_client.extensions.assert_called_with()
108110
self.network_client.extensions.assert_called_with()
@@ -120,7 +122,7 @@ def test_extension_list_long(self):
120122
self.identity_extension.alias,
121123
self.identity_extension.description,
122124
self.identity_extension.namespace,
123-
'',
125+
self.identity_extension.updated_at,
124126
self.identity_extension.links,
125127
),
126128
(
@@ -149,7 +151,7 @@ def test_extension_list_long(self):
149151
),
150152
)
151153
self._test_extension_list_helper(arglist, verifylist, datalist, True)
152-
self.identity_client.extensions.list.assert_called_with()
154+
self.identity_sdk_client.extensions.assert_called_with()
153155
self.compute_client.extensions.assert_called_with()
154156
self.volume_sdk_client.extensions.assert_called_with()
155157
self.network_client.extensions.assert_called_with()
@@ -169,7 +171,7 @@ def test_extension_list_identity(self):
169171
),
170172
)
171173
self._test_extension_list_helper(arglist, verifylist, datalist)
172-
self.identity_client.extensions.list.assert_called_with()
174+
self.identity_sdk_client.extensions.assert_called_with()
173175

174176
def test_extension_list_network(self):
175177
arglist = [

openstackclient/tests/unit/common/test_project_cleanup.py

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212

1313
from unittest import mock
1414

15+
from openstack.identity.v3 import project as _project
16+
from openstack.test import fakes as sdk_fakes
17+
1518
from openstackclient.common import project_cleanup
1619
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
1720
from openstackclient.tests.unit import utils as test_utils
@@ -20,25 +23,13 @@
2023
class TestProjectCleanup(
2124
identity_fakes.FakeClientMixin, test_utils.TestCommand
2225
):
23-
project = identity_fakes.FakeProject.create_one_project()
24-
2526
def setUp(self):
2627
super().setUp()
2728
self.cmd = project_cleanup.ProjectCleanup(self.app, None)
2829

29-
self.project_cleanup_mock = mock.Mock()
30-
self.sdk_connect_as_project_mock = mock.Mock(
31-
return_value=self.app.client_manager.sdk_connection
32-
)
33-
self.app.client_manager.sdk_connection.project_cleanup = (
34-
self.project_cleanup_mock
35-
)
36-
self.app.client_manager.sdk_connection.identity.find_project = (
37-
mock.Mock(return_value=self.project)
38-
)
39-
self.app.client_manager.sdk_connection.connect_as_project = (
40-
self.sdk_connect_as_project_mock
41-
)
30+
self.project = sdk_fakes.generate_fake_resource(_project.Project)
31+
self.identity_sdk_client.find_project.return_value = self.project
32+
self.app.client_manager.sdk_connection.connect_as_project.return_value = self.app.client_manager.sdk_connection
4233

4334
def test_project_no_options(self):
4435
arglist = []
@@ -74,7 +65,9 @@ def test_project_cleanup_with_filters(self):
7465
with mock.patch('getpass.getpass', return_value='y'):
7566
result = self.cmd.take_action(parsed_args)
7667

77-
self.sdk_connect_as_project_mock.assert_called_with(self.project)
68+
self.app.client_manager.sdk_connection.connect_as_project.assert_called_with(
69+
self.project
70+
)
7871
filters = {'created_at': '2200-01-01', 'updated_at': '2200-01-02'}
7972

8073
calls = [
@@ -91,7 +84,9 @@ def test_project_cleanup_with_filters(self):
9184
skip_resources=None,
9285
),
9386
]
94-
self.project_cleanup_mock.assert_has_calls(calls)
87+
self.app.client_manager.sdk_connection.project_cleanup.assert_has_calls(
88+
calls
89+
)
9590

9691
self.assertIsNone(result)
9792

@@ -112,7 +107,9 @@ def test_project_cleanup_with_auto_approve(self):
112107

113108
result = self.cmd.take_action(parsed_args)
114109

115-
self.sdk_connect_as_project_mock.assert_called_with(self.project)
110+
self.app.client_manager.sdk_connection.connect_as_project.assert_called_with(
111+
self.project
112+
)
116113
calls = [
117114
mock.call(
118115
dry_run=True,
@@ -127,7 +124,9 @@ def test_project_cleanup_with_auto_approve(self):
127124
skip_resources=None,
128125
),
129126
]
130-
self.project_cleanup_mock.assert_has_calls(calls)
127+
self.app.client_manager.sdk_connection.project_cleanup.assert_has_calls(
128+
calls
129+
)
131130

132131
self.assertIsNone(result)
133132

@@ -147,7 +146,9 @@ def test_project_cleanup_with_project(self):
147146
with mock.patch('getpass.getpass', return_value='y'):
148147
result = self.cmd.take_action(parsed_args)
149148

150-
self.sdk_connect_as_project_mock.assert_called_with(self.project)
149+
self.app.client_manager.sdk_connection.connect_as_project.assert_called_with(
150+
self.project
151+
)
151152
calls = [
152153
mock.call(
153154
dry_run=True,
@@ -162,7 +163,9 @@ def test_project_cleanup_with_project(self):
162163
skip_resources=None,
163164
),
164165
]
165-
self.project_cleanup_mock.assert_has_calls(calls)
166+
self.app.client_manager.sdk_connection.project_cleanup.assert_has_calls(
167+
calls
168+
)
166169

167170
self.assertIsNone(result)
168171

@@ -182,7 +185,9 @@ def test_project_cleanup_with_project_abort(self):
182185
with mock.patch('getpass.getpass', return_value='y'):
183186
result = self.cmd.take_action(parsed_args)
184187

185-
self.sdk_connect_as_project_mock.assert_called_with(self.project)
188+
self.app.client_manager.sdk_connection.connect_as_project.assert_called_with(
189+
self.project
190+
)
186191
calls = [
187192
mock.call(
188193
dry_run=True,
@@ -191,7 +196,9 @@ def test_project_cleanup_with_project_abort(self):
191196
skip_resources=None,
192197
),
193198
]
194-
self.project_cleanup_mock.assert_has_calls(calls)
199+
self.app.client_manager.sdk_connection.project_cleanup.assert_has_calls(
200+
calls
201+
)
195202

196203
self.assertIsNone(result)
197204

@@ -211,8 +218,10 @@ def test_project_cleanup_with_dry_run(self):
211218

212219
result = self.cmd.take_action(parsed_args)
213220

214-
self.sdk_connect_as_project_mock.assert_called_with(self.project)
215-
self.project_cleanup_mock.assert_called_once_with(
221+
self.app.client_manager.sdk_connection.connect_as_project.assert_called_with(
222+
self.project
223+
)
224+
self.app.client_manager.sdk_connection.project_cleanup.assert_called_once_with(
216225
dry_run=True,
217226
status_queue=mock.ANY,
218227
filters={},
@@ -238,7 +247,7 @@ def test_project_cleanup_with_auth_project(self):
238247
with mock.patch('getpass.getpass', return_value='y'):
239248
result = self.cmd.take_action(parsed_args)
240249

241-
self.sdk_connect_as_project_mock.assert_not_called()
250+
self.app.client_manager.sdk_connection.connect_as_project.assert_not_called()
242251
calls = [
243252
mock.call(
244253
dry_run=True,
@@ -253,7 +262,9 @@ def test_project_cleanup_with_auth_project(self):
253262
skip_resources=None,
254263
),
255264
]
256-
self.project_cleanup_mock.assert_has_calls(calls)
265+
self.app.client_manager.sdk_connection.project_cleanup.assert_has_calls(
266+
calls
267+
)
257268

258269
self.assertIsNone(result)
259270

@@ -272,7 +283,9 @@ def test_project_cleanup_with_skip_resource(self):
272283
with mock.patch('getpass.getpass', return_value='y'):
273284
result = self.cmd.take_action(parsed_args)
274285

275-
self.sdk_connect_as_project_mock.assert_called_with(self.project)
286+
self.app.client_manager.sdk_connection.connect_as_project.assert_called_with(
287+
self.project
288+
)
276289

277290
calls = [
278291
mock.call(
@@ -288,6 +301,8 @@ def test_project_cleanup_with_skip_resource(self):
288301
skip_resources=[skip_resource],
289302
),
290303
]
291-
self.project_cleanup_mock.assert_has_calls(calls)
304+
self.app.client_manager.sdk_connection.project_cleanup.assert_has_calls(
305+
calls
306+
)
292307

293308
self.assertIsNone(result)

openstackclient/tests/unit/identity/v2_0/fakes.py

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -206,45 +206,6 @@ class TestIdentity(
206206
): ...
207207

208208

209-
class FakeExtension:
210-
"""Fake one or more extension."""
211-
212-
@staticmethod
213-
def create_one_extension(attrs=None):
214-
"""Create a fake extension.
215-
216-
:param Dictionary attrs:
217-
A dictionary with all attributes
218-
:return:
219-
A FakeResource object with name, namespace, etc.
220-
"""
221-
attrs = attrs or {}
222-
223-
# Set default attributes.
224-
extension_info = {
225-
'name': 'name-' + uuid.uuid4().hex,
226-
'namespace': (
227-
'http://docs.openstack.org/identity/api/ext/OS-KSCRUD/v1.0'
228-
),
229-
'description': 'description-' + uuid.uuid4().hex,
230-
'updated': '2013-07-07T12:00:0-00:00',
231-
'alias': 'OS-KSCRUD',
232-
'links': (
233-
'[{"href":'
234-
'"https://github.com/openstack/identity-api", "type":'
235-
' "text/html", "rel": "describedby"}]'
236-
),
237-
}
238-
239-
# Overwrite default attributes.
240-
extension_info.update(attrs)
241-
242-
extension = fakes.FakeResource(
243-
info=copy.deepcopy(extension_info), loaded=True
244-
)
245-
return extension
246-
247-
248209
class FakeCatalog:
249210
"""Fake one or more catalog."""
250211

0 commit comments

Comments
 (0)