Skip to content

Commit 437914a

Browse files
committed
typing: Fix for typed openstacksdk proxies
openstacksdk 4.11.0 add hints for various proxy attributes of the Connection object. Since some services provided multiple proxy implementations for different API major versions and since these are runtime configurable, we need to add runtime assertions to verify the version of a given proxy that is in use. This is achieved using the new `openstack.utils.ensure_service_version` helper in places where the called method is potentially confusing. Note that fixing a few small issues where we were passing parameters to SDK that were not supported. All are fixed here to keep mypy happy. Also note that we change the types passed to some `get_user_id` calls from the identity proxy to session. These should not be necessary since the call is clearly happy with an adapter as well as a session, but it's not harm and avoids changes to keystoneauth so... Change-Id: I535f10f1165fc4c0e2e21be066380290875ea489 Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
1 parent 177a6b3 commit 437914a

35 files changed

Lines changed: 409 additions & 150 deletions

openstackclient/common/availability_zone.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import logging
1818

1919
from openstack import exceptions as sdk_exceptions
20+
from openstack import utils as sdk_utils
2021
from osc_lib import utils
2122

2223
from openstackclient import command
@@ -132,7 +133,9 @@ def _get_compute_availability_zones(self, parsed_args):
132133
return result
133134

134135
def _get_volume_availability_zones(self, parsed_args):
135-
volume_client = self.app.client_manager.sdk_connection.volume
136+
volume_client = sdk_utils.ensure_service_version(
137+
self.app.client_manager.sdk_connection.volume, '3'
138+
)
136139
data = []
137140
try:
138141
data = list(volume_client.availability_zones())

openstackclient/common/project_cleanup.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import typing as ty
2121

2222
from cliff.formatters import table
23+
from openstack import utils as sdk_utils
2324

2425
from openstackclient import command
2526
from openstackclient.i18n import _
@@ -97,7 +98,10 @@ def take_action(self, parsed_args):
9798
# as-is
9899
pass
99100
elif parsed_args.project:
100-
project = connection.identity.find_project(
101+
identity_client = sdk_utils.ensure_service_version(
102+
connection.identity, '3'
103+
)
104+
project = identity_client.find_project(
101105
name_or_id=parsed_args.project, ignore_missing=False
102106
)
103107
connection = connection.connect_as_project(project)

openstackclient/common/quota.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import typing as ty
2222

2323
from openstack import exceptions as sdk_exceptions
24+
from openstack import utils as sdk_utils
2425
from osc_lib import exceptions
2526
from osc_lib import utils
2627

@@ -106,7 +107,9 @@ def _xform_get_quota(data, value, keys):
106107

107108
def get_project(app, project):
108109
if project is not None:
109-
identity_client = app.client_manager.sdk_connection.identity
110+
identity_client = sdk_utils.ensure_service_version(
111+
app.client_manager.sdk_connection.identity, '3'
112+
)
110113
project = identity_client.find_project(project, ignore_missing=False)
111114
project_id = project.id
112115
project_name = project.name
@@ -448,10 +451,11 @@ def _list_quota_network(self, parsed_args, project_ids):
448451
)
449452

450453
def take_action(self, parsed_args):
451-
project_ids = [
452-
p.id
453-
for p in self.app.client_manager.sdk_connection.identity.projects()
454-
]
454+
identity_client = sdk_utils.ensure_service_version(
455+
self.app.client_manager.sdk_connection.identity, '3'
456+
)
457+
458+
project_ids = [p.id for p in identity_client.projects()]
455459
if parsed_args.compute:
456460
return self._list_quota_compute(parsed_args, project_ids)
457461
elif parsed_args.volume:
@@ -923,7 +927,10 @@ def get_parser(self, prog_name):
923927
return parser
924928

925929
def take_action(self, parsed_args):
926-
identity_client = self.app.client_manager.sdk_connection.identity
930+
identity_client = sdk_utils.ensure_service_version(
931+
self.app.client_manager.sdk_connection.identity, '3'
932+
)
933+
927934
project = identity_client.find_project(
928935
parsed_args.project, ignore_missing=False
929936
)

