python-openstackclient 8.0.0__py3-none-any.whl → 8.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 (106) hide show
  1. openstackclient/api/compute_v2.py +2 -2
  2. openstackclient/api/volume_v2.py +60 -0
  3. openstackclient/api/volume_v3.py +60 -0
  4. openstackclient/compute/client.py +5 -0
  5. openstackclient/compute/v2/console.py +7 -0
  6. openstackclient/compute/v2/console_connection.py +48 -0
  7. openstackclient/compute/v2/flavor.py +14 -1
  8. openstackclient/compute/v2/keypair.py +10 -3
  9. openstackclient/compute/v2/server.py +76 -13
  10. openstackclient/compute/v2/server_event.py +1 -1
  11. openstackclient/identity/common.py +85 -11
  12. openstackclient/identity/v3/application_credential.py +88 -87
  13. openstackclient/identity/v3/domain.py +67 -49
  14. openstackclient/identity/v3/group.py +113 -68
  15. openstackclient/identity/v3/project.py +42 -20
  16. openstackclient/identity/v3/role.py +7 -2
  17. openstackclient/identity/v3/user.py +38 -5
  18. openstackclient/image/client.py +5 -0
  19. openstackclient/image/v1/image.py +16 -1
  20. openstackclient/image/v2/cache.py +10 -6
  21. openstackclient/image/v2/image.py +59 -12
  22. openstackclient/image/v2/metadef_objects.py +8 -2
  23. openstackclient/image/v2/metadef_properties.py +9 -2
  24. openstackclient/network/client.py +0 -6
  25. openstackclient/network/v2/floating_ip.py +58 -29
  26. openstackclient/network/v2/network_qos_rule.py +3 -11
  27. openstackclient/network/v2/port.py +16 -0
  28. openstackclient/network/v2/router.py +1 -1
  29. openstackclient/network/v2/security_group.py +49 -7
  30. openstackclient/network/v2/security_group_rule.py +18 -1
  31. openstackclient/shell.py +1 -1
  32. openstackclient/tests/functional/base.py +5 -1
  33. openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
  34. openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
  35. openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
  36. openstackclient/tests/functional/image/v2/test_image.py +36 -14
  37. openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
  38. openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
  39. openstackclient/tests/unit/api/test_volume_v2.py +124 -0
  40. openstackclient/tests/unit/api/test_volume_v3.py +124 -0
  41. openstackclient/tests/unit/compute/v2/fakes.py +81 -305
  42. openstackclient/tests/unit/compute/v2/test_console.py +18 -1
  43. openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
  44. openstackclient/tests/unit/compute/v2/test_flavor.py +160 -175
  45. openstackclient/tests/unit/compute/v2/test_keypair.py +12 -5
  46. openstackclient/tests/unit/compute/v2/test_server.py +211 -97
  47. openstackclient/tests/unit/compute/v2/test_server_backup.py +32 -71
  48. openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
  49. openstackclient/tests/unit/compute/v2/test_server_image.py +33 -72
  50. openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
  51. openstackclient/tests/unit/identity/v3/test_application_credential.py +93 -65
  52. openstackclient/tests/unit/identity/v3/test_domain.py +117 -107
  53. openstackclient/tests/unit/identity/v3/test_group.py +353 -202
  54. openstackclient/tests/unit/identity/v3/test_project.py +46 -53
  55. openstackclient/tests/unit/identity/v3/test_role.py +2 -8
  56. openstackclient/tests/unit/identity/v3/test_user.py +86 -6
  57. openstackclient/tests/unit/image/v1/test_image.py +55 -9
  58. openstackclient/tests/unit/image/v2/test_image.py +128 -58
  59. openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
  60. openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
  61. openstackclient/tests/unit/network/v2/fakes.py +406 -485
  62. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +13 -19
  63. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
  64. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +3 -5
  65. openstackclient/tests/unit/network/v2/test_network.py +4 -4
  66. openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
  67. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
  68. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
  69. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
  70. openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
  71. openstackclient/tests/unit/network/v2/test_port.py +57 -17
  72. openstackclient/tests/unit/network/v2/test_router.py +73 -57
  73. openstackclient/tests/unit/network/v2/test_security_group_network.py +31 -27
  74. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +1 -3
  75. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +82 -39
  76. openstackclient/tests/unit/volume/v2/fakes.py +1 -2
  77. openstackclient/tests/unit/volume/v2/test_service.py +57 -91
  78. openstackclient/tests/unit/volume/v2/test_volume.py +466 -410
  79. openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
  80. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
  81. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
  82. openstackclient/tests/unit/volume/v3/test_service.py +221 -141
  83. openstackclient/tests/unit/volume/v3/test_volume.py +569 -534
  84. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  85. openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
  86. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +682 -47
  87. openstackclient/volume/v2/service.py +41 -38
  88. openstackclient/volume/v2/volume.py +140 -88
  89. openstackclient/volume/v2/volume_backup.py +9 -3
  90. openstackclient/volume/v2/volume_snapshot.py +121 -84
  91. openstackclient/volume/v3/block_storage_log_level.py +22 -28
  92. openstackclient/volume/v3/service.py +105 -14
  93. openstackclient/volume/v3/volume.py +287 -99
  94. openstackclient/volume/v3/volume_backup.py +24 -19
  95. openstackclient/volume/v3/volume_group.py +1 -1
  96. openstackclient/volume/v3/volume_snapshot.py +485 -10
  97. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/AUTHORS +13 -0
  98. python_openstackclient-8.2.0.dist-info/METADATA +264 -0
  99. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/RECORD +104 -98
  100. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/entry_points.txt +7 -6
  101. python_openstackclient-8.2.0.dist-info/pbr.json +1 -0
  102. python_openstackclient-8.0.0.dist-info/METADATA +0 -166
  103. python_openstackclient-8.0.0.dist-info/pbr.json +0 -1
  104. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/LICENSE +0 -0
  105. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/WHEEL +0 -0
  106. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/top_level.txt +0 -0
