python-openstackclient 7.1.3__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.
Files changed (128) hide show
  1. openstackclient/api/api.py +2 -1
  2. openstackclient/api/image_v2.py +1 -1
  3. openstackclient/api/object_store_v1.py +12 -20
  4. openstackclient/common/clientmanager.py +1 -1
  5. openstackclient/common/module.py +2 -2
  6. openstackclient/common/quota.py +4 -4
  7. openstackclient/compute/v2/flavor.py +1 -1
  8. openstackclient/compute/v2/server.py +122 -59
  9. openstackclient/compute/v2/server_backup.py +1 -1
  10. openstackclient/compute/v2/server_image.py +1 -1
  11. openstackclient/compute/v2/server_migration.py +11 -2
  12. openstackclient/compute/v2/usage.py +3 -3
  13. openstackclient/identity/common.py +1 -1
  14. openstackclient/identity/v2_0/project.py +1 -1
  15. openstackclient/identity/v2_0/role_assignment.py +1 -1
  16. openstackclient/identity/v2_0/user.py +2 -2
  17. openstackclient/identity/v3/access_rule.py +26 -14
  18. openstackclient/identity/v3/identity_provider.py +1 -1
  19. openstackclient/identity/v3/project.py +1 -1
  20. openstackclient/image/v2/image.py +13 -13
  21. openstackclient/image/v2/metadef_objects.py +6 -4
  22. openstackclient/network/common.py +8 -7
  23. openstackclient/network/v2/floating_ip.py +6 -2
  24. openstackclient/network/v2/floating_ip_port_forwarding.py +2 -2
  25. openstackclient/network/v2/l3_conntrack_helper.py +1 -1
  26. openstackclient/network/v2/ndp_proxy.py +1 -0
  27. openstackclient/network/v2/network_agent.py +2 -6
  28. openstackclient/network/v2/network_qos_rule.py +2 -5
  29. openstackclient/network/v2/network_trunk.py +5 -4
  30. openstackclient/network/v2/port.py +18 -3
  31. openstackclient/network/v2/router.py +7 -4
  32. openstackclient/network/v2/subnet_pool.py +2 -2
  33. openstackclient/shell.py +3 -2
  34. openstackclient/tests/functional/common/test_help.py +3 -9
  35. openstackclient/tests/functional/common/test_module.py +1 -1
  36. openstackclient/tests/functional/common/test_quota.py +2 -4
  37. openstackclient/tests/functional/compute/v2/common.py +1 -3
  38. openstackclient/tests/functional/compute/v2/test_hypervisor.py +3 -3
  39. openstackclient/tests/functional/compute/v2/test_keypair.py +2 -2
  40. openstackclient/tests/functional/compute/v2/test_server.py +1 -1
  41. openstackclient/tests/functional/identity/v2/common.py +31 -48
  42. openstackclient/tests/functional/identity/v2/test_catalog.py +1 -1
  43. openstackclient/tests/functional/identity/v2/test_ec2_credentials.py +2 -2
  44. openstackclient/tests/functional/identity/v2/test_endpoint.py +2 -2
  45. openstackclient/tests/functional/identity/v2/test_project.py +8 -8
  46. openstackclient/tests/functional/identity/v2/test_role.py +14 -34
  47. openstackclient/tests/functional/identity/v2/test_service.py +2 -2
  48. openstackclient/tests/functional/identity/v2/test_token.py +1 -1
  49. openstackclient/tests/functional/identity/v2/test_user.py +7 -9
  50. openstackclient/tests/functional/identity/v3/common.py +69 -110
  51. openstackclient/tests/functional/identity/v3/test_access_rule.py +86 -0
  52. openstackclient/tests/functional/identity/v3/test_application_credential.py +18 -44
  53. openstackclient/tests/functional/identity/v3/test_catalog.py +1 -1
  54. openstackclient/tests/functional/identity/v3/test_domain.py +9 -11
  55. openstackclient/tests/functional/identity/v3/test_endpoint.py +15 -27
  56. openstackclient/tests/functional/identity/v3/test_group.py +32 -93
  57. openstackclient/tests/functional/identity/v3/test_idp.py +3 -3
  58. openstackclient/tests/functional/identity/v3/test_limit.py +32 -32
  59. openstackclient/tests/functional/identity/v3/test_project.py +17 -26
  60. openstackclient/tests/functional/identity/v3/test_region.py +6 -7
  61. openstackclient/tests/functional/identity/v3/test_registered_limit.py +27 -36
  62. openstackclient/tests/functional/identity/v3/test_role.py +30 -60
  63. openstackclient/tests/functional/identity/v3/test_role_assignment.py +33 -80
  64. openstackclient/tests/functional/identity/v3/test_service.py +7 -13
  65. openstackclient/tests/functional/identity/v3/test_service_provider.py +3 -3
  66. openstackclient/tests/functional/identity/v3/test_user.py +17 -34
  67. openstackclient/tests/functional/image/v2/test_image.py +1 -3
  68. openstackclient/tests/functional/network/v2/common.py +1 -3
  69. openstackclient/tests/functional/network/v2/test_default_security_group_rule.py +3 -8
  70. openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +27 -31
  71. openstackclient/tests/functional/network/v2/test_network.py +9 -12
  72. openstackclient/tests/functional/network/v2/test_network_agent.py +15 -20
  73. openstackclient/tests/functional/network/v2/test_network_flavor.py +2 -2
  74. openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +17 -39
  75. openstackclient/tests/functional/network/v2/test_network_qos_rule.py +48 -63
  76. openstackclient/tests/functional/network/v2/test_network_qos_rule_type.py +1 -1
  77. openstackclient/tests/functional/network/v2/test_network_segment_range.py +2 -2
  78. openstackclient/tests/functional/network/v2/test_network_trunk.py +15 -25
  79. openstackclient/tests/functional/network/v2/test_port.py +28 -34
  80. openstackclient/tests/functional/network/v2/test_router.py +13 -19
  81. openstackclient/tests/functional/object/v1/test_object.py +4 -7
  82. openstackclient/tests/functional/volume/base.py +5 -17
  83. openstackclient/tests/functional/volume/v1/test_volume_type.py +11 -11
  84. openstackclient/tests/functional/volume/v2/test_volume_backup.py +1 -1
  85. openstackclient/tests/functional/volume/v2/test_volume_type.py +13 -15
  86. openstackclient/tests/functional/volume/v3/test_volume_type.py +13 -15
  87. openstackclient/tests/unit/api/test_compute_v2.py +0 -5
  88. openstackclient/tests/unit/api/test_object_store_v1.py +6 -4
  89. openstackclient/tests/unit/common/test_extension.py +24 -31
  90. openstackclient/tests/unit/compute/v2/test_host.py +0 -1
  91. openstackclient/tests/unit/compute/v2/test_server.py +123 -115
  92. openstackclient/tests/unit/identity/v3/test_access_rule.py +65 -64
  93. openstackclient/tests/unit/identity/v3/test_group.py +4 -10
  94. openstackclient/tests/unit/identity/v3/test_limit.py +2 -2
  95. openstackclient/tests/unit/image/v2/test_metadef_objects.py +1 -2
  96. openstackclient/tests/unit/image/v2/test_metadef_resource_type_association.py +2 -6
  97. openstackclient/tests/unit/integ/base.py +1 -1
  98. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +3 -3
  99. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +4 -4
  100. openstackclient/tests/unit/network/v2/test_local_ip_association.py +2 -2
  101. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +12 -13
  102. openstackclient/tests/unit/network/v2/test_network_trunk.py +31 -35
  103. openstackclient/tests/unit/network/v2/test_port.py +40 -17
  104. openstackclient/tests/unit/network/v2/test_subnet_pool.py +1 -1
  105. openstackclient/tests/unit/object/v1/test_object.py +1 -1
  106. openstackclient/tests/unit/utils.py +2 -2
  107. openstackclient/volume/client.py +1 -1
  108. openstackclient/volume/v1/volume.py +2 -2
  109. openstackclient/volume/v1/volume_backup.py +2 -2
  110. openstackclient/volume/v1/volume_snapshot.py +2 -2
  111. openstackclient/volume/v2/volume.py +2 -2
  112. openstackclient/volume/v2/volume_backup.py +2 -2
  113. openstackclient/volume/v2/volume_snapshot.py +2 -2
  114. openstackclient/volume/v2/volume_type.py +4 -4
  115. openstackclient/volume/v3/service.py +0 -1
  116. openstackclient/volume/v3/volume.py +3 -3
  117. openstackclient/volume/v3/volume_backup.py +2 -2
  118. openstackclient/volume/v3/volume_group.py +3 -7
  119. openstackclient/volume/v3/volume_type.py +6 -6
  120. {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.2.0.dist-info}/AUTHORS +3 -0
  121. {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.2.0.dist-info}/METADATA +2 -3
  122. {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.2.0.dist-info}/RECORD +127 -126
  123. python_openstackclient-7.2.0.dist-info/pbr.json +1 -0
  124. python_openstackclient-7.1.3.dist-info/pbr.json +0 -1
  125. {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.2.0.dist-info}/LICENSE +0 -0
  126. {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.2.0.dist-info}/WHEEL +0 -0
  127. {python_openstackclient-7.1.3.dist-info → python_openstackclient-7.2.0.dist-info}/entry_points.txt +0 -0
  128. {python_openstackclient-7.1.3.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 %(description)s '
159
+ f'--description {cls.domain_description} '
160
160
  '--enable '
161
- '%(name)s'
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 %(domain)s '
172
- '--description %(description)s '
170
+ f'--domain {cls.domain_name} '
171
+ f'--description {cls.project_description} '
173
172
  '--enable '
174
- '%(name)s'
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 %s' % cls.project_name
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 %s' % cls.domain_name
187
+ f'domain set --disable {cls.domain_name}'
194
188
  )