openstackclient/compute/v2/keypair.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,9 @@ def get_parser(self, prog_name):
300300
def take_action(self, parsed_args):
301301
compute_client = self.app.client_manager.compute
302302
identity_client = self.app.client_manager.identity
303-
identity_sdk_client = self.app.client_manager.sdk_connection.identity
303+
identity_sdk_client = sdk_utils.ensure_service_version(
304+
self.app.client_manager.sdk_connection.identity, '3'
305+
)
304306

305307
kwargs = {}
306308

openstackclient/identity/v3/access_rule.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import logging
1919

20+
from openstack import utils as sdk_utils
2021
from osc_lib import exceptions
2122
from osc_lib import utils
2223

@@ -42,13 +43,15 @@ def get_parser(self, prog_name):
4243
return parser
4344

4445
def take_action(self, parsed_args):
45-
identity_client = self.app.client_manager.sdk_connection.identity
46+
identity_client = sdk_utils.ensure_service_version(
47+
self.app.client_manager.sdk_connection.identity, '3'
48+
)
4649
conn = self.app.client_manager.sdk_connection
4750
auth = conn.config.get_auth()
4851
if auth is None:
4952
# this will never happen
5053
raise exceptions.CommandError('invalid authentication info')
51-
user_id = auth.get_user_id(conn.identity)
54+
user_id = auth.get_user_id(conn.session)
5255

5356
errors = 0
5457
for ac in parsed_args.access_rule:
@@ -84,7 +87,9 @@ def get_parser(self, prog_name):
8487
return parser
8588