@@ -17,8 +17,9 @@ import io
17
17
  import tempfile
18
18
  from unittest import mock
19
19
 
20
- from cinderclient import api_versions
20
+ from openstack.block_storage.v2 import volume as _volume
21
21
  from openstack import exceptions as sdk_exceptions
22
+ from openstack.test import fakes as sdk_fakes
22
23
  from osc_lib.cli import format_columns
23
24
  from osc_lib import exceptions
24
25
 
@@ -37,12 +38,6 @@ class TestImage(image_fakes.TestImagev2, volume_fakes.TestVolume):
37
38
  self.project_mock.reset_mock()
38
39
  self.domain_mock = self.identity_client.domains
39
40
  self.domain_mock.reset_mock()
40
- self.volumes_mock = self.volume_client.volumes
41
- fake_body = {
42
- 'os-volume_upload_image': {'volume_type': {'name': 'fake_type'}}
43
- }
44
- self.volumes_mock.upload_to_image.return_value = (200, fake_body)
45
- self.volumes_mock.reset_mock()
46
41
 
47
42
 
48
43
  class TestImageCreate(TestImage):
@@ -312,7 +307,6 @@ class TestImageCreate(TestImage):
312
307
 
313
308
  columns, data = self.cmd.take_action(parsed_args)
314
309
 
315
- # ImageManager.create(name=, **)
316
310
  self.image_client.create_image.assert_called_with(
317
311
  name=self.new_image.name,
318
312
  allow_duplicates=True,
@@ -322,20 +316,19 @@ class TestImageCreate(TestImage):
322
316
  )
323
317
  self.image_client.get_image.assert_called_once_with(self.new_image)
324
318
 
325
- @mock.patch('osc_lib.utils.find_resource')
326
319
  @mock.patch('openstackclient.image.v2.image.get_data_from_stdin')
327
- def test_image_create_from_volume(self, mock_get_data_f, mock_get_vol):
328
- fake_vol_id = 'fake-volume-id'
320
+ def test_image_create_from_volume(self, mock_get_data_f):
329
321
  mock_get_data_f.return_value = None
330
322
 
331
- class FakeVolume:
332
- id = fake_vol_id
333
-
334
- mock_get_vol.return_value = FakeVolume()
323
+ volume = sdk_fakes.generate_fake_resource(_volume.Volume)
324
+ self.volume_sdk_client.find_volume.return_value = volume
325
+ self.volume_sdk_client.upload_volume_to_image.return_value = {
326
+ 'volume_type': {'name': 'fake_type'}
327
+ }
335
328
 