195
189
  cls.openstack(
196
190
  '--os-identity-api-version 3 '
197
- 'domain delete %s' % cls.domain_name
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 %(domain)s '
224
- '--project %(project)s '
225
- '--project-domain %(project_domain)s '
226
- '--password %(password)s '
227
- '--email %(email)s '
228
- '--description %(description)s '
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
- '%(name)s'
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 %s' % self.parse_show_as_object(raw_output)['id'],
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 %s' % role_name)
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(self.openstack, 'role delete %s' % role['id'])
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 %(implied_role)s '
267
- '%(role)s' % {'implied_role': implied_role_name, 'role': role_name}
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 %(domain)s '
278
- '--description %(description)s '
279
- '%(name)s'
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 %(domain)s '
291
- '%(name)s' % {'domain': self.domain_name, 'name': group_name},
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 %(description)s '
303
- '--enable %(name)s'
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 %s' % domain_name)
290
+ self.addCleanup(self.openstack, f'domain delete {domain_name}')
308
291
  self.addCleanup(
309
- self.openstack, 'domain set --disable %s' % domain_name
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 %(domain)s '
319
- '--description %(description)s '
320
- '--enable %(name)s'
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 %(domain)s '
332
- '%(name)s'
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 %s' % parent_region
319
+ parent_region_arg = f'--parent-region {parent_region}'
343
320
  raw_output = self.openstack(
344
321
  'region create '
345
- '%(parent_region_arg)s '
346
- '--description %(description)s '
347
- '%(id)s'
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 %s' % region_id)
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 %(name)s '
367
- '--description %(description)s '
338
+ f'--name {service_name} '
339
+ f'--description {description} '
368
340
  '--enable '
369
- '%(type)s'
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 %s' % service['id']
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 %(region)s '
358
+ f'--region {region_id} '
392
359
  '--enable '
393
- '%(service)s '
394
- '%(interface)s '
395
- '%(url)s'
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 %s' % endpoint['id']
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
- ' %(name)s '
418
- '--description %(description)s '
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 %s' % identity_provider,
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
- ' %(name)s '
437
- '--description %(description)s '
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 %s' % service_provider
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 %(service_name)s'
462
- ' --default-limit %(default_limit)s'
463
- ' %(resource_name)s' % params,
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 %s' % registered_limit_id,
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 %s' % registered_limit_id,
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 %s' % project_name)
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 %(project_id)s'
512
- ' --service %(service_id)s'
513
- ' --resource-limit %(resource_limit)s'
514
- ' %(resource_name)s' % params,
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 %s' % limit_id,
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 %(user)s'
89
- ' --user-domain %(user_domain)s'
90
- ' --project %(project)s'
91
- ' --project-domain %(project_domain)s'
92
- ' %(role)s'
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 %(user)s'
105
- ' --user-domain %(user_domain)s'
106
- ' --project %(project)s'
107
- ' --project-domain %(project_domain)s'
108
- ' %(role)s'
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 %(name)s'
129
- ' --secret %(secret)s'
130
- ' --description %(description)s'
131
- ' --expiration %(tomorrow)s'
132
- ' --role %(role1)s'
133
- ' --role %(role2)s'
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 %s' % 'identity')
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 %s' % domain_name)
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 %s' % domain_name)
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 %s' % domain_name)
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 %s' % domain_name)
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 %s' % domain_1)
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 %s' % domain_2)
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 %s' % domain_name,
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 %s' % domain_name)
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)