8689
def take_action(self, parsed_args):
87-
identity_client = self.app.client_manager.sdk_connection.identity
90+
identity_client = sdk_utils.ensure_service_version(
91+
self.app.client_manager.sdk_connection.identity, '3'
92+
)
8893
if parsed_args.user:
8994
user_id = common.find_user(
9095
identity_client, parsed_args.user, parsed_args.user_domain
@@ -95,7 +100,7 @@ def take_action(self, parsed_args):
95100
if auth is None:
96101
# this will never happen
97102
raise exceptions.CommandError('invalid authentication info')
98-
user_id = auth.get_user_id(conn.identity)
103+
user_id = auth.get_user_id(conn.session)
99104

100105
columns = ('ID', 'Service', 'Method', 'Path')
101106
data = identity_client.access_rules(user=user_id)
@@ -125,13 +130,15 @@ def get_parser(self, prog_name):
125130
return parser
126131

127132
def take_action(self, parsed_args):
128-
identity_client = self.app.client_manager.sdk_connection.identity
133+
identity_client = sdk_utils.ensure_service_version(
134+
self.app.client_manager.sdk_connection.identity, '3'
135+
)
129136
conn = self.app.client_manager.sdk_connection
130137
auth = conn.config.get_auth()
131138
if auth is None:
132139
# this will never happen
133140
raise exceptions.CommandError('invalid authentication info')
134-
user_id = auth.get_user_id(conn.identity)
141+
user_id = auth.get_user_id(conn.session)
135142

136143
access_rule = identity_client.get_access_rule(
137144
user_id, parsed_args.access_rule

openstackclient/identity/v3/application_credential.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import uuid
2323

2424
from cliff import columns as cliff_columns
25+
from openstack import utils as sdk_utils
2526
from osc_lib import exceptions
2627
from osc_lib import utils
2728

@@ -204,14 +205,16 @@ def get_parser(self, prog_name):
204205
return parser
205206

206207
def take_action(self, parsed_args):
207-
identity_client = self.app.client_manager.sdk_connection.identity
208+
identity_client = sdk_utils.ensure_service_version(
209+
self.app.client_manager.sdk_connection.identity, '3'
210+
)
208211
conn = self.app.client_manager.sdk_connection
209212
auth = conn.config.get_auth()
210213
if auth is None:
211214
# this will never happen
212215
raise exceptions.CommandError('invalid authentication info')
213216

214-
user_id = auth.get_user_id(conn.identity)
217+
user_id = auth.get_user_id(conn.session)
215218

216219
role_ids = []
217220
for role in parsed_args.roles:
@@ -277,14 +280,16 @@ def get_parser(self, prog_name):
277280
return parser
278281

279282
def take_action(self, parsed_args):
280-
identity_client = self.app.client_manager.sdk_connection.identity
283+
identity_client = sdk_utils.ensure_service_version(
284+
self.app.client_manager.sdk_connection.identity, '3'
285+
)
281286
conn = self.app.client_manager.sdk_connection
282287
auth = conn.config.get_auth()
283288
if auth is None:
284289
# this will never happen
285290
raise exceptions.CommandError('invalid authentication info')
286291

287-
user_id = auth.get_user_id(conn.identity)
292+
user_id = auth.get_user_id(conn.session)
288293

289294
errors = 0
290295
for ac in parsed_args.application_credential:
@@ -330,7 +335,9 @@ def get_parser(self, prog_name):
330335
return parser
331336

332337
def take_action(self, parsed_args):
333-
identity_client = self.app.client_manager.sdk_connection.identity
338+
identity_client = sdk_utils.ensure_service_version(
339+
self.app.client_manager.sdk_connection.identity, '3'
340+
)
334341
if parsed_args.user:
335342
user_id = common.find_user_id_sdk(
336343
identity_client, parsed_args.user, parsed_args.user_domain
@@ -341,7 +348,7 @@ def take_action(self, parsed_args):
341348
if auth is None:
342349
# this will never happen
343350
raise exceptions.CommandError('invalid authentication info')
344-
user_id = auth.get_user_id(conn.identity)
351+
user_id = auth.get_user_id(conn.session)
345352

346353
application_credentials = identity_client.application_credentials(
347354
user=user_id
@@ -363,13 +370,15 @@ def get_parser(self, prog_name):
363370
return parser
364371

365372
def take_action(self, parsed_args):
366-
identity_client = self.app.client_manager.sdk_connection.identity
373+
identity_client = sdk_utils.ensure_service_version(
374+
self.app.client_manager.sdk_connection.identity, '3'
375+
)
367376
conn = self.app.client_manager.sdk_connection
368377
auth = conn.config.get_auth()
369378
if auth is None:
370379
# this will never happen
371380
raise exceptions.CommandError('invalid authentication info')
372-
user_id = auth.get_user_id(conn.identity)
381+
user_id = auth.get_user_id(conn.session)
373382

374383
application_credential = identity_client.find_application_credential(
375384
user_id, parsed_args.application_credential, ignore_missing=False

openstackclient/identity/v3/credential.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import logging
1919

20+
from openstack import utils as sdk_utils
2021
from osc_lib import exceptions
2122
from osc_lib import utils
2223

@@ -76,7 +77,9 @@ def get_parser(self, prog_name):
7677
return parser
7778

7879
def take_action(self, parsed_args):
79-
identity_client = self.app.client_manager.sdk_connection.identity
80+
identity_client = sdk_utils.ensure_service_version(
81+
self.app.client_manager.sdk_connection.identity, '3'
82+
)
8083
user_id = identity_client.find_user(
8184
parsed_args.user, ignore_missing=False
8285
).id
@@ -110,7 +113,9 @@ def get_parser(self, prog_name):
110113
return parser
111114

112115
def take_action(self, parsed_args):
113-
identity_client = self.app.client_manager.sdk_connection.identity
116+
identity_client = sdk_utils.ensure_service_version(
117+
self.app.client_manager.sdk_connection.identity, '3'
118+
)
114119
result = 0
115120
for i in parsed_args.credential:
116121
try:
@@ -153,7 +158,9 @@ def get_parser(self, prog_name):
153158
return parser
154159

155160
def take_action(self, parsed_args):
156-
identity_client = self.app.client_manager.sdk_connection.identity
161+
identity_client = sdk_utils.ensure_service_version(
162+
self.app.client_manager.sdk_connection.identity, '3'
163+
)
157164

158165
kwargs = {}
159166
if parsed_args.user:
@@ -225,7 +232,9 @@ def get_parser(self, prog_name):
225232
return parser
226233

227234
def take_action(self, parsed_args):
228-
identity_client = self.app.client_manager.sdk_connection.identity
235+
identity_client = sdk_utils.ensure_service_version(
236+
self.app.client_manager.sdk_connection.identity, '3'
237+
)
229238

230239
user_id = identity_client.find_user(
231240
parsed_args.user, ignore_missing=False
@@ -260,7 +269,9 @@ def get_parser(self, prog_name):
260269
return parser
261270

262271
def take_action(self, parsed_args):
263-
identity_client = self.app.client_manager.sdk_connection.identity
272+
identity_client = sdk_utils.ensure_service_version(
273+
self.app.client_manager.sdk_connection.identity, '3'
274+
)
264275
credential = identity_client.get_credential(parsed_args.credential)
265276

266277
return _format_credential(credential)

openstackclient/identity/v3/domain.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import logging
1919

2020
from openstack import exceptions as sdk_exceptions
21+
from openstack import utils as sdk_utils
2122
from osc_lib import exceptions
2223
from osc_lib import utils
2324

@@ -92,7 +93,9 @@ def get_parser(self, prog_name):
9293
return parser
9394

9495
def take_action(self, parsed_args):
95-
identity_client = self.app.client_manager.sdk_connection.identity
96+
identity_client = sdk_utils.ensure_service_version(
97+
self.app.client_manager.sdk_connection.identity, '3'
98+
)
9699

97100
options = {}
98101
if parsed_args.immutable is not None:
@@ -131,7 +134,9 @@ def get_parser(self, prog_name):
131134
return parser
132135

133136
def take_action(self, parsed_args):
134-
identity_client = self.app.client_manager.sdk_connection.identity
137+
identity_client = sdk_utils.ensure_service_version(
138+
self.app.client_manager.sdk_connection.identity, '3'
139+
)
135140
result = 0
136141
for i in parsed_args.domain:
137142
try:
@@ -175,6 +180,9 @@ def get_parser(self, prog_name):
175180
return parser
176181

177182
def take_action(self, parsed_args):
183+
identity_client = sdk_utils.ensure_service_version(
184+
self.app.client_manager.sdk_connection.identity, '3'
185+
)
178186
kwargs = {}
179187
if parsed_args.name:
180188
kwargs['name'] = parsed_args.name
@@ -183,9 +191,7 @@ def take_action(self, parsed_args):
183191

184192
columns = ('id', 'name', 'is_enabled', 'description')
185193
column_headers = ('ID', 'Name', 'Enabled', 'Description')
186-
data = self.app.client_manager.sdk_connection.identity.domains(
187-
**kwargs
188-
)
194+
data = identity_client.domains(**kwargs)
189195

190196
return (
191197
column_headers,
@@ -239,7 +245,9 @@ def get_parser(self, prog_name):
239245
return parser
240246

241247
def take_action(self, parsed_args):
242-
identity_client = self.app.client_manager.sdk_connection.identity
248+
identity_client = sdk_utils.ensure_service_version(
249+
self.app.client_manager.sdk_connection.identity, '3'
250+
)
243251
domain = identity_client.find_domain(
244252
parsed_args.domain, ignore_missing=False
245253
)
@@ -269,7 +277,9 @@ def get_parser(self, prog_name):
269277
return parser
270278

271279
def take_action(self, parsed_args):
272-
identity_client = self.app.client_manager.sdk_connection.identity
280+
identity_client = sdk_utils.ensure_service_version(
281+
self.app.client_manager.sdk_connection.identity, '3'
282+
)
273283
domain = identity_client.find_domain(
274284
parsed_args.domain, ignore_missing=False
275285
)

0 commit comments

Comments
 (0)