python-openstackclient 7.1.2__py3-none-any.whl → 7.2.0__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/api/api.py +2 -1
- openstackclient/api/image_v2.py +1 -1
- openstackclient/api/object_store_v1.py +12 -20
- openstackclient/common/clientmanager.py +1 -1
- openstackclient/common/module.py +2 -2
- openstackclient/common/quota.py +4 -4
- openstackclient/compute/v2/flavor.py +1 -1
- openstackclient/compute/v2/server.py +123 -60
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +11 -2
- openstackclient/compute/v2/usage.py +3 -3
- openstackclient/identity/common.py +4 -1
- openstackclient/identity/v2_0/project.py +1 -1
- openstackclient/identity/v2_0/role_assignment.py +1 -1
- openstackclient/identity/v2_0/user.py +2 -2
- openstackclient/identity/v3/access_rule.py +26 -14
- openstackclient/identity/v3/identity_provider.py +1 -1
- openstackclient/identity/v3/project.py +1 -1
- openstackclient/identity/v3/role_assignment.py +24 -3
- openstackclient/identity/v3/service.py +2 -1
- openstackclient/identity/v3/user.py +35 -15
- openstackclient/image/v2/image.py +13 -13
- openstackclient/image/v2/metadef_objects.py +6 -4
- openstackclient/network/common.py +8 -7
- openstackclient/network/v2/floating_ip.py +6 -2
- openstackclient/network/v2/floating_ip_port_forwarding.py +2 -2
- openstackclient/network/v2/l3_conntrack_helper.py +1 -1
- openstackclient/network/v2/ndp_proxy.py +1 -0
- openstackclient/network/v2/network_agent.py +2 -6
- openstackclient/network/v2/network_qos_rule.py +2 -5
- openstackclient/network/v2/network_trunk.py +5 -4
- openstackclient/network/v2/port.py +18 -3
- openstackclient/network/v2/router.py +7 -4
- openstackclient/network/v2/subnet_pool.py +2 -2
- openstackclient/shell.py +3 -2
- openstackclient/tests/functional/common/test_help.py +3 -9
- openstackclient/tests/functional/common/test_module.py +1 -1
- openstackclient/tests/functional/common/test_quota.py +2 -4
- openstackclient/tests/functional/compute/v2/common.py +1 -3
- openstackclient/tests/functional/compute/v2/test_hypervisor.py +3 -3
- openstackclient/tests/functional/compute/v2/test_keypair.py +2 -2
- openstackclient/tests/functional/compute/v2/test_server.py +1 -1
- openstackclient/tests/functional/identity/v2/common.py +31 -48
- openstackclient/tests/functional/identity/v2/test_catalog.py +1 -1
- openstackclient/tests/functional/identity/v2/test_ec2_credentials.py +2 -2
- openstackclient/tests/functional/identity/v2/test_endpoint.py +2 -2
- openstackclient/tests/functional/identity/v2/test_project.py +8 -8
- openstackclient/tests/functional/identity/v2/test_role.py +14 -34
- openstackclient/tests/functional/identity/v2/test_service.py +2 -2
- openstackclient/tests/functional/identity/v2/test_token.py +1 -1
- openstackclient/tests/functional/identity/v2/test_user.py +7 -9
- openstackclient/tests/functional/identity/v3/common.py +69 -110
- openstackclient/tests/functional/identity/v3/test_access_rule.py +86 -0
- openstackclient/tests/functional/identity/v3/test_application_credential.py +18 -44
- openstackclient/tests/functional/identity/v3/test_catalog.py +1 -1
- openstackclient/tests/functional/identity/v3/test_domain.py +9 -11
- openstackclient/tests/functional/identity/v3/test_endpoint.py +15 -27
- openstackclient/tests/functional/identity/v3/test_group.py +32 -93
- openstackclient/tests/functional/identity/v3/test_idp.py +3 -3
- openstackclient/tests/functional/identity/v3/test_limit.py +32 -32
- openstackclient/tests/functional/identity/v3/test_project.py +17 -26
- openstackclient/tests/functional/identity/v3/test_region.py +6 -7
- openstackclient/tests/functional/identity/v3/test_registered_limit.py +27 -36
- openstackclient/tests/functional/identity/v3/test_role.py +30 -60
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +33 -80
- openstackclient/tests/functional/identity/v3/test_service.py +7 -13
- openstackclient/tests/functional/identity/v3/test_service_provider.py +3 -3
- openstackclient/tests/functional/identity/v3/test_user.py +17 -34
- openstackclient/tests/functional/image/v2/test_image.py +1 -3
- openstackclient/tests/functional/network/v2/common.py +1 -3
- openstackclient/tests/functional/network/v2/test_default_security_group_rule.py +3 -8
- openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +27 -31
- openstackclient/tests/functional/network/v2/test_network.py +9 -12
- openstackclient/tests/functional/network/v2/test_network_agent.py +15 -20
- openstackclient/tests/functional/network/v2/test_network_flavor.py +2 -2
- openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +17 -39
- openstackclient/tests/functional/network/v2/test_network_qos_rule.py +48 -63
- openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py +1 -1
- openstackclient/tests/functional/network/v2/test_network_segment_range.py +2 -2
- openstackclient/tests/functional/network/v2/test_network_trunk.py +15 -25
- openstackclient/tests/functional/network/v2/test_port.py +28 -34
- openstackclient/tests/functional/network/v2/test_router.py +13 -19
- openstackclient/tests/functional/object/v1/test_object.py +4 -7
- openstackclient/tests/functional/volume/base.py +5 -17
- openstackclient/tests/functional/volume/v1/test_volume_type.py +11 -11
- openstackclient/tests/functional/volume/v2/test_volume_backup.py +1 -1
- openstackclient/tests/functional/volume/v2/test_volume_type.py +13 -15
- openstackclient/tests/functional/volume/v3/test_volume_type.py +13 -15
- openstackclient/tests/unit/api/test_compute_v2.py +0 -5
- openstackclient/tests/unit/api/test_object_store_v1.py +6 -4
- openstackclient/tests/unit/common/test_extension.py +24 -31
- openstackclient/tests/unit/compute/v2/test_host.py +0 -1
- openstackclient/tests/unit/compute/v2/test_server.py +124 -116
- openstackclient/tests/unit/identity/v3/test_access_rule.py +65 -64
- openstackclient/tests/unit/identity/v3/test_group.py +4 -10
- openstackclient/tests/unit/identity/v3/test_limit.py +2 -2
- openstackclient/tests/unit/identity/v3/test_service.py +0 -3
- openstackclient/tests/unit/identity/v3/test_user.py +4 -90
- openstackclient/tests/unit/image/v2/test_metadef_objects.py +1 -2
- openstackclient/tests/unit/image/v2/test_metadef_resource_type_association.py +2 -6
- openstackclient/tests/unit/integ/base.py +1 -1
- openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +3 -3
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +4 -4
- openstackclient/tests/unit/network/v2/test_local_ip_association.py +2 -2
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +12 -13
- openstackclient/tests/unit/network/v2/test_network_trunk.py +31 -35
- openstackclient/tests/unit/network/v2/test_port.py +40 -17
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +1 -1
- openstackclient/tests/unit/object/v1/test_object.py +1 -1
- openstackclient/tests/unit/utils.py +2 -2
- openstackclient/volume/client.py +1 -1
- openstackclient/volume/v1/volume.py +2 -2
- openstackclient/volume/v1/volume_backup.py +2 -2
- openstackclient/volume/v1/volume_snapshot.py +2 -2
- openstackclient/volume/v2/volume.py +2 -2
- openstackclient/volume/v2/volume_backup.py +2 -2
- openstackclient/volume/v2/volume_snapshot.py +2 -2
- openstackclient/volume/v2/volume_type.py +4 -4
- openstackclient/volume/v3/service.py +0 -1
- openstackclient/volume/v3/volume.py +3 -3
- openstackclient/volume/v3/volume_backup.py +2 -2
- openstackclient/volume/v3/volume_group.py +3 -7
- openstackclient/volume/v3/volume_type.py +6 -6
- {python_openstackclient-7.1.2.dist-info → python_openstackclient-7.2.0.dist-info}/AUTHORS +3 -0
- {python_openstackclient-7.1.2.dist-info → python_openstackclient-7.2.0.dist-info}/METADATA +2 -3
- {python_openstackclient-7.1.2.dist-info → python_openstackclient-7.2.0.dist-info}/RECORD +132 -131
- python_openstackclient-7.2.0.dist-info/pbr.json +1 -0
- python_openstackclient-7.1.2.dist-info/pbr.json +0 -1
- {python_openstackclient-7.1.2.dist-info → python_openstackclient-7.2.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-7.1.2.dist-info → python_openstackclient-7.2.0.dist-info}/WHEEL +0 -0
- {python_openstackclient-7.1.2.dist-info → python_openstackclient-7.2.0.dist-info}/entry_points.txt +0 -0
- {python_openstackclient-7.1.2.dist-info → python_openstackclient-7.2.0.dist-info}/top_level.txt +0 -0
|
@@ -156,10 +156,9 @@ class IdentityTests(base.TestCase):
|
|
|
156
156
|
cls.openstack(
|
|
157
157
|
'--os-identity-api-version 3 '
|
|
158
158
|
'domain create '
|
|
159
|
-
'--description
|
|
159
|
+
f'--description {cls.domain_description} '
|
|
160
160
|
'--enable '
|
|
161
|
-
'
|
|
162
|
-
% {'description': cls.domain_description, 'name': cls.domain_name}
|
|
161
|
+
f'{cls.domain_name}'
|
|
163
162
|
)
|
|
164
163
|
|
|
165
164
|
# create dummy project
|
|
@@ -168,15 +167,10 @@ class IdentityTests(base.TestCase):
|
|
|
168
167
|
cls.openstack(
|
|
169
168
|
'--os-identity-api-version 3 '
|
|
170
169
|
'project create '
|
|
171
|
-
'--domain
|
|
172
|
-
'--description
|
|
170
|
+
f'--domain {cls.domain_name} '
|
|
171
|
+
f'--description {cls.project_description} '
|
|
173
172
|
'--enable '
|
|
174
|
-
'
|
|
175
|
-
% {
|
|
176
|
-
'domain': cls.domain_name,
|
|
177
|
-
'description': cls.project_description,
|
|
178
|
-
'name': cls.project_name,
|
|
179
|
-
}
|
|
173
|
+
f'{cls.project_name}'
|
|
180
174
|
)
|
|
181
175
|
|
|
182
176
|
@classmethod
|
|
@@ -185,16 +179,16 @@ class IdentityTests(base.TestCase):
|
|
|
185
179
|
# delete dummy project
|
|
186
180
|
cls.openstack(
|
|
187
181
|
'--os-identity-api-version 3 '
|
|
188
|
-
'project delete
|
|
182
|
+
f'project delete {cls.project_name}'
|
|
189
183
|
)
|
|
190
184
|
# disable and delete dummy domain
|
|
191
185
|
cls.openstack(
|
|
192
186
|
'--os-identity-api-version 3 '
|
|
193
|
-
'domain set --disable
|
|
187
|
+
f'domain set --disable {cls.domain_name}'
|
|
194
188
|
)
|
|
195
189
|
cls.openstack(
|
|
196
190
|
'--os-identity-api-version 3 '
|
|
197
|
-
'domain delete
|
|
191
|
+
f'domain delete {cls.domain_name}'
|
|
198
192
|
)
|
|
199
193
|
finally:
|
|
200
194
|
super().tearDownClass()
|
|
@@ -220,28 +214,21 @@ class IdentityTests(base.TestCase):
|
|
|
220
214
|
description = data_utils.rand_name('description')
|
|
221
215
|
raw_output = self.openstack(
|
|
222
216
|
'user create '
|
|
223
|
-
'--domain
|
|
224
|
-
'--project
|
|
225
|
-
'--project-domain
|
|
226
|
-
'--password
|
|
227
|
-
'--email
|
|
228
|
-
'--description
|
|
217
|
+
f'--domain {self.domain_name} '
|
|
218
|
+
f'--project {self.project_name} '
|
|
219
|
+
f'--project-domain {self.domain_name} '
|
|
220
|
+
f'--password {password} '
|
|
221
|
+
f'--email {email} '
|
|
222
|
+
f'--description {description} '
|
|
229
223
|
'--enable '
|
|
230
|
-
'
|
|
231
|
-
% {
|
|
232
|
-
'domain': self.domain_name,
|
|
233
|
-
'project': self.project_name,
|
|
234
|
-
'project_domain': self.domain_name,
|
|
235
|
-
'email': email,
|
|
236
|
-
'password': password,
|
|
237
|
-
'description': description,
|
|
238
|
-
'name': username,
|
|
239
|
-
}
|
|
224
|
+
f'{username}'
|
|
240
225
|
)
|
|
241
226
|
if add_clean_up:
|
|
242
227
|
self.addCleanup(
|
|
243
228
|
self.openstack,
|
|
244
|
-
'user delete
|
|
229
|
+
'user delete {}'.format(
|
|
230
|
+
self.parse_show_as_object(raw_output)['id']
|
|
231
|
+
),
|
|
245
232
|
)
|
|
246
233
|
items = self.parse_show(raw_output)
|
|
247
234
|
self.assert_show_fields(items, self.USER_FIELDS)
|
|
@@ -249,10 +236,12 @@ class IdentityTests(base.TestCase):
|
|
|
249
236
|
|
|
250
237
|
def _create_dummy_role(self, add_clean_up=True):
|
|
251
238
|
role_name = data_utils.rand_name('TestRole')
|
|
252
|
-
raw_output = self.openstack('role create
|
|
239
|
+
raw_output = self.openstack(f'role create {role_name}')
|
|
253
240
|
role = self.parse_show_as_object(raw_output)
|
|
254
241
|
if add_clean_up:
|
|
255
|
-
self.addCleanup(
|
|
242
|
+
self.addCleanup(
|
|
243
|
+
self.openstack, 'role delete {}'.format(role['id'])
|
|
244
|
+
)
|
|
256
245
|
items = self.parse_show(raw_output)
|
|
257
246
|
self.assert_show_fields(items, self.ROLE_FIELDS)
|
|
258
247
|
self.assertEqual(role_name, role['name'])
|
|
@@ -263,8 +252,8 @@ class IdentityTests(base.TestCase):
|
|
|
263
252
|
implied_role_name = self._create_dummy_role(add_clean_up)
|
|
264
253
|
self.openstack(
|
|
265
254
|
'implied role create '
|
|
266
|
-
'--implied-role
|
|
267
|
-
'
|
|
255
|
+
f'--implied-role {implied_role_name} '
|
|
256
|
+
f'{role_name}'
|
|
268
257
|
)
|
|
269
258
|
|
|
270
259
|
return implied_role_name, role_name
|
|
@@ -274,21 +263,16 @@ class IdentityTests(base.TestCase):
|
|
|
274
263
|
description = data_utils.rand_name('description')
|
|
275
264
|
raw_output = self.openstack(
|
|
276
265
|
'group create '
|
|
277
|
-
'--domain
|
|
278
|
-
'--description
|
|
279
|
-
'
|
|
280
|
-
% {
|
|
281
|
-
'domain': self.domain_name,
|
|
282
|
-
'description': description,
|
|
283
|
-
'name': group_name,
|
|
284
|
-
}
|
|
266
|
+
f'--domain {self.domain_name} '
|
|
267
|
+
f'--description {description} '
|
|
268
|
+
f'{group_name}'
|
|
285
269
|
)
|
|
286
270
|
if add_clean_up:
|
|
287
271
|
self.addCleanup(
|
|
288
272
|
self.openstack,
|
|
289
273
|
'group delete '
|
|
290
|
-
'--domain
|
|
291
|
-
'
|
|
274
|
+
f'--domain {self.domain_name} '
|
|
275
|
+
f'{group_name}',
|
|
292
276
|
)
|
|
293
277
|
items = self.parse_show(raw_output)
|
|
294
278
|
self.assert_show_fields(items, self.GROUP_FIELDS)
|
|
@@ -299,14 +283,13 @@ class IdentityTests(base.TestCase):
|
|
|
299
283
|
domain_description = data_utils.rand_name('description')
|
|
300
284
|
self.openstack(
|
|
301
285
|
'domain create '
|
|
302
|
-
'--description
|
|
303
|
-
'--enable
|
|
304
|
-
% {'description': domain_description, 'name': domain_name}
|
|
286
|
+
f'--description {domain_description} '
|
|
287
|
+
f'--enable {domain_name}'
|
|
305
288
|
)
|
|
306
289
|
if add_clean_up:
|
|
307
|
-
self.addCleanup(self.openstack, 'domain delete
|
|
290
|
+
self.addCleanup(self.openstack, f'domain delete {domain_name}')
|
|
308
291
|
self.addCleanup(
|
|
309
|
-
self.openstack, 'domain set --disable
|
|
292
|
+
self.openstack, f'domain set --disable {domain_name}'
|
|
310
293
|
)
|
|
311
294
|
return domain_name
|
|
312
295
|
|
|
@@ -315,22 +298,16 @@ class IdentityTests(base.TestCase):
|
|
|
315
298
|
project_description = data_utils.rand_name('description')
|
|
316
299
|
self.openstack(
|
|
317
300
|
'project create '
|
|
318
|
-
'--domain
|
|
319
|
-
'--description
|
|
320
|
-
'--enable
|
|
321
|
-
% {
|
|
322
|
-
'domain': self.domain_name,
|
|
323
|
-
'description': project_description,
|
|
324
|
-
'name': project_name,
|
|
325
|
-
}
|
|
301
|
+
f'--domain {self.domain_name} '
|
|
302
|
+
f'--description {project_description} '
|
|
303
|
+
f'--enable {project_name}'
|
|
326
304
|
)
|
|
327
305
|
if add_clean_up:
|
|
328
306
|
self.addCleanup(
|
|
329
307
|
self.openstack,
|
|
330
308
|
'project delete '
|
|
331
|
-
'--domain
|
|
332
|
-
'
|
|
333
|
-
% {'domain': self.domain_name, 'name': project_name},
|
|
309
|
+
f'--domain {self.domain_name} '
|
|
310
|
+
f'{project_name}',
|
|
334
311
|
)
|
|
335
312
|
return project_name
|
|
336
313
|
|
|
@@ -339,20 +316,15 @@ class IdentityTests(base.TestCase):
|
|
|
339
316
|
description = data_utils.rand_name('description')
|
|
340
317
|
parent_region_arg = ''
|
|
341
318
|
if parent_region is not None:
|
|
342
|
-
parent_region_arg = '--parent-region
|
|
319
|
+
parent_region_arg = f'--parent-region {parent_region}'
|
|
343
320
|
raw_output = self.openstack(
|
|
344
321
|
'region create '
|
|
345
|
-
'
|
|
346
|
-
'--description
|
|
347
|
-
'
|
|
348
|
-
% {
|
|
349
|
-
'parent_region_arg': parent_region_arg,
|
|
350
|
-
'description': description,
|
|
351
|
-
'id': region_id,
|
|
352
|
-
}
|
|
322
|
+
f'{parent_region_arg} '
|
|
323
|
+
f'--description {description} '
|
|
324
|
+
f'{region_id}'
|
|
353
325
|
)
|
|
354
326
|
if add_clean_up:
|
|
355
|
-
self.addCleanup(self.openstack, 'region delete
|
|
327
|
+
self.addCleanup(self.openstack, f'region delete {region_id}')
|
|
356
328
|
items = self.parse_show(raw_output)
|
|
357
329
|
self.assert_show_fields(items, self.REGION_FIELDS)
|
|
358
330
|
return region_id
|
|
@@ -363,20 +335,15 @@ class IdentityTests(base.TestCase):
|
|
|
363
335
|
type_name = data_utils.rand_name('TestType')
|
|
364
336
|
raw_output = self.openstack(
|
|
365
337
|
'service create '
|
|
366
|
-
'--name
|
|
367
|
-
'--description
|
|
338
|
+
f'--name {service_name} '
|
|
339
|
+
f'--description {description} '
|
|
368
340
|
'--enable '
|
|
369
|
-
'
|
|
370
|
-
% {
|
|
371
|
-
'name': service_name,
|
|
372
|
-
'description': description,
|
|
373
|
-
'type': type_name,
|
|
374
|
-
}
|
|
341
|
+
f'{type_name}'
|
|
375
342
|
)
|
|
376
343
|
if add_clean_up:
|
|
377
344
|
service = self.parse_show_as_object(raw_output)
|
|
378
345
|
self.addCleanup(
|
|
379
|
-
self.openstack, 'service delete
|
|
346
|
+
self.openstack, 'service delete {}'.format(service['id'])
|
|
380
347
|
)
|
|
381
348
|
items = self.parse_show(raw_output)
|
|
382
349
|
self.assert_show_fields(items, self.SERVICE_FIELDS)
|
|
@@ -388,22 +355,16 @@ class IdentityTests(base.TestCase):
|
|
|
388
355
|
endpoint_url = data_utils.rand_url()
|
|
389
356
|
raw_output = self.openstack(
|
|
390
357
|
'endpoint create '
|
|
391
|
-
'--region
|
|
358
|
+
f'--region {region_id} '
|
|
392
359
|
'--enable '
|
|
393
|
-
'
|
|
394
|
-
'
|
|
395
|
-
'
|
|
396
|
-
% {
|
|
397
|
-
'region': region_id,
|
|
398
|
-
'service': service_name,
|
|
399
|
-
'interface': interface,
|
|
400
|
-
'url': endpoint_url,
|
|
401
|
-
}
|
|
360
|
+
f'{service_name} '
|
|
361
|
+
f'{interface} '
|
|
362
|
+
f'{endpoint_url}'
|
|
402
363
|
)
|
|
403
364
|
endpoint = self.parse_show_as_object(raw_output)
|
|
404
365
|
if add_clean_up:
|
|
405
366
|
self.addCleanup(
|
|
406
|
-
self.openstack, 'endpoint delete
|
|
367
|
+
self.openstack, 'endpoint delete {}'.format(endpoint['id'])
|
|
407
368
|
)
|
|
408
369
|
items = self.parse_show(raw_output)
|
|
409
370
|
self.assert_show_fields(items, self.ENDPOINT_FIELDS)
|
|
@@ -414,15 +375,14 @@ class IdentityTests(base.TestCase):
|
|
|
414
375
|
description = data_utils.rand_name('description')
|
|
415
376
|
raw_output = self.openstack(
|
|
416
377
|
'identity provider create '
|
|
417
|
-
'
|
|
418
|
-
'--description
|
|
378
|
+
f' {identity_provider} '
|
|
379
|
+
f'--description {description} '
|
|
419
380
|
'--enable '
|
|
420
|
-
% {'name': identity_provider, 'description': description}
|
|
421
381
|
)
|
|
422
382
|
if add_clean_up:
|
|
423
383
|
self.addCleanup(
|
|
424
384
|
self.openstack,
|
|
425
|
-
'identity provider delete
|
|
385
|
+
f'identity provider delete {identity_provider}',
|
|
426
386
|
)
|
|
427
387
|
items = self.parse_show(raw_output)
|
|
428
388
|
self.assert_show_fields(items, self.IDENTITY_PROVIDER_FIELDS)
|
|
@@ -433,16 +393,15 @@ class IdentityTests(base.TestCase):
|
|
|
433
393
|
description = data_utils.rand_name('description')
|
|
434
394
|
raw_output = self.openstack(
|
|
435
395
|
'service provider create '
|
|
436
|
-
'
|
|
437
|
-
'--description
|
|
396
|
+
f' {service_provider} '
|
|
397
|
+
f'--description {description} '
|
|
438
398
|
'--auth-url https://sp.example.com:35357 '
|
|
439
399
|
'--service-provider-url https://sp.example.com:5000 '
|
|
440
400
|
'--enable '
|
|
441
|
-
% {'name': service_provider, 'description': description}
|
|
442
401
|
)
|
|
443
402
|
if add_clean_up:
|
|
444
403
|
self.addCleanup(
|
|
445
|
-
self.openstack, 'service provider delete
|
|
404
|
+
self.openstack, f'service provider delete {service_provider}'
|
|
446
405
|
)
|
|
447
406
|
items = self.parse_show(raw_output)
|
|
448
407
|
self.assert_show_fields(items, self.SERVICE_PROVIDER_FIELDS)
|
|
@@ -458,9 +417,9 @@ class IdentityTests(base.TestCase):
|
|
|
458
417
|
}
|
|
459
418
|
raw_output = self.openstack(
|
|
460
419
|
'registered limit create'
|
|
461
|
-
' --service
|
|
462
|
-
' --default-limit
|
|
463
|
-
'
|
|
420
|
+
' --service {service_name}'
|
|
421
|
+
' --default-limit {default_limit}'
|
|
422
|
+
' {resource_name}'.format(**params),
|
|
464
423
|
cloud=SYSTEM_CLOUD,
|
|
465
424
|
)
|
|
466
425
|
items = self.parse_show(raw_output)
|
|
@@ -469,7 +428,7 @@ class IdentityTests(base.TestCase):
|
|
|
469
428
|
if add_clean_up:
|
|
470
429
|
self.addCleanup(
|
|
471
430
|
self.openstack,
|
|
472
|
-
'registered limit delete
|
|
431
|
+
f'registered limit delete {registered_limit_id}',
|
|
473
432
|
cloud=SYSTEM_CLOUD,
|
|
474
433
|
)
|
|
475
434
|
|
|
@@ -486,7 +445,7 @@ class IdentityTests(base.TestCase):
|
|
|
486
445
|
registered_limit_id = self._create_dummy_registered_limit()
|
|
487
446
|
|
|
488
447
|
raw_output = self.openstack(
|
|
489
|
-
'registered limit show
|
|
448
|
+
f'registered limit show {registered_limit_id}',
|
|
490
449
|
cloud=SYSTEM_CLOUD,
|
|
491
450
|
)
|
|
492
451
|
items = self.parse_show(raw_output)
|
|
@@ -495,7 +454,7 @@ class IdentityTests(base.TestCase):
|
|
|
495
454
|
resource_limit = 15
|
|
496
455
|
|
|
497
456
|
project_name = self._create_dummy_project()
|
|
498
|
-
raw_output = self.openstack('project show
|
|
457
|
+
raw_output = self.openstack(f'project show {project_name}')
|
|
499
458
|
items = self.parse_show(raw_output)
|
|
500
459
|
project_id = self._extract_value_from_items('id', items)
|
|
501
460
|
|
|
@@ -508,10 +467,10 @@ class IdentityTests(base.TestCase):
|
|
|
508
467
|
|
|
509
468
|
raw_output = self.openstack(
|
|
510
469
|
'limit create'
|
|
511
|
-
' --project
|
|
512
|
-
' --service
|
|
513
|
-
' --resource-limit
|
|
514
|
-
'
|
|
470
|
+
' --project {project_id}'
|
|
471
|
+
' --service {service_id}'
|
|
472
|
+
' --resource-limit {resource_limit}'
|
|
473
|
+
' {resource_name}'.format(**params),
|
|
515
474
|
cloud=SYSTEM_CLOUD,
|
|
516
475
|
)
|
|
517
476
|
items = self.parse_show(raw_output)
|
|
@@ -520,7 +479,7 @@ class IdentityTests(base.TestCase):
|
|
|
520
479
|
if add_clean_up:
|
|
521
480
|
self.addCleanup(
|
|
522
481
|
self.openstack,
|
|
523
|
-
'limit delete
|
|
482
|
+
f'limit delete {limit_id}',
|
|
524
483
|
cloud=SYSTEM_CLOUD,
|
|
525
484
|
)
|
|
526
485
|
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
2
|
+
# not use this file except in compliance with the License. You may obtain
|
|
3
|
+
# a copy of the License at
|
|
4
|
+
#
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
#
|
|
7
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
8
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
9
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
10
|
+
# License for the specific language governing permissions and limitations
|
|
11
|
+
# under the License.
|
|
12
|
+
|
|
13
|
+
import ast
|
|
14
|
+
import json
|
|
15
|
+
|
|
16
|
+
from tempest.lib.common.utils import data_utils
|
|
17
|
+
|
|
18
|
+
from openstackclient.tests.functional.identity.v3 import common
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class AccessRuleTests(common.IdentityTests):
|
|
22
|
+
ACCESS_RULE_FIELDS = [
|
|
23
|
+
'ID',
|
|
24
|
+
'Service',
|
|
25
|
+
'Method',
|
|
26
|
+
'Path',
|
|
27
|
+
]
|
|
28
|
+
ACCESS_RULE_LIST_HEADERS = [
|
|
29
|
+
'ID',
|
|
30
|
+
'Service',
|
|
31
|
+
'Method',
|
|
32
|
+
'Path',
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
def setUp(self):
|
|
36
|
+
super().setUp()
|
|
37
|
+
|
|
38
|
+
application_credential_name = data_utils.rand_name('name')
|
|
39
|
+
access_rules = json.dumps(
|
|
40
|
+
[
|
|
41
|
+
{
|
|
42
|
+
'method': 'GET',
|
|
43
|
+
'path': '/v2.1/servers',
|
|
44
|
+
'service': 'compute',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
'method': 'GET',
|
|
48
|
+
'path': '/v2.0/networks',
|
|
49
|
+
'service': 'networking',
|
|
50
|
+
},
|
|
51
|
+
]
|
|
52
|
+
)
|
|
53
|
+
raw_output = self.openstack(
|
|
54
|
+
f"application credential create {application_credential_name} "
|
|
55
|
+
f"--access-rules '{access_rules}'"
|
|
56
|
+
)
|
|
57
|
+
# we immediately delete the application credential since it will leave
|
|
58
|
+
# the access rules around
|
|
59
|
+
self.openstack(
|
|
60
|
+
f'application credential delete {application_credential_name}'
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
items = self.parse_show_as_object(raw_output)
|
|
64
|
+
self.access_rule_ids = [
|
|
65
|
+
x['id'] for x in ast.literal_eval(items['access_rules'])
|
|
66
|
+
]
|
|
67
|
+
self.addCleanup(
|
|
68
|
+
self.openstack,
|
|
69
|
+
'access rule delete '
|
|
70
|
+
+ ' '.join([x for x in self.access_rule_ids]),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def test_access_rule(self):
|
|
74
|
+
# list
|
|
75
|
+
|
|
76
|
+
raw_output = self.openstack('access rule list')
|
|
77
|
+
items = self.parse_listing(raw_output)
|
|
78
|
+
self.assert_table_structure(items, self.ACCESS_RULE_LIST_HEADERS)
|
|
79
|
+
|
|
80
|
+
# show
|
|
81
|
+
|
|
82
|
+
raw_output = self.openstack(
|
|
83
|
+
f'access rule show {self.access_rule_ids[0]}'
|
|
84
|
+
)
|
|
85
|
+
items = self.parse_show(raw_output)
|
|
86
|
+
self.assert_show_fields(items, self.ACCESS_RULE_FIELDS)
|
|
@@ -85,34 +85,20 @@ class ApplicationCredentialTests(common.IdentityTests):
|
|
|
85
85
|
for role in role1, role2:
|
|
86
86
|
self.openstack(
|
|
87
87
|
'role add'
|
|
88
|
-
' --user
|
|
89
|
-
' --user-domain
|
|
90
|
-
' --project
|
|
91
|
-
' --project-domain
|
|
92
|
-
'
|
|
93
|
-
% {
|
|
94
|
-
'user': user,
|
|
95
|
-
'user_domain': user_domain,
|
|
96
|
-
'project': project,
|
|
97
|
-
'project_domain': project_domain,
|
|
98
|
-
'role': role,
|
|
99
|
-
}
|
|
88
|
+
f' --user {user}'
|
|
89
|
+
f' --user-domain {user_domain}'
|
|
90
|
+
f' --project {project}'
|
|
91
|
+
f' --project-domain {project_domain}'
|
|
92
|
+
f' {role}'
|
|
100
93
|
)
|
|
101
94
|
self.addCleanup(
|
|
102
95
|
self.openstack,
|
|
103
96
|
'role remove'
|
|
104
|
-
' --user
|
|
105
|
-
' --user-domain
|
|
106
|
-
' --project
|
|
107
|
-
' --project-domain
|
|
108
|
-
'
|
|
109
|
-
% {
|
|
110
|
-
'user': user,
|
|
111
|
-
'user_domain': user_domain,
|
|
112
|
-
'project': project,
|
|
113
|
-
'project_domain': project_domain,
|
|
114
|
-
'role': role,
|
|
115
|
-
},
|
|
97
|
+
f' --user {user}'
|
|
98
|
+
f' --user-domain {user_domain}'
|
|
99
|
+
f' --project {project}'
|
|
100
|
+
f' --project-domain {project_domain}'
|
|
101
|
+
f' {role}',
|
|
116
102
|
)
|
|
117
103
|
return role1, role2
|
|
118
104
|
|
|
@@ -125,21 +111,13 @@ class ApplicationCredentialTests(common.IdentityTests):
|
|
|
125
111
|
).strftime('%Y-%m-%dT%H:%M:%S%z')
|
|
126
112
|
role1, role2 = self._create_role_assignments()
|
|
127
113
|
raw_output = self.openstack(
|
|
128
|
-
'application credential create
|
|
129
|
-
' --secret
|
|
130
|
-
' --description
|
|
131
|
-
' --expiration
|
|
132
|
-
' --role
|
|
133
|
-
' --role
|
|
114
|
+
f'application credential create {name}'
|
|
115
|
+
f' --secret {secret}'
|
|
116
|
+
f' --description {description}'
|
|
117
|
+
f' --expiration {tomorrow}'
|
|
118
|
+
f' --role {role1}'
|
|
119
|
+
f' --role {role2}'
|
|
134
120
|
' --unrestricted'
|
|
135
|
-
% {
|
|
136
|
-
'name': name,
|
|
137
|
-
'secret': secret,
|
|
138
|
-
'description': description,
|
|
139
|
-
'tomorrow': tomorrow,
|
|
140
|
-
'role1': role1,
|
|
141
|
-
'role2': role2,
|
|
142
|
-
}
|
|
143
121
|
)
|
|
144
122
|
self.addCleanup(
|
|
145
123
|
self.openstack,
|
|
@@ -151,9 +129,7 @@ class ApplicationCredentialTests(common.IdentityTests):
|
|
|
151
129
|
def test_application_credential_delete(self):
|
|
152
130
|
name = data_utils.rand_name('name')
|
|
153
131
|
self.openstack(f'application credential create {name}')
|
|
154
|
-
raw_output = self.openstack(
|
|
155
|
-
'application credential delete ' '%(name)s' % {'name': name}
|
|
156
|
-
)
|
|
132
|
+
raw_output = self.openstack('application credential delete ' f'{name}')
|
|
157
133
|
self.assertEqual(0, len(raw_output))
|
|
158
134
|
|
|
159
135
|
def test_application_credential_list(self):
|
|
@@ -170,8 +146,6 @@ class ApplicationCredentialTests(common.IdentityTests):
|
|
|
170
146
|
self.openstack,
|
|
171
147
|
f'application credential delete {name}',
|
|
172
148
|
)
|
|
173
|
-
raw_output = self.openstack(
|
|
174
|
-
'application credential show ' '%(name)s' % {'name': name}
|
|
175
|
-
)
|
|
149
|
+
raw_output = self.openstack('application credential show ' f'{name}')
|
|
176
150
|
items = self.parse_show(raw_output)
|
|
177
151
|
self.assert_show_fields(items, self.APPLICATION_CREDENTIAL_FIELDS)
|
|
@@ -38,7 +38,7 @@ class CatalogTests(common.IdentityTests):
|
|
|
38
38
|
| type | identity |
|
|
39
39
|
+-----------+----------------------------------------+
|
|
40
40
|
"""
|
|
41
|
-
raw_output = self.openstack('catalog show
|
|
41
|
+
raw_output = self.openstack('catalog show {}'.format('identity'))
|
|
42
42
|
items = self.parse_show(raw_output)
|
|
43
43
|
# items may have multiple endpoint urls with empty key
|
|
44
44
|
self.assert_show_fields(items, ['endpoints', 'name', 'type', '', 'id'])
|
|
@@ -19,12 +19,10 @@ from openstackclient.tests.functional.identity.v3 import common
|
|
|
19
19
|
class DomainTests(common.IdentityTests):
|
|
20
20
|
def test_domain_create(self):
|
|
21
21
|
domain_name = data_utils.rand_name('TestDomain')
|
|
22
|
-
raw_output = self.openstack('domain create
|
|
22
|
+
raw_output = self.openstack(f'domain create {domain_name}')
|
|
23
23
|
# disable domain first before deleting it
|
|
24
|
-
self.addCleanup(self.openstack, 'domain delete
|
|
25
|
-
self.addCleanup(
|
|
26
|
-
self.openstack, 'domain set --disable %s' % domain_name
|
|
27
|
-
)
|
|
24
|
+
self.addCleanup(self.openstack, f'domain delete {domain_name}')
|
|
25
|
+
self.addCleanup(self.openstack, f'domain set --disable {domain_name}')
|
|
28
26
|
items = self.parse_show(raw_output)
|
|
29
27
|
self.assert_show_fields(items, self.DOMAIN_FIELDS)
|
|
30
28
|
|
|
@@ -37,18 +35,18 @@ class DomainTests(common.IdentityTests):
|
|
|
37
35
|
def test_domain_delete(self):
|
|
38
36
|
domain_name = self._create_dummy_domain(add_clean_up=False)
|
|
39
37
|
# cannot delete enabled domain, disable it first
|
|
40
|
-
raw_output = self.openstack('domain set --disable
|
|
38
|
+
raw_output = self.openstack(f'domain set --disable {domain_name}')
|
|
41
39
|
self.assertEqual(0, len(raw_output))
|
|
42
|
-
raw_output = self.openstack('domain delete
|
|
40
|
+
raw_output = self.openstack(f'domain delete {domain_name}')
|
|
43
41
|
self.assertEqual(0, len(raw_output))
|
|
44
42
|
|
|
45
43
|
def test_domain_multi_delete(self):
|
|
46
44
|
domain_1 = self._create_dummy_domain(add_clean_up=False)
|
|
47
45
|
domain_2 = self._create_dummy_domain(add_clean_up=False)
|
|
48
46
|
# cannot delete enabled domain, disable it first
|
|
49
|
-
raw_output = self.openstack('domain set --disable
|
|
47
|
+
raw_output = self.openstack(f'domain set --disable {domain_1}')
|
|
50
48
|
self.assertEqual(0, len(raw_output))
|
|
51
|
-
raw_output = self.openstack('domain set --disable
|
|
49
|
+
raw_output = self.openstack(f'domain set --disable {domain_2}')
|
|
52
50
|
self.assertEqual(0, len(raw_output))
|
|
53
51
|
raw_output = self.openstack(f'domain delete {domain_1} {domain_2}')
|
|
54
52
|
self.assertEqual(0, len(raw_output))
|
|
@@ -59,11 +57,11 @@ class DomainTests(common.IdentityTests):
|
|
|
59
57
|
self.assertRaises(
|
|
60
58
|
exceptions.CommandFailed,
|
|
61
59
|
self.openstack,
|
|
62
|
-
'domain delete
|
|
60
|
+
f'domain delete {domain_name}',
|
|
63
61
|
)
|
|
64
62
|
|
|
65
63
|
def test_domain_show(self):
|
|
66
64
|
domain_name = self._create_dummy_domain()
|
|
67
|
-
raw_output = self.openstack('domain show
|
|
65
|
+
raw_output = self.openstack(f'domain show {domain_name}')
|
|
68
66
|
items = self.parse_show(raw_output)
|
|
69
67
|
self.assert_show_fields(items, self.DOMAIN_FIELDS)
|