python-openstackclient 7.1.3__py3-none-any.whl → 7.1.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openstackclient/common/clientmanager.py +6 -1
- openstackclient/common/limits.py +1 -1
- openstackclient/common/quota.py +7 -2
- openstackclient/compute/v2/server.py +6 -2
- openstackclient/identity/common.py +22 -34
- openstackclient/identity/v3/role_assignment.py +1 -1
- openstackclient/tests/functional/compute/v2/test_server.py +87 -1
- openstackclient/tests/unit/compute/v2/test_server.py +4 -4
- openstackclient/tests/unit/identity/v3/test_role_assignment.py +261 -0
- {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info}/METADATA +24 -17
- {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info}/RECORD +17 -17
- {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info}/WHEEL +1 -1
- {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info}/entry_points.txt +0 -1
- python_openstackclient-7.1.5.dist-info/pbr.json +1 -0
- python_openstackclient-7.1.3.dist-info/pbr.json +0 -1
- {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info/licenses}/AUTHORS +0 -0
- {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info/licenses}/LICENSE +0 -0
- {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info}/top_level.txt +0 -0
|
@@ -129,10 +129,15 @@ class ClientManager(clientmanager.ClientManager):
|
|
|
129
129
|
# TODO(stephenfin): Drop volume_client argument in OSC 8.0 or later.
|
|
130
130
|
def is_volume_endpoint_enabled(self, volume_client=None):
|
|
131
131
|
"""Check if volume endpoint is enabled"""
|
|
132
|
+
# We check against the service type and all aliases defined by the
|
|
133
|
+
# Service Types Authority
|
|
134
|
+
# https://service-types.openstack.org/service-types.json
|
|
132
135
|
return (
|
|
133
|
-
self.is_service_available('
|
|
136
|
+
self.is_service_available('block-storage') is not False
|
|
137
|
+
or self.is_service_available('volume') is not False
|
|
134
138
|
or self.is_service_available('volumev3') is not False
|
|
135
139
|
or self.is_service_available('volumev2') is not False
|
|
140
|
+
or self.is_service_available('block-store') is not False
|
|
136
141
|
)
|
|
137
142
|
|
|
138
143
|
|
openstackclient/common/limits.py
CHANGED
|
@@ -130,7 +130,7 @@ class ShowLimits(command.Lister):
|
|
|
130
130
|
if self.app.client_manager.is_volume_endpoint_enabled():
|
|
131
131
|
volume_client = self.app.client_manager.sdk_connection.volume
|
|
132
132
|
volume_limits = volume_client.get_limits(
|
|
133
|
-
|
|
133
|
+
project=project_id,
|
|
134
134
|
)
|
|
135
135
|
|
|
136
136
|
if parsed_args.is_absolute:
|
openstackclient/common/quota.py
CHANGED
|
@@ -249,9 +249,14 @@ class ListQuota(command.Lister):
|
|
|
249
249
|
for project_id in project_ids:
|
|
250
250
|
try:
|
|
251
251
|
project_data = compute_client.get_quota_set(project_id)
|
|
252
|
+
# NOTE(stephenfin): Unfortunately, Nova raises a HTTP 400 (Bad
|
|
253
|
+
# Request) if the project ID is invalid, even though the project
|
|
254
|
+
# ID is actually the resource's identifier which would normally
|
|
255
|
+
# lead us to expect a HTTP 404 (Not Found).
|
|
252
256
|
except (
|
|
253
|
-
sdk_exceptions.
|
|
257
|
+
sdk_exceptions.BadRequestException,
|
|
254
258
|
sdk_exceptions.ForbiddenException,
|
|
259
|
+
sdk_exceptions.NotFoundException,
|
|
255
260
|
) as exc:
|
|
256
261
|
# Project not found, move on to next one
|
|
257
262
|
LOG.warning(f"Project {project_id} not found: {exc}")
|
|
@@ -312,8 +317,8 @@ class ListQuota(command.Lister):
|
|
|
312
317
|
try:
|
|
313
318
|
project_data = volume_client.get_quota_set(project_id)
|
|
314
319
|
except (
|
|
315
|
-
sdk_exceptions.NotFoundException,
|
|
316
320
|
sdk_exceptions.ForbiddenException,
|
|
321
|
+
sdk_exceptions.NotFoundException,
|
|
317
322
|
) as exc:
|
|
318
323
|
# Project not found, move on to next one
|
|
319
324
|
LOG.warning(f"Project {project_id} not found: {exc}")
|
|
@@ -701,7 +701,10 @@ class AddServerSecurityGroup(command.Command):
|
|
|
701
701
|
security_group = compute_v2.find_security_group(
|
|
702
702
|
compute_client, parsed_args.group
|
|
703
703
|
)['name']
|
|
704
|
-
compute_client.add_security_group_to_server(
|
|
704
|
+
compute_client.add_security_group_to_server(
|
|
705
|
+
server,
|
|
706
|
+
{'name': security_group},
|
|
707
|
+
)
|
|
705
708
|
|
|
706
709
|
|
|
707
710
|
class AddServerVolume(command.ShowOne):
|
|
@@ -4039,7 +4042,8 @@ class RemoveServerSecurityGroup(command.Command):
|
|
|
4039
4042
|
compute_client, parsed_args.group
|
|
4040
4043
|
)['name']
|
|
4041
4044
|
compute_client.remove_security_group_from_server(
|
|
4042
|
-
server,
|
|
4045
|
+
server,
|
|
4046
|
+
{'name': security_group},
|
|
4043
4047
|
)
|
|
4044
4048
|
|
|
4045
4049
|
|
|
@@ -184,13 +184,6 @@ def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
|
|
|
184
184
|
return parsed_name
|
|
185
185
|
|
|
186
186
|
|
|
187
|
-
def _get_domain_id_if_requested(identity_client, domain_name_or_id):
|
|
188
|
-
if not domain_name_or_id:
|
|
189
|
-
return None
|
|
190
|
-
domain = find_domain(identity_client, domain_name_or_id)
|
|
191
|
-
return domain.id
|
|
192
|
-
|
|
193
|
-
|
|
194
187
|
def find_domain(identity_client, name_or_id):
|
|
195
188
|
return _find_identity_resource(
|
|
196
189
|
identity_client.domains, name_or_id, domains.Domain
|
|
@@ -198,48 +191,43 @@ def find_domain(identity_client, name_or_id):
|
|
|
198
191
|
|
|
199
192
|
|
|
200
193
|
def find_group(identity_client, name_or_id, domain_name_or_id=None):
|
|
201
|
-
|
|
202
|
-
if not domain_id:
|
|
194
|
+
if domain_name_or_id is None:
|
|
203
195
|
return _find_identity_resource(
|
|
204
196
|
identity_client.groups, name_or_id, groups.Group
|
|
205
197
|
)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
198
|
+
|
|
199
|
+
domain_id = find_domain(identity_client, domain_name_or_id).id
|
|
200
|
+
return _find_identity_resource(
|
|
201
|
+
identity_client.groups,
|
|
202
|
+
name_or_id,
|
|
203
|
+
groups.Group,
|
|
204
|
+
domain_id=domain_id,
|
|
205
|
+
)
|
|
214
206
|
|
|
215
207
|
|
|
216
208
|
def find_project(identity_client, name_or_id, domain_name_or_id=None):
|
|
217
|
-
|
|
218
|
-
if not domain_id:
|
|
209
|
+
if domain_name_or_id is None:
|
|
219
210
|
return _find_identity_resource(
|
|
220
211
|
identity_client.projects, name_or_id, projects.Project
|
|
221
212
|
)
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
)
|
|
213
|
+
domain_id = find_domain(identity_client, domain_name_or_id).id
|
|
214
|
+
return _find_identity_resource(
|
|
215
|
+
identity_client.projects,
|
|
216
|
+
name_or_id,
|
|
217
|
+
projects.Project,
|
|
218
|
+
domain_id=domain_id,
|
|
219
|
+
)
|
|
230
220
|
|
|
231
221
|
|
|
232
222
|
def find_user(identity_client, name_or_id, domain_name_or_id=None):
|
|
233
|
-
|
|
234
|
-
if not domain_id:
|
|
223
|
+
if domain_name_or_id is None:
|
|
235
224
|
return _find_identity_resource(
|
|
236
225
|
identity_client.users, name_or_id, users.User
|
|
237
226
|
)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
)
|
|
227
|
+
domain_id = find_domain(identity_client, domain_name_or_id).id
|
|
228
|
+
return _find_identity_resource(
|
|
229
|
+
identity_client.users, name_or_id, users.User, domain_id=domain_id
|
|
230
|
+
)
|
|
243
231
|
|
|
244
232
|
|
|
245
233
|
def _find_identity_resource(
|
|
@@ -148,7 +148,7 @@ class ListRoleAssignment(command.Lister):
|
|
|
148
148
|
|
|
149
149
|
user_domain_id = None
|
|
150
150
|
if parsed_args.user_domain:
|
|
151
|
-
|
|
151
|
+
user_domain_id = _find_sdk_id(
|
|
152
152
|
identity_client.find_domain,
|
|
153
153
|
name_or_id=parsed_args.user_domain,
|
|
154
154
|
)
|
|
@@ -1295,7 +1295,7 @@ class ServerTests(common.ComputeTestCase):
|
|
|
1295
1295
|
)
|
|
1296
1296
|
if ip_address in cmd_output['addresses']['private']:
|
|
1297
1297
|
# Hang out for a bit and try again
|
|
1298
|
-
print('retrying
|
|
1298
|
+
print('retrying remove port check')
|
|
1299
1299
|
wait_time += 10
|
|
1300
1300
|
time.sleep(10)
|
|
1301
1301
|
else:
|
|
@@ -1367,6 +1367,92 @@ class ServerTests(common.ComputeTestCase):
|
|
|
1367
1367
|
addresses = cmd_output['addresses']['private']
|
|
1368
1368
|
self.assertIn(ip_address, addresses)
|
|
1369
1369
|
|
|
1370
|
+
def test_server_add_remove_security_group(self):
|
|
1371
|
+
name = uuid.uuid4().hex
|
|
1372
|
+
cmd_output = self.openstack(
|
|
1373
|
+
'server create '
|
|
1374
|
+
+ '--network private '
|
|
1375
|
+
+ '--flavor '
|
|
1376
|
+
+ self.flavor_name
|
|
1377
|
+
+ ' '
|
|
1378
|
+
+ '--image '
|
|
1379
|
+
+ self.image_name
|
|
1380
|
+
+ ' '
|
|
1381
|
+
+ '--wait '
|
|
1382
|
+
+ name,
|
|
1383
|
+
parse_output=True,
|
|
1384
|
+
)
|
|
1385
|
+
|
|
1386
|
+
self.assertIsNotNone(cmd_output['id'])
|
|
1387
|
+
self.assertEqual(name, cmd_output['name'])
|
|
1388
|
+
self.addCleanup(self.openstack, 'server delete --wait ' + name)
|
|
1389
|
+
|
|
1390
|
+
# create security group
|
|
1391
|
+
security_group_name = uuid.uuid4().hex
|
|
1392
|
+
|
|
1393
|
+
cmd_output = self.openstack(
|
|
1394
|
+
'security group list',
|
|
1395
|
+
parse_output=True,
|
|
1396
|
+
)
|
|
1397
|
+
self.assertNotIn(security_group_name, cmd_output)
|
|
1398
|
+
|
|
1399
|
+
cmd_output = self.openstack(
|
|
1400
|
+
'security group create ' + security_group_name,
|
|
1401
|
+
parse_output=True,
|
|
1402
|
+
)
|
|
1403
|
+
self.assertIsNotNone(cmd_output['id'])
|
|
1404
|
+
self.addCleanup(
|
|
1405
|
+
self.openstack, 'security group delete ' + security_group_name
|
|
1406
|
+
)
|
|
1407
|
+
|
|
1408
|
+
# add security group to server, assert the name of the security group
|
|
1409
|
+
# appears
|
|
1410
|
+
self.openstack(
|
|
1411
|
+
'server add security group ' + name + ' ' + security_group_name
|
|
1412
|
+
)
|
|
1413
|
+
|
|
1414
|
+
wait_time = 0
|
|
1415
|
+
while wait_time < 60:
|
|
1416
|
+
cmd_output = self.openstack(
|
|
1417
|
+
'server show ' + name,
|
|
1418
|
+
parse_output=True,
|
|
1419
|
+
)
|
|
1420
|
+
if security_group_name not in [
|
|
1421
|
+
x['name'] for x in cmd_output['security_groups']
|
|
1422
|
+
]:
|
|
1423
|
+
# Hang out for a bit and try again
|
|
1424
|
+
print('retrying add security group check')
|
|
1425
|
+
wait_time += 10
|
|
1426
|
+
time.sleep(10)
|
|
1427
|
+
else:
|
|
1428
|
+
break
|
|
1429
|
+
security_groups = [x['name'] for x in cmd_output['security_groups']]
|
|
1430
|
+
self.assertIn(security_group_name, security_groups)
|
|
1431
|
+
|
|
1432
|
+
# remove security group, assert the name of the security group doesn't
|
|
1433
|
+
# appear
|
|
1434
|
+
self.openstack(
|
|
1435
|
+
'server remove security group ' + name + ' ' + security_group_name
|
|
1436
|
+
)
|
|
1437
|
+
|
|
1438
|
+
wait_time = 0
|
|
1439
|
+
while wait_time < 60:
|
|
1440
|
+
cmd_output = self.openstack(
|
|
1441
|
+
'server show ' + name,
|
|
1442
|
+
parse_output=True,
|
|
1443
|
+
)
|
|
1444
|
+
if security_group_name not in [
|
|
1445
|
+
x['name'] for x in cmd_output['security_groups']
|
|
1446
|
+
]:
|
|
1447
|
+
# Hang out for a bit and try again
|
|
1448
|
+
print('retrying remove security group check')
|
|
1449
|
+
wait_time += 10
|
|
1450
|
+
time.sleep(10)
|
|
1451
|
+
else:
|
|
1452
|
+
break
|
|
1453
|
+
security_groups = [x['name'] for x in cmd_output['security_groups']]
|
|
1454
|
+
self.assertNotIn(security_group_name, security_groups)
|
|
1455
|
+
|
|
1370
1456
|
def test_server_add_remove_volume(self):
|
|
1371
1457
|
volume_wait_for = volume_common.BaseVolumeTests.wait_for_status
|
|
1372
1458
|
|
|
@@ -1186,7 +1186,7 @@ class TestServerAddSecurityGroup(compute_fakes.TestComputev2):
|
|
|
1186
1186
|
self.server.id, ignore_missing=False
|
|
1187
1187
|
)
|
|
1188
1188
|
self.compute_sdk_client.add_security_group_to_server.assert_called_once_with(
|
|
1189
|
-
self.server, 'fake_sg'
|
|
1189
|
+
self.server, {'name': 'fake_sg'}
|
|
1190
1190
|
)
|
|
1191
1191
|
mock_find_nova_net_sg.assert_called_once_with(
|
|
1192
1192
|
self.compute_sdk_client, 'fake_sg'
|
|
@@ -1207,7 +1207,7 @@ class TestServerAddSecurityGroup(compute_fakes.TestComputev2):
|
|
|
1207
1207
|
self.server.id, ignore_missing=False
|
|
1208
1208
|
)
|
|
1209
1209
|
self.compute_sdk_client.add_security_group_to_server.assert_called_once_with(
|
|
1210
|
-
self.server, 'fake_sg'
|
|
1210
|
+
self.server, {'name': 'fake_sg'}
|
|
1211
1211
|
)
|
|
1212
1212
|
self.assertIsNone(result)
|
|
1213
1213
|
|
|
@@ -7394,7 +7394,7 @@ class TestServerRemoveSecurityGroup(TestServer):
|
|
|
7394
7394
|
self.server.id, ignore_missing=False
|
|
7395
7395
|
)
|
|
7396
7396
|
self.compute_sdk_client.remove_security_group_from_server.assert_called_once_with(
|
|
7397
|
-
self.server, 'fake_sg'
|
|
7397
|
+
self.server, {'name': 'fake_sg'}
|
|
7398
7398
|
)
|
|
7399
7399
|
mock_find_nova_net_sg.assert_called_once_with(
|
|
7400
7400
|
self.compute_sdk_client, 'fake_sg'
|
|
@@ -7415,7 +7415,7 @@ class TestServerRemoveSecurityGroup(TestServer):
|
|
|
7415
7415
|
self.server.id, ignore_missing=False
|
|
7416
7416
|
)
|
|
7417
7417
|
self.compute_sdk_client.remove_security_group_from_server.assert_called_once_with(
|
|
7418
|
-
self.server, 'fake_sg'
|
|
7418
|
+
self.server, {'name': 'fake_sg'}
|
|
7419
7419
|
)
|
|
7420
7420
|
self.assertIsNone(result)
|
|
7421
7421
|
|
|
@@ -165,10 +165,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
165
165
|
arglist = ['--user', self.user.name]
|
|
166
166
|
verifylist = [
|
|
167
167
|
('user', self.user.name),
|
|
168
|
+
('user_domain', None),
|
|
168
169
|
('group', None),
|
|
170
|
+
('group_domain', None),
|
|
169
171
|
('system', None),
|
|
170
172
|
('domain', None),
|
|
171
173
|
('project', None),
|
|
174
|
+
('project_domain', None),
|
|
172
175
|
('role', None),
|
|
173
176
|
('effective', None),
|
|
174
177
|
('inherited', False),
|
|
@@ -181,6 +184,79 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
181
184
|
# containing the data to be listed.
|
|
182
185
|
columns, data = self.cmd.take_action(parsed_args)
|
|
183
186
|
|
|
187
|
+
self.identity_sdk_client.find_user.assert_called_with(
|
|
188
|
+
name_or_id=self.user.name, ignore_missing=False, domain_id=None
|
|
189
|
+
)
|
|
190
|
+
self.identity_sdk_client.role_assignments.assert_called_with(
|
|
191
|
+
role_id=None,
|
|
192
|
+
user_id=self.user.id,
|
|
193
|
+
group_id=None,
|
|
194
|
+
scope_project_id=None,
|
|
195
|
+
scope_domain_id=None,
|
|
196
|
+
scope_system=None,
|
|
197
|
+
effective=None,
|
|
198
|
+
include_names=None,
|
|
199
|
+
inherited_to=None,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
self.assertEqual(self.columns, columns)
|
|
203
|
+
datalist = (
|
|
204
|
+
(
|
|
205
|
+
self.role.id,
|
|
206
|
+
self.user.id,
|
|
207
|
+
'',
|
|
208
|
+
'',
|
|
209
|
+
self.domain.id,
|
|
210
|
+
'',
|
|
211
|
+
False,
|
|
212
|
+
),
|
|
213
|
+
(
|
|
214
|
+
self.role.id,
|
|
215
|
+
self.user.id,
|
|
216
|
+
'',
|
|
217
|
+
self.project.id,
|
|
218
|
+
'',
|
|
219
|
+
'',
|
|
220
|
+
False,
|
|
221
|
+
),
|
|
222
|
+
)
|
|
223
|
+
self.assertEqual(datalist, tuple(data))
|
|
224
|
+
|
|
225
|
+
def test_role_assignment_list_user_with_domain(self):
|
|
226
|
+
self.identity_sdk_client.role_assignments.return_value = [
|
|
227
|
+
self.assignment_with_domain_id_and_user_id,
|
|
228
|
+
self.assignment_with_project_id_and_user_id,
|
|
229
|
+
]
|
|
230
|
+
|
|
231
|
+
arglist = ['--user', self.user.name, '--user-domain', self.domain.name]
|
|
232
|
+
verifylist = [
|
|
233
|
+
('user', self.user.name),
|
|
234
|
+
('user_domain', self.domain.name),
|
|
235
|
+
('group', None),
|
|
236
|
+
('group_domain', None),
|
|
237
|
+
('system', None),
|
|
238
|
+
('domain', None),
|
|
239
|
+
('project', None),
|
|
240
|
+
('role', None),
|
|
241
|
+
('effective', None),
|
|
242
|
+
('inherited', False),
|
|
243
|
+
('names', False),
|
|
244
|
+
]
|
|
245
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
246
|
+
|
|
247
|
+
# In base command class Lister in cliff, abstract method take_action()
|
|
248
|
+
# returns a tuple containing the column names and an iterable
|
|
249
|
+
# containing the data to be listed.
|
|
250
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
251
|
+
|
|
252
|
+
self.identity_sdk_client.find_domain.assert_called_with(
|
|
253
|
+
name_or_id=self.domain.name, ignore_missing=False
|
|
254
|
+
)
|
|
255
|
+
self.identity_sdk_client.find_user.assert_called_with(
|
|
256
|
+
name_or_id=self.user.name,
|
|
257
|
+
ignore_missing=False,
|
|
258
|
+
domain_id=self.domain.id,
|
|
259
|
+
)
|
|
184
260
|
self.identity_sdk_client.role_assignments.assert_called_with(
|
|
185
261
|
role_id=None,
|
|
186
262
|
user_id=self.user.id,
|
|
@@ -230,10 +306,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
230
306
|
arglist = ['--user', self.user.id]
|
|
231
307
|
verifylist = [
|
|
232
308
|
('user', self.user.id),
|
|
309
|
+
('user_domain', None),
|
|
233
310
|
('group', None),
|
|
311
|
+
('group_domain', None),
|
|
234
312
|
('system', None),
|
|
235
313
|
('domain', None),
|
|
236
314
|
('project', None),
|
|
315
|
+
('project_domain', None),
|
|
237
316
|
('role', None),
|
|
238
317
|
('effective', None),
|
|
239
318
|
('inherited', False),
|
|
@@ -290,10 +369,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
290
369
|
arglist = ['--group', self.group.name]
|
|
291
370
|
verifylist = [
|
|
292
371
|
('user', None),
|
|
372
|
+
('user_domain', None),
|
|
293
373
|
('group', self.group.name),
|
|
374
|
+
('group_domain', None),
|
|
294
375
|
('system', None),
|
|
295
376
|
('domain', None),
|
|
296
377
|
('project', None),
|
|
378
|
+
('project_domain', None),
|
|
297
379
|
('role', None),
|
|
298
380
|
('effective', None),
|
|
299
381
|
('inherited', False),
|
|
@@ -306,6 +388,85 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
306
388
|
# containing the data to be listed.
|
|
307
389
|
columns, data = self.cmd.take_action(parsed_args)
|
|
308
390
|
|
|
391
|
+
self.identity_sdk_client.find_group.assert_called_with(
|
|
392
|
+
name_or_id=self.group.name, ignore_missing=False, domain_id=None
|
|
393
|
+
)
|
|
394
|
+
self.identity_sdk_client.role_assignments.assert_called_with(
|
|
395
|
+
role_id=None,
|
|
396
|
+
user_id=None,
|
|
397
|
+
group_id=self.group.id,
|
|
398
|
+
scope_project_id=None,
|
|
399
|
+
scope_domain_id=None,
|
|
400
|
+
scope_system=None,
|
|
401
|
+
effective=None,
|
|
402
|
+
include_names=None,
|
|
403
|
+
inherited_to=None,
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
self.assertEqual(self.columns, columns)
|
|
407
|
+
datalist = (
|
|
408
|
+
(
|
|
409
|
+
self.role.id,
|
|
410
|
+
'',
|
|
411
|
+
self.group.id,
|
|
412
|
+
'',
|
|
413
|
+
self.domain.id,
|
|
414
|
+
'',
|
|
415
|
+
False,
|
|
416
|
+
),
|
|
417
|
+
(
|
|
418
|
+
self.role.id,
|
|
419
|
+
'',
|
|
420
|
+
self.group.id,
|
|
421
|
+
self.project.id,
|
|
422
|
+
'',
|
|
423
|
+
'',
|
|
424
|
+
False,
|
|
425
|
+
),
|
|
426
|
+
)
|
|
427
|
+
self.assertEqual(datalist, tuple(data))
|
|
428
|
+
|
|
429
|
+
def test_role_assignment_list_group_with_domain(self):
|
|
430
|
+
self.identity_sdk_client.role_assignments.return_value = [
|
|
431
|
+
self.assignment_with_domain_id_and_group_id,
|
|
432
|
+
self.assignment_with_project_id_and_group_id,
|
|
433
|
+
]
|
|
434
|
+
|
|
435
|
+
arglist = [
|
|
436
|
+
'--group',
|
|
437
|
+
self.group.name,
|
|
438
|
+
'--group-domain',
|
|
439
|
+
self.domain.name,
|
|
440
|
+
]
|
|
441
|
+
verifylist = [
|
|
442
|
+
('user', None),
|
|
443
|
+
('user_domain', None),
|
|
444
|
+
('group', self.group.name),
|
|
445
|
+
('group_domain', self.domain.name),
|
|
446
|
+
('system', None),
|
|
447
|
+
('domain', None),
|
|
448
|
+
('project', None),
|
|
449
|
+
('project_domain', None),
|
|
450
|
+
('role', None),
|
|
451
|
+
('effective', None),
|
|
452
|
+
('inherited', False),
|
|
453
|
+
('names', False),
|
|
454
|
+
]
|
|
455
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
456
|
+
|
|
457
|
+
# In base command class Lister in cliff, abstract method take_action()
|
|
458
|
+
# returns a tuple containing the column names and an iterable
|
|
459
|
+
# containing the data to be listed.
|
|
460
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
461
|
+
|
|
462
|
+
self.identity_sdk_client.find_domain.assert_called_with(
|
|
463
|
+
name_or_id=self.domain.name, ignore_missing=False
|
|
464
|
+
)
|
|
465
|
+
self.identity_sdk_client.find_group.assert_called_with(
|
|
466
|
+
name_or_id=self.group.name,
|
|
467
|
+
ignore_missing=False,
|
|
468
|
+
domain_id=self.domain.id,
|
|
469
|
+
)
|
|
309
470
|
self.identity_sdk_client.role_assignments.assert_called_with(
|
|
310
471
|
role_id=None,
|
|
311
472
|
user_id=None,
|
|
@@ -350,10 +511,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
350
511
|
arglist = ['--domain', self.domain.name]
|
|
351
512
|
verifylist = [
|
|
352
513
|
('user', None),
|
|
514
|
+
('user_domain', None),
|
|
353
515
|
('group', None),
|
|
516
|
+
('group_domain', None),
|
|
354
517
|
('system', None),
|
|
355
518
|
('domain', self.domain.name),
|
|
356
519
|
('project', None),
|
|
520
|
+
('project_domain', None),
|
|
357
521
|
('role', None),
|
|
358
522
|
('effective', None),
|
|
359
523
|
('inherited', False),
|
|
@@ -410,10 +574,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
410
574
|
arglist = ['--project', self.project.name]
|
|
411
575
|
verifylist = [
|
|
412
576
|
('user', None),
|
|
577
|
+
('user_domain', None),
|
|
413
578
|
('group', None),
|
|
579
|
+
('group_domain', None),
|
|
414
580
|
('system', None),
|
|
415
581
|
('domain', None),
|
|
416
582
|
('project', self.project.name),
|
|
583
|
+
('project_domain', None),
|
|
417
584
|
('role', None),
|
|
418
585
|
('effective', None),
|
|
419
586
|
('inherited', False),
|
|
@@ -426,6 +593,85 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
426
593
|
# containing the data to be listed.
|
|
427
594
|
columns, data = self.cmd.take_action(parsed_args)
|
|
428
595
|
|
|
596
|
+
self.identity_sdk_client.find_project.assert_called_with(
|
|
597
|
+
name_or_id=self.project.name, ignore_missing=False, domain_id=None
|
|
598
|
+
)
|
|
599
|
+
self.identity_sdk_client.role_assignments.assert_called_with(
|
|
600
|
+
role_id=None,
|
|
601
|
+
user_id=None,
|
|
602
|
+
group_id=None,
|
|
603
|
+
scope_project_id=self.project.id,
|
|
604
|
+
scope_domain_id=None,
|
|
605
|
+
scope_system=None,
|
|
606
|
+
effective=None,
|
|
607
|
+
include_names=None,
|
|
608
|
+
inherited_to=None,
|
|
609
|
+
)
|
|
610
|
+
|
|
611
|
+
self.assertEqual(self.columns, columns)
|
|
612
|
+
datalist = (
|
|
613
|
+
(
|
|
614
|
+
self.role.id,
|
|
615
|
+
self.user.id,
|
|
616
|
+
'',
|
|
617
|
+
self.project.id,
|
|
618
|
+
'',
|
|
619
|
+
'',
|
|
620
|
+
False,
|
|
621
|
+
),
|
|
622
|
+
(
|
|
623
|
+
self.role.id,
|
|
624
|
+
'',
|
|
625
|
+
self.group.id,
|
|
626
|
+
self.project.id,
|
|
627
|
+
'',
|
|
628
|
+
'',
|
|
629
|
+
False,
|
|
630
|
+
),
|
|
631
|
+
)
|
|
632
|
+
self.assertEqual(datalist, tuple(data))
|
|
633
|
+
|
|
634
|
+
def test_role_assignment_list_project_with_domain(self):
|
|
635
|
+
self.identity_sdk_client.role_assignments.return_value = [
|
|
636
|
+
self.assignment_with_project_id_and_user_id,
|
|
637
|
+
self.assignment_with_project_id_and_group_id,
|
|
638
|
+
]
|
|
639
|
+
|
|
640
|
+
arglist = [
|
|
641
|
+
'--project',
|
|
642
|
+
self.project.name,
|
|
643
|
+
'--project-domain',
|
|
644
|
+
self.domain.name,
|
|
645
|
+
]
|
|
646
|
+
verifylist = [
|
|
647
|
+
('user', None),
|
|
648
|
+
('user_domain', None),
|
|
649
|
+
('group', None),
|
|
650
|
+
('group_domain', None),
|
|
651
|
+
('system', None),
|
|
652
|
+
('domain', None),
|
|
653
|
+
('project', self.project.name),
|
|
654
|
+
('project_domain', self.domain.name),
|
|
655
|
+
('role', None),
|
|
656
|
+
('effective', None),
|
|
657
|
+
('inherited', False),
|
|
658
|
+
('names', False),
|
|
659
|
+
]
|
|
660
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
661
|
+
|
|
662
|
+
# In base command class Lister in cliff, abstract method take_action()
|
|
663
|
+
# returns a tuple containing the column names and an iterable
|
|
664
|
+
# containing the data to be listed.
|
|
665
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
666
|
+
|
|
667
|
+
self.identity_sdk_client.find_domain.assert_called_with(
|
|
668
|
+
name_or_id=self.domain.name, ignore_missing=False
|
|
669
|
+
)
|
|
670
|
+
self.identity_sdk_client.find_project.assert_called_with(
|
|
671
|
+
name_or_id=self.project.name,
|
|
672
|
+
ignore_missing=False,
|
|
673
|
+
domain_id=self.domain.id,
|
|
674
|
+
)
|
|
429
675
|
self.identity_sdk_client.role_assignments.assert_called_with(
|
|
430
676
|
role_id=None,
|
|
431
677
|
user_id=None,
|
|
@@ -476,10 +722,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
476
722
|
]
|
|
477
723
|
verifylist = [
|
|
478
724
|
('user', None),
|
|
725
|
+
('user_domain', None),
|
|
479
726
|
('group', None),
|
|
727
|
+
('group_domain', None),
|
|
480
728
|
('system', None),
|
|
481
729
|
('domain', None),
|
|
482
730
|
('project', None),
|
|
731
|
+
('project_domain', None),
|
|
483
732
|
('role', None),
|
|
484
733
|
('effective', None),
|
|
485
734
|
('inherited', False),
|
|
@@ -529,10 +778,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
529
778
|
arglist = ['--effective']
|
|
530
779
|
verifylist = [
|
|
531
780
|
('user', None),
|
|
781
|
+
('user_domain', None),
|
|
532
782
|
('group', None),
|
|
783
|
+
('group_domain', None),
|
|
533
784
|
('system', None),
|
|
534
785
|
('domain', None),
|
|
535
786
|
('project', None),
|
|
787
|
+
('project_domain', None),
|
|
536
788
|
('role', None),
|
|
537
789
|
('effective', True),
|
|
538
790
|
('inherited', False),
|
|
@@ -611,10 +863,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
611
863
|
arglist = ['--inherited']
|
|
612
864
|
verifylist = [
|
|
613
865
|
('user', None),
|
|
866
|
+
('user_domain', None),
|
|
614
867
|
('group', None),
|
|
868
|
+
('group_domain', None),
|
|
615
869
|
('system', None),
|
|
616
870
|
('domain', None),
|
|
617
871
|
('project', None),
|
|
872
|
+
('project_domain', None),
|
|
618
873
|
('role', None),
|
|
619
874
|
('effective', None),
|
|
620
875
|
('inherited', True),
|
|
@@ -707,10 +962,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
707
962
|
arglist = ['--names']
|
|
708
963
|
verifylist = [
|
|
709
964
|
('user', None),
|
|
965
|
+
('user_domain', None),
|
|
710
966
|
('group', None),
|
|
967
|
+
('group_domain', None),
|
|
711
968
|
('system', None),
|
|
712
969
|
('domain', None),
|
|
713
970
|
('project', None),
|
|
971
|
+
('project_domain', None),
|
|
714
972
|
('role', None),
|
|
715
973
|
('effective', None),
|
|
716
974
|
('inherited', False),
|
|
@@ -799,10 +1057,13 @@ class TestRoleAssignmentList(identity_fakes.TestIdentityv3):
|
|
|
799
1057
|
]
|
|
800
1058
|
verifylist = [
|
|
801
1059
|
('user', None),
|
|
1060
|
+
('user_domain', None),
|
|
802
1061
|
('group', None),
|
|
1062
|
+
('group_domain', None),
|
|
803
1063
|
('system', None),
|
|
804
1064
|
('domain', None),
|
|
805
1065
|
('project', None),
|
|
1066
|
+
('project_domain', None),
|
|
806
1067
|
('role', role_2.name),
|
|
807
1068
|
('effective', None),
|
|
808
1069
|
('inherited', False),
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: python-openstackclient
|
|
3
|
-
Version: 7.1.
|
|
3
|
+
Version: 7.1.5
|
|
4
4
|
Summary: OpenStack Command-line Client
|
|
5
5
|
Home-page: https://docs.openstack.org/python-openstackclient/latest/
|
|
6
6
|
Author: OpenStack
|
|
7
7
|
Author-email: openstack-discuss@lists.openstack.org
|
|
8
|
-
License: UNKNOWN
|
|
9
|
-
Platform: UNKNOWN
|
|
10
8
|
Classifier: Environment :: OpenStack
|
|
11
9
|
Classifier: Intended Audience :: Information Technology
|
|
12
10
|
Classifier: Intended Audience :: System Administrators
|
|
@@ -20,17 +18,28 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
20
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
19
|
Classifier: Programming Language :: Python :: 3.12
|
|
22
20
|
Requires-Python: >=3.8
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist:
|
|
29
|
-
Requires-Dist:
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist:
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
License-File: AUTHORS
|
|
23
|
+
Requires-Dist: pbr!=2.1.0,>=2.0.0
|
|
24
|
+
Requires-Dist: cryptography>=2.7
|
|
25
|
+
Requires-Dist: cliff>=3.5.0
|
|
26
|
+
Requires-Dist: iso8601>=0.1.11
|
|
27
|
+
Requires-Dist: openstacksdk>=3.3.0
|
|
28
|
+
Requires-Dist: osc-lib>=2.3.0
|
|
29
|
+
Requires-Dist: oslo.i18n>=3.15.3
|
|
30
|
+
Requires-Dist: python-keystoneclient>=3.22.0
|
|
31
|
+
Requires-Dist: python-cinderclient>=3.3.0
|
|
32
|
+
Requires-Dist: requests>=2.27.0
|
|
33
|
+
Requires-Dist: stevedore>=2.0.1
|
|
34
|
+
Dynamic: author
|
|
35
|
+
Dynamic: author-email
|
|
36
|
+
Dynamic: classifier
|
|
37
|
+
Dynamic: description
|
|
38
|
+
Dynamic: home-page
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
Dynamic: requires-dist
|
|
41
|
+
Dynamic: requires-python
|
|
42
|
+
Dynamic: summary
|
|
34
43
|
|
|
35
44
|
========================
|
|
36
45
|
Team and repository tags
|
|
@@ -171,5 +180,3 @@ Authentication using username/password is most commonly used:
|
|
|
171
180
|
If a password is not provided above (in plaintext), you will be interactively
|
|
172
181
|
prompted to provide one securely.
|
|
173
182
|
|
|
174
|
-
|
|
175
|
-
|
|
@@ -9,15 +9,15 @@ openstackclient/api/image_v2.py,sha256=GSM09toS6rcLzbtyhKl_FvQ7UeWJ3EcvSNBdVIk9r
|
|
|
9
9
|
openstackclient/api/object_store_v1.py,sha256=366WuIuu7iXH4r-vdZTWSiopGj8P4MmMa8NePcvh5qk,18183
|
|
10
10
|
openstackclient/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
openstackclient/common/availability_zone.py,sha256=2TvrpkRQmMHffRZu1x71NFu0tQQNTuo0Voi0er_OvZc,6497
|
|
12
|
-
openstackclient/common/clientmanager.py,sha256=
|
|
12
|
+
openstackclient/common/clientmanager.py,sha256=X_hXK580SLUG3n_HY-2owE32eAzB0jTyLq2DMCufLAs,7438
|
|
13
13
|
openstackclient/common/configuration.py,sha256=kfi4Ph1hEO0z8uJD8d9OuQz2C70Yi7U8pzbc3Tq88lU,2339
|
|
14
14
|
openstackclient/common/extension.py,sha256=4YK8HjwNtd7fIOzcQ-7PDjIwuF331T924vUcSkzK5pI,5332
|
|
15
|
-
openstackclient/common/limits.py,sha256=
|
|
15
|
+
openstackclient/common/limits.py,sha256=6LSFb7OlaMjN6nfXvnZBSaTwZS09UhpxpBNq7eOs898,5659
|
|
16
16
|
openstackclient/common/module.py,sha256=biNzeW2KWcaagpvidvNvQuj4JNk1wjXxBnW99tu_nNk,4277
|
|
17
17
|
openstackclient/common/pagination.py,sha256=ZmEFXprCbSKDtURJTyp5pfe97JuZYKth0MAkEXxrFFU,2728
|
|
18
18
|
openstackclient/common/progressbar.py,sha256=-Xlth1FbiqZg1j3-zX6DIEp29mD76z2ozxiOybx8K-g,2427
|
|
19
19
|
openstackclient/common/project_cleanup.py,sha256=f77yjCfhMh_XY2C-riwvbvh3jrMPx_4EzgHflkG8efk,5206
|
|
20
|
-
openstackclient/common/quota.py,sha256=
|
|
20
|
+
openstackclient/common/quota.py,sha256=ARlbPzaPR7KIxzvVOSY2RFs5SFHalZ0KpjkzHCmhar4,28697
|
|
21
21
|
openstackclient/common/versions.py,sha256=yiH0xhCFKpFcZrA0tWz99-eXJ44PEAyH4qZy9Fu9uwk,3838
|
|
22
22
|
openstackclient/compute/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
23
|
openstackclient/compute/client.py,sha256=xntJEyxt_h5s2cI132cDFCOIxrJCu07WbtFLwp3R5dI,1533
|
|
@@ -30,7 +30,7 @@ openstackclient/compute/v2/host.py,sha256=1Ow4eJu9HPz-SC0u_eXJskUXaGoyW7X1O2yZIf
|
|
|
30
30
|
openstackclient/compute/v2/hypervisor.py,sha256=xkSLqZjaJnVABAKh9ANF9zqy67WaEJeD9NiVL3Frqko,8808
|
|
31
31
|
openstackclient/compute/v2/hypervisor_stats.py,sha256=Y2Jkkleha8PXnM2VQ2MJtjKxHKchGRyEqmILfPj-Wgw,2161
|
|
32
32
|
openstackclient/compute/v2/keypair.py,sha256=yM30AVsMmPP1SAqD8_nKXNkeB9WLyL6sd18AjeYIuhM,15730
|
|
33
|
-
openstackclient/compute/v2/server.py,sha256=
|
|
33
|
+
openstackclient/compute/v2/server.py,sha256=k6GEzWM98DzV6RTJw_9i4iFFsCfDJD4ii9-ow-ca-P8,187272
|
|
34
34
|
openstackclient/compute/v2/server_backup.py,sha256=GVf_T5iHt0po1vYDDQgUQ_fN3AisHvKozEXY37voWkc,4119
|
|
35
35
|
openstackclient/compute/v2/server_event.py,sha256=vLtu_LBJ99Fgfj9oRBCVATalRMyqBd3CUjHToVfQB48,10055
|
|
36
36
|
openstackclient/compute/v2/server_group.py,sha256=s9CjDnmjNUk03VUdAkOn5QHMoSCHV8dtvuLe05ER4Rg,8674
|
|
@@ -41,7 +41,7 @@ openstackclient/compute/v2/service.py,sha256=3Y-R9wGnk5kSaMvXzuETd8EFLQwTfMUbdmk
|
|
|
41
41
|
openstackclient/compute/v2/usage.py,sha256=ztIv1ucTWWuVe3pfv1jk7Gkf2c6boTrqGdeFKbbfQ5g,9026
|
|
42
42
|
openstackclient/identity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
43
|
openstackclient/identity/client.py,sha256=Miz2eCWbhS-IXaj87J-5qatZPOwZeOn5_MyZ6YMNZ9w,2433
|
|
44
|
-
openstackclient/identity/common.py,sha256=
|
|
44
|
+
openstackclient/identity/common.py,sha256=oWSLTECKJeqyvJH7mY1OZWUSSZZtTVyp4jBQGWFclto,12011
|
|
45
45
|
openstackclient/identity/v2_0/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
46
|
openstackclient/identity/v2_0/catalog.py,sha256=B0nCW-KrPqBJ6CX4_zn7_p6h3Y4VFfmVhs14MhnJ-oY,3484
|
|
47
47
|
openstackclient/identity/v2_0/ec2creds.py,sha256=QRj4gP54dA-wX27xy55NJwes9PEFRsCSa0bXjB3aZrY,6468
|
|
@@ -73,7 +73,7 @@ openstackclient/identity/v3/project.py,sha256=jHpviZg3MYPKCacYs1_jbdafz9EflGHGqu
|
|
|
73
73
|
openstackclient/identity/v3/region.py,sha256=jcImUh-kZromTAtXd8aF7kfKBqBwfknP2I5ylYYyb0w,6010
|
|
74
74
|
openstackclient/identity/v3/registered_limit.py,sha256=mbV4Ci7kNPMbveHg6QQztYISiXcm3VwBv3xR2D-aKvw,11389
|
|
75
75
|
openstackclient/identity/v3/role.py,sha256=dmuW5j4T9zmNBHuGkIIcolx5aoDmyFGshGSfOZ2swEY,14205
|
|
76
|
-
openstackclient/identity/v3/role_assignment.py,sha256=
|
|
76
|
+
openstackclient/identity/v3/role_assignment.py,sha256=pg-43fgY2HK4ymfaYypVOuPMsJoYGBRn4XZxicpX6YY,8018
|
|
77
77
|
openstackclient/identity/v3/service.py,sha256=2VuxiOEuEnqjWEPNryKRe4LLe70-MIndkDXYB_jdW1g,7457
|
|
78
78
|
openstackclient/identity/v3/service_provider.py,sha256=g-gs09bFJertKjbfFp2ZKPjXtPfNcecBlHWkArGLkvw,7410
|
|
79
79
|
openstackclient/identity/v3/tag.py,sha256=dcVDheoWxdkwsZYvyJSpzIF2EGpqZtaE0h7x2halscc,3972
|
|
@@ -159,7 +159,7 @@ openstackclient/tests/functional/compute/v2/test_aggregate.py,sha256=7KQfDWDM2Tq
|
|
|
159
159
|
openstackclient/tests/functional/compute/v2/test_flavor.py,sha256=2-dVzVvXsNSMDsTBzDuo3Rv79asExWC7wURudSld1iw,7452
|
|
160
160
|
openstackclient/tests/functional/compute/v2/test_hypervisor.py,sha256=w9iH5k5__R3saIWPl7N6kXT9xRfTykrQEBKoaS2gSnE,1923
|
|
161
161
|
openstackclient/tests/functional/compute/v2/test_keypair.py,sha256=9DiQz6_eNPOYQc6iFyraW8AZOhKsWplsfHpXy0ia8qY,7116
|
|
162
|
-
openstackclient/tests/functional/compute/v2/test_server.py,sha256=
|
|
162
|
+
openstackclient/tests/functional/compute/v2/test_server.py,sha256=MBg-R-k0wqcRkgUX2GEL-u5KdxewcbiSRAw6XCvJslQ,54495
|
|
163
163
|
openstackclient/tests/functional/compute/v2/test_server_event.py,sha256=8MhH2tEJ4MrYW20UQOxKkFdZe0346nIRlz7wbCLXKxI,5157
|
|
164
164
|
openstackclient/tests/functional/compute/v2/test_server_group.py,sha256=Bd46q5DDFHXCUInzT0Kbe0fmArW73VxEt4tQStRA-iE,3062
|
|
165
165
|
openstackclient/tests/functional/identity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -294,7 +294,7 @@ openstackclient/tests/unit/compute/v2/test_host.py,sha256=AAcIxoGpVdy1qOkV3lPFyD
|
|
|
294
294
|
openstackclient/tests/unit/compute/v2/test_hypervisor.py,sha256=t_Xv7uh4dzv6G-gOG3Eoy7l516cHOwy1xeiBgIyaUKc,17390
|
|
295
295
|
openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py,sha256=1z8Jhx_CBoN-cu4im3MQc-YPAZlRQfu--3c9UAUmMG4,3020
|
|
296
296
|
openstackclient/tests/unit/compute/v2/test_keypair.py,sha256=ASoemn6bN_tEKZlHRbhUpjPNydPaqMA22jn6fyAcwGs,25067
|
|
297
|
-
openstackclient/tests/unit/compute/v2/test_server.py,sha256=
|
|
297
|
+
openstackclient/tests/unit/compute/v2/test_server.py,sha256=aoNHY-W6TeV1VU7UaisrC8qql8rTsp5C5buQ-pJ0-H8,310933
|
|
298
298
|
openstackclient/tests/unit/compute/v2/test_server_backup.py,sha256=MW2UQQ32cE403Bmihp7s_MYVhVV4NrkwfDdaZ-y5Wu4,7503
|
|
299
299
|
openstackclient/tests/unit/compute/v2/test_server_event.py,sha256=aZhLD_RgcNDUdCgwVJmpolQlabVWxlrp5edSZBanR_Q,12504
|
|
300
300
|
openstackclient/tests/unit/compute/v2/test_server_group.py,sha256=Ul0SQ_cIq4mW7TIsm6mDRtCOlboNyy6lClP1Oy3NPAE,14934
|
|
@@ -335,7 +335,7 @@ openstackclient/tests/unit/identity/v3/test_protocol.py,sha256=SmV_N8v_dU-mcwa7k
|
|
|
335
335
|
openstackclient/tests/unit/identity/v3/test_region.py,sha256=SN7wLeta1wgFjul3_NGzU-TsQQQaZiFbC7sOEFiRl30,10614
|
|
336
336
|
openstackclient/tests/unit/identity/v3/test_registered_limit.py,sha256=8-Og3hgz2q8i7W1TSFmnRp9MqYzVY1H4SjnOrLVPWKo,17554
|
|
337
337
|
openstackclient/tests/unit/identity/v3/test_role.py,sha256=pYwuSFEg99MHk1mTKQ0l9XzdER0m2T9YjZHMDxfTvFk,51986
|
|
338
|
-
openstackclient/tests/unit/identity/v3/test_role_assignment.py,sha256=
|
|
338
|
+
openstackclient/tests/unit/identity/v3/test_role_assignment.py,sha256=LGwD5EApF6BSiXIHBPwgetcjQsRfCjQ62DmVxGFFcOE,35747
|
|
339
339
|
openstackclient/tests/unit/identity/v3/test_service.py,sha256=eFRjaeuJKd4_G1_gSTzAKmLTN035rQjY4E5RnLzMutY,15028
|
|
340
340
|
openstackclient/tests/unit/identity/v3/test_service_provider.py,sha256=JkO4dBQLGGdJS9etWJzj0wswGmdAAtrCOmfC1hEYzSs,13189
|
|
341
341
|
openstackclient/tests/unit/identity/v3/test_token.py,sha256=k9Ij_BbGTx9KG6Wf7NiO_th-N7cxGWnIWQMWIlDsGXg,4556
|
|
@@ -493,11 +493,11 @@ openstackclient/volume/v3/volume_message.py,sha256=HBBxPEcYoNqGjEbzGIEnIJ1XTcQ2K
|
|
|
493
493
|
openstackclient/volume/v3/volume_snapshot.py,sha256=pZ4q_qCwqh4jaGhX28G59wsWDmEc3uXdbpeD176osZg,3186
|
|
494
494
|
openstackclient/volume/v3/volume_transfer_request.py,sha256=PthOJV2m-pTV1njFzwTpaekXZkET1c6alIJrpuN7R6Q,7530
|
|
495
495
|
openstackclient/volume/v3/volume_type.py,sha256=DF2MVoW2mIk0ABDLZD8D2sb8JlR7-rRjA4qCnBHRe6o,34039
|
|
496
|
-
python_openstackclient-7.1.
|
|
497
|
-
python_openstackclient-7.1.
|
|
498
|
-
python_openstackclient-7.1.
|
|
499
|
-
python_openstackclient-7.1.
|
|
500
|
-
python_openstackclient-7.1.
|
|
501
|
-
python_openstackclient-7.1.
|
|
502
|
-
python_openstackclient-7.1.
|
|
503
|
-
python_openstackclient-7.1.
|
|
496
|
+
python_openstackclient-7.1.5.dist-info/licenses/AUTHORS,sha256=TRFKS0fs1j9d3_KWaIQfYnNH3gfTnDyBHng0RJAUFeM,21384
|
|
497
|
+
python_openstackclient-7.1.5.dist-info/licenses/LICENSE,sha256=XfKg2H1sVi8OoRxoisUlMqoo10TKvHmU_wU39ks7MyA,10143
|
|
498
|
+
python_openstackclient-7.1.5.dist-info/METADATA,sha256=fmv-QoucuGzPHr8JFTkAH3h5EkM7OWsX5b5KAL7I3vU,6740
|
|
499
|
+
python_openstackclient-7.1.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
500
|
+
python_openstackclient-7.1.5.dist-info/entry_points.txt,sha256=VsZCw-6So3hkHuIiX-dGaMVL1PEqmfDynF37m1EwjCs,53260
|
|
501
|
+
python_openstackclient-7.1.5.dist-info/pbr.json,sha256=UhLx127tuigXv-CFTmYy9R7GRr1HsjkJKYtQJnfqOow,47
|
|
502
|
+
python_openstackclient-7.1.5.dist-info/top_level.txt,sha256=htg7z9oZgysRuVUHn-m1Bk6XLGOeV65nMbZX9H8qhs0,16
|
|
503
|
+
python_openstackclient-7.1.5.dist-info/RECORD,,
|
{python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info}/entry_points.txt
RENAMED
|
@@ -715,4 +715,3 @@ volume_type_set = openstackclient.volume.v3.volume_type:SetVolumeType
|
|
|
715
715
|
volume_type_show = openstackclient.volume.v3.volume_type:ShowVolumeType
|
|
716
716
|
volume_type_unset = openstackclient.volume.v3.volume_type:UnsetVolumeType
|
|
717
717
|
volume_unset = openstackclient.volume.v3.volume:UnsetVolume
|
|
718
|
-
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"git_version": "67f5509f", "is_release": true}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"git_version": "a1ddfa4a", "is_release": true}
|
{python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info/licenses}/AUTHORS
RENAMED
|
File without changes
|
{python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info/licenses}/LICENSE
RENAMED
|
File without changes
|
{python_openstackclient-7.1.3.dist-info → python_openstackclient-7.1.5.dist-info}/top_level.txt
RENAMED
|
File without changes
|