336
329
  arglist = [
337
330
  '--volume',
338
- fake_vol_id,
331
+ volume.id,
339
332
  self.new_image.name,
340
333
  ]
341
334
  verifylist = [
@@ -345,53 +338,60 @@ class TestImageCreate(TestImage):
345
338
 
346
339
  columns, data = self.cmd.take_action(parsed_args)
347
340
 
348
- self.volumes_mock.upload_to_image.assert_called_with(
349
- fake_vol_id,
350
- False,
341
+ self.volume_sdk_client.upload_volume_to_image.assert_called_once_with(
342
+ volume.id,
351
343
  self.new_image.name,
352
- 'bare',
353
- 'raw',
344
+ force=False,
345
+ disk_format='raw',
346
+ container_format='bare',
354
347
  visibility=None,
355
348
  protected=None,
356
349
  )
357
350
 
358
- @mock.patch('osc_lib.utils.find_resource')
359
351
  @mock.patch('openstackclient.image.v2.image.get_data_from_stdin')
360
- def test_image_create_from_volume_fail(
361
- self, mock_get_data_f, mock_get_vol
362
- ):
363
- fake_vol_id = 'fake-volume-id'
352
+ def test_image_create_from_volume_pre_v31(self, mock_get_data_f):
364
353
  mock_get_data_f.return_value = None
365
354
 
366
- class FakeVolume:
367
- id = fake_vol_id
368
-
369
- mock_get_vol.return_value = FakeVolume()
355
+ volume = sdk_fakes.generate_fake_resource(_volume.Volume)
356
+ self.volume_sdk_client.find_volume.return_value = volume
357
+ self.volume_sdk_client.upload_volume_to_image.return_value = {
358
+ 'volume_type': {'name': 'fake_type'}
359
+ }
370
360
 
371
- arglist = ['--volume', fake_vol_id, self.new_image.name, '--public']
361
+ arglist = [
362
+ '--volume',
363
+ volume.id,
364
+ self.new_image.name,
365
+ '--public',
366
+ ]
372
367
  verifylist = [
373
368
  ('name', self.new_image.name),
374
369
  ]
375
370
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
376
371
 
377
- self.assertRaises(
372
+ exc = self.assertRaises(
378
373
  exceptions.CommandError, self.cmd.take_action, parsed_args
379
374
  )
375
+ self.assertIn('--os-volume-api-version 3.1 or greater ', str(exc))
380
376
 
381
- @mock.patch('osc_lib.utils.find_resource')
382
377
  @mock.patch('openstackclient.image.v2.image.get_data_from_stdin')
383
- def test_image_create_from_volume_v31(self, mock_get_data_f, mock_get_vol):
384
- self.volume_client.api_version = api_versions.APIVersion('3.1')
378
+ def test_image_create_from_volume_v31(self, mock_get_data_f):
379
+ self.set_volume_api_version('3.1')
385
380
 
386
- fake_vol_id = 'fake-volume-id'
387
381
  mock_get_data_f.return_value = None
388
382
 
389
- class FakeVolume:
390
- id = fake_vol_id
391
-
392
- mock_get_vol.return_value = FakeVolume()
383
+ volume = sdk_fakes.generate_fake_resource(_volume.Volume)
384
+ self.volume_sdk_client.find_volume.return_value = volume
385
+ self.volume_sdk_client.upload_volume_to_image.return_value = {
386
+ 'volume_type': {'name': 'fake_type'}
387
+ }
393
388
 
394
- arglist = ['--volume', fake_vol_id, self.new_image.name, '--public']
389
+ arglist = [
390
+ '--volume',
391
+ volume.id,
392
+ self.new_image.name,
393
+ '--public',
394
+ ]
395
395
  verifylist = [
396
396
  ('name', self.new_image.name),
397
397
  ]
@@ -399,12 +399,12 @@ class TestImageCreate(TestImage):
399
399
 
400
400
  columns, data = self.cmd.take_action(parsed_args)
401
401
 
402
- self.volumes_mock.upload_to_image.assert_called_with(
403
- fake_vol_id,
404
- False,
402
+ self.volume_sdk_client.upload_volume_to_image.assert_called_once_with(
403
+ volume.id,
405
404
  self.new_image.name,
406
- 'bare',
407
- 'raw',
405
+ force=False,
406
+ disk_format='raw',
407
+ container_format='bare',
408
408
  visibility='public',
409
409
  protected=False,
410
410
  )
@@ -822,6 +822,8 @@ class TestImageList(TestImage):
822
822
  'Visibility',
823
823
  'Protected',
824
824
  'Project',
825
+ 'Hash Algorithm',
826
+ 'Hash Value',
825
827
  'Tags',
826
828
  )
827
829
 
@@ -830,14 +832,16 @@ class TestImageList(TestImage):
830
832
  (
831
833
  self._image.id,
832
834
  self._image.name,
833
- None,
834
- None,
835
- None,
836
- None,
837
- None,
835
+ self._image.disk_format,
836
+ self._image.container_format,
837
+ self._image.size,
838
+ self._image.checksum,
839
+ self._image.status,
838
840
  self._image.visibility,
839
841
  self._image.is_protected,
840
842
  self._image.owner_id,
843
+ self._image.hash_algo,
844
+ self._image.hash_value,
841
845
  format_columns.ListColumn(self._image.tags),
842
846
  ),
843
847
  )
@@ -914,7 +918,7 @@ class TestImageList(TestImage):
914
918
  self.assertEqual(ret_limit, len(tuple(data)))
915
919
 
916
920
  def test_image_list_project_option(self):
917
- self.image_client.find_image = mock.Mock(return_value=self._image)
921
+ self.image_client.find_image.return_value = self._image
918
922
  arglist = [
919
923
  '--project',
920
924
  'nova',
@@ -931,7 +935,7 @@ class TestImageList(TestImage):
931
935
 
932
936
  @mock.patch('osc_lib.utils.find_resource')
933
937
  def test_image_list_marker_option(self, fr_mock):
934
- self.image_client.find_image = mock.Mock(return_value=self._image)
938
+ self.image_client.find_image.return_value = self._image
935
939
 
936
940
  arglist = [
937
941
  '--marker',
@@ -1356,15 +1360,17 @@ class TestImageSet(TestImage):
1356
1360
  exceptions.CommandError, self.cmd.take_action, parsed_args
1357
1361
  )
1358
1362
 
1359
- def test_image_set_bools1(self):
1363
+ def test_image_set_bools_true(self):
1360
1364
  arglist = [
1361
1365
  '--protected',
1362
1366
  '--private',
1367
+ '--hidden',
1363
1368
  'graven',
1364
1369
  ]
1365
1370
  verifylist = [
1366
1371
  ('is_protected', True),
1367
1372
  ('visibility', 'private'),
1373
+ ('is_hidden', True),
1368
1374
  ('image', 'graven'),
1369
1375
  ]
1370
1376
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -1374,6 +1380,7 @@ class TestImageSet(TestImage):
1374
1380
  kwargs = {
1375
1381
  'is_protected': True,
1376
1382
  'visibility': 'private',
1383
+ 'is_hidden': True,
1377
1384
  }
1378
1385
  # ImageManager.update(image, **kwargs)
1379
1386
  self.image_client.update_image.assert_called_with(
@@ -1381,15 +1388,17 @@ class TestImageSet(TestImage):
1381
1388
  )
1382
1389
  self.assertIsNone(result)
1383
1390
 
1384
- def test_image_set_bools2(self):
1391
+ def test_image_set_bools_false(self):
1385
1392
  arglist = [
1386
1393
  '--unprotected',
1387
1394
  '--public',
1395
+ '--unhidden',
1388
1396
  'graven',
1389
1397
  ]
1390
1398
  verifylist = [
1391
1399
  ('is_protected', False),
1392
1400
  ('visibility', 'public'),
1401
+ ('is_hidden', False),
1393
1402
  ('image', 'graven'),
1394
1403
  ]
1395
1404
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -1399,6 +1408,7 @@ class TestImageSet(TestImage):
1399
1408
  kwargs = {
1400
1409
  'is_protected': False,
1401
1410
  'visibility': 'public',
1411
+ 'is_hidden': False,
1402
1412
  }
1403
1413
  # ImageManager.update(image, **kwargs)
1404
1414
  self.image_client.update_image.assert_called_with(
@@ -1721,7 +1731,7 @@ class TestImageShow(TestImage):
1721
1731
  def setUp(self):
1722
1732
  super().setUp()
1723
1733
 
1724
- self.image_client.find_image = mock.Mock(return_value=self._data)
1734
+ self.image_client.find_image.return_value = self._data
1725
1735
 
1726
1736
  # Get the command object to test
1727
1737
  self.cmd = _image.ShowImage(self.app, None)
@@ -1779,6 +1789,7 @@ class TestImageUnset(TestImage):
1779
1789
  attrs['hw_rng_model'] = 'virtio'
1780
1790
  attrs['prop'] = 'test'
1781
1791
  attrs['prop2'] = 'fake'
1792
+ attrs['os_secure_boot'] = 'required'
1782
1793
  self.image = image_fakes.create_one_image(attrs)
1783
1794
 
1784
1795
  self.image_client.find_image.return_value = self.image
@@ -1822,11 +1833,18 @@ class TestImageUnset(TestImage):
1822
1833
  'hw_rng_model',
1823
1834
  '--property',
1824
1835
  'prop',
1836
+ '--property',
1837
+ 'os_secure_boot',
1825
1838
  self.image.id,
1826
1839
  ]
1827
1840
 
1841
+ # openstacksdk translates 'os_secure_boot' property to
1842
+ # 'needs_secure_boot' Image attribute. This is true for
1843
+ # all IMAGE_ATTRIBUTES_CUSTOM_NAMES keys
1844
+ self.assertEqual(self.image.needs_secure_boot, 'required')
1845
+ self.assertFalse(hasattr(self.image, 'os_secure_boot'))
1828
1846
  verifylist = [
1829
- ('properties', ['hw_rng_model', 'prop']),
1847
+ ('properties', ['hw_rng_model', 'prop', 'os_secure_boot']),
1830
1848
  ('image', self.image.id),
1831
1849
  ]
1832
1850
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -2039,6 +2057,36 @@ class TestImageImport(TestImage):
2039
2057
 
2040
2058
  self.image_client.import_image.assert_not_called()
2041
2059
 
2060
+ def test_import_image__web_download_invalid_url(self):
2061
+ arglist = [
2062
+ self.image.name,
2063
+ '--method',
2064
+ 'web-download',
2065
+ '--uri',
2066
+ 'invalid:1234',
2067
+ ]
2068
+
2069
+ verifylist = [
2070
+ ('image', self.image.name),
2071
+ ('import_method', 'web-download'),
2072
+ ('uri', 'invalid:1234'),
2073
+ ]
2074
+
2075
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2076
+
2077
+ exc = self.assertRaises(
2078
+ exceptions.CommandError,
2079
+ self.cmd.take_action,
2080
+ parsed_args,
2081
+ )
2082
+
2083
+ self.assertIn(
2084
+ "'invalid:1234' is not a valid url",
2085
+ str(exc),
2086
+ )
2087
+
2088
+ self.image_client.import_image.assert_not_called()
2089
+
2042
2090
  def test_import_image__web_download_invalid_image_state(self):
2043
2091
  self.image.status = 'uploading' # != 'queued'
2044
2092
  arglist = [
@@ -2190,7 +2238,29 @@ class TestImageSave(TestImage):
2190
2238
  self.cmd.take_action(parsed_args)
2191
2239
 
2192
2240
  self.image_client.download_image.assert_called_once_with(
2193
- self.image.id, stream=True, output='/path/to/file'
2241
+ self.image.id, output='/path/to/file', stream=True, chunk_size=1024
2242
+ )
2243
+
2244
+ def test_save_data_with_chunk_size(self):
2245
+ arglist = [
2246
+ '--file',
2247
+ '/path/to/file',
2248
+ '--chunk-size',
2249
+ '2048',
2250
+ self.image.id,
2251
+ ]
2252
+
2253
+ verifylist = [
2254
+ ('filename', '/path/to/file'),
2255
+ ('chunk_size', 2048),
2256
+ ('image', self.image.id),
2257
+ ]
2258
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2259
+
2260
+ self.cmd.take_action(parsed_args)
2261
+
2262
+ self.image_client.download_image.assert_called_once_with(
2263
+ self.image.id, output='/path/to/file', stream=True, chunk_size=2048
2194
2264
  )
2195
2265
 
2196
2266
 
@@ -113,6 +113,7 @@ class TestMetadefObjectDelete(fakes.TestImagev2):
113
113
  super().setUp()
114
114
 
115
115
  self.image_client.delete_metadef_object.return_value = None
116
+ self.image_client.delete_all_metadef_objects.return_value = None
116
117
  self.cmd = metadef_objects.DeleteMetadefObject(self.app, None)
117
118
 
118
119
  def test_object_delete(self):
@@ -126,8 +127,29 @@ class TestMetadefObjectDelete(fakes.TestImagev2):
126
127
 
127
128
  result = self.cmd.take_action(parsed_args)
128
129
 
130
+ self.image_client.delete_metadef_object.assert_called_once_with(
131
+ self.image_client.get_metadef_object(),
132
+ self._metadef_namespace.namespace,
133
+ )
134
+ self.image_client.delete_all_metadef_objects.assert_not_called()
129
135
  self.assertIsNone(result)
130
136
 
137
+ def test_object_delete_all(self):
138
+ arglist = [
139
+ self._metadef_namespace.namespace,
140
+ ]
141
+
142
+ verifylist = []
143
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
144
+
145
+ result = self.cmd.take_action(parsed_args)
146
+
147
+ self.assertIsNone(result)
148
+ self.image_client.delete_all_metadef_objects.assert_called_with(
149
+ self._metadef_namespace.namespace,
150
+ )
151
+ self.image_client.delete_metadef_object.assert_not_called()
152
+
131
153
 
132
154
  class TestMetadefObjectList(fakes.TestImagev2):
133
155
  _metadef_namespace = fakes.create_one_metadef_namespace()
@@ -91,6 +91,7 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
91
91
  super().setUp()
92
92
 
93
93
  self.cmd = metadef_properties.DeleteMetadefProperty(self.app, None)
94
+ self.image_client.delete_all_metadef_properties.return_value = None
94
95
 
95
96
  def test_metadef_property_delete(self):
96
97
  arglist = ['namespace', 'property']
@@ -100,6 +101,10 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
100
101
  result = self.cmd.take_action(parsed_args)
101
102
 
102
103
  self.assertIsNone(result)
104
+ self.image_client.delete_metadef_property.assert_called_with(
105
+ 'property', 'namespace', ignore_missing=False
106
+ )
107
+ self.image_client.delete_all_metadef_properties.assert_not_called()
103
108
 
104
109
  def test_metadef_property_delete_missing_arguments(self):
105
110
  arglist = []
@@ -110,21 +115,13 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
110
115
  arglist,
111
116
  [],
112
117
  )
113
-
114
- arglist = ['namespace']
115
- self.assertRaises(
116
- tests_utils.ParserException,
117
- self.check_parser,
118
- self.cmd,
119
- arglist,
120
- [],
121
- )
118
+ self.image_client.delete_all_metadef_properties.assert_not_called()
119
+ self.image_client.delete_metadef_property.assert_not_called()
122
120
 
123
121
  def test_metadef_property_delete_exception(self):
124
122
  arglist = ['namespace', 'property']
125
123
  verifylist = []
126
124
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
127
-
128
125
  self.image_client.delete_metadef_property.side_effect = (
129
126
  sdk_exceptions.ResourceNotFound
130
127
  )
@@ -132,6 +129,23 @@ class TestMetadefPropertyDelete(image_fakes.TestImagev2):
132
129
  self.assertRaises(
133
130
  exceptions.CommandError, self.cmd.take_action, parsed_args
134
131
  )
132
+ self.image_client.delete_metadef_property.assert_called_with(
133
+ 'property', 'namespace', ignore_missing=False
134
+ )
135
+ self.image_client.delete_all_metadef_properties.assert_not_called()
136
+
137
+ def test_metadef_property_delete_all(self):
138
+ arglist = ['namespace']
139
+ verifylist = []
140
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
141
+
142
+ result = self.cmd.take_action(parsed_args)
143
+
144
+ self.assertIsNone(result)
145
+ self.image_client.delete_all_metadef_properties.assert_called_with(
146
+ 'namespace'
147
+ )
148
+ self.image_client.delete_metadef_property.assert_not_called()
135
149
 
136
150
 
137
151
  class TestMetadefPropertyList(image_fakes.TestImagev2):