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.
- openstackclient/api/compute_v2.py +2 -2
- openstackclient/api/volume_v2.py +60 -0
- openstackclient/api/volume_v3.py +60 -0
- openstackclient/compute/client.py +5 -0
- openstackclient/compute/v2/console.py +7 -0
- openstackclient/compute/v2/console_connection.py +48 -0
- openstackclient/compute/v2/flavor.py +14 -1
- openstackclient/compute/v2/keypair.py +10 -3
- openstackclient/compute/v2/server.py +76 -13
- openstackclient/compute/v2/server_event.py +1 -1
- openstackclient/identity/common.py +85 -11
- openstackclient/identity/v3/application_credential.py +88 -87
- openstackclient/identity/v3/domain.py +67 -49
- openstackclient/identity/v3/group.py +113 -68
- openstackclient/identity/v3/project.py +42 -20
- openstackclient/identity/v3/role.py +7 -2
- openstackclient/identity/v3/user.py +38 -5
- openstackclient/image/client.py +5 -0
- openstackclient/image/v1/image.py +16 -1
- openstackclient/image/v2/cache.py +10 -6
- openstackclient/image/v2/image.py +59 -12
- openstackclient/image/v2/metadef_objects.py +8 -2
- openstackclient/image/v2/metadef_properties.py +9 -2
- openstackclient/network/client.py +0 -6
- openstackclient/network/v2/floating_ip.py +58 -29
- openstackclient/network/v2/network_qos_rule.py +3 -11
- openstackclient/network/v2/port.py +16 -0
- openstackclient/network/v2/router.py +1 -1
- openstackclient/network/v2/security_group.py +49 -7
- openstackclient/network/v2/security_group_rule.py +18 -1
- openstackclient/shell.py +1 -1
- openstackclient/tests/functional/base.py +5 -1
- openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
- openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
- openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
- openstackclient/tests/functional/image/v2/test_image.py +36 -14
- openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
- openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
- openstackclient/tests/unit/api/test_volume_v2.py +124 -0
- openstackclient/tests/unit/api/test_volume_v3.py +124 -0
- openstackclient/tests/unit/compute/v2/fakes.py +81 -305
- openstackclient/tests/unit/compute/v2/test_console.py +18 -1
- openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
- openstackclient/tests/unit/compute/v2/test_flavor.py +160 -175
- openstackclient/tests/unit/compute/v2/test_keypair.py +12 -5
- openstackclient/tests/unit/compute/v2/test_server.py +211 -97
- openstackclient/tests/unit/compute/v2/test_server_backup.py +32 -71
- openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
- openstackclient/tests/unit/compute/v2/test_server_image.py +33 -72
- openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
- openstackclient/tests/unit/identity/v3/test_application_credential.py +93 -65
- openstackclient/tests/unit/identity/v3/test_domain.py +117 -107
- openstackclient/tests/unit/identity/v3/test_group.py +353 -202
- openstackclient/tests/unit/identity/v3/test_project.py +46 -53
- openstackclient/tests/unit/identity/v3/test_role.py +2 -8
- openstackclient/tests/unit/identity/v3/test_user.py +86 -6
- openstackclient/tests/unit/image/v1/test_image.py +55 -9
- openstackclient/tests/unit/image/v2/test_image.py +128 -58
- openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
- openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
- openstackclient/tests/unit/network/v2/fakes.py +406 -485
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +13 -19
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +3 -5
- openstackclient/tests/unit/network/v2/test_network.py +4 -4
- openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
- openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
- openstackclient/tests/unit/network/v2/test_port.py +57 -17
- openstackclient/tests/unit/network/v2/test_router.py +73 -57
- openstackclient/tests/unit/network/v2/test_security_group_network.py +31 -27
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +1 -3
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +82 -39
- openstackclient/tests/unit/volume/v2/fakes.py +1 -2
- openstackclient/tests/unit/volume/v2/test_service.py +57 -91
- openstackclient/tests/unit/volume/v2/test_volume.py +466 -410
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
- openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
- openstackclient/tests/unit/volume/v3/test_service.py +221 -141
- openstackclient/tests/unit/volume/v3/test_volume.py +569 -534
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +682 -47
- openstackclient/volume/v2/service.py +41 -38
- openstackclient/volume/v2/volume.py +140 -88
- openstackclient/volume/v2/volume_backup.py +9 -3
- openstackclient/volume/v2/volume_snapshot.py +121 -84
- openstackclient/volume/v3/block_storage_log_level.py +22 -28
- openstackclient/volume/v3/service.py +105 -14
- openstackclient/volume/v3/volume.py +287 -99
- openstackclient/volume/v3/volume_backup.py +24 -19
- openstackclient/volume/v3/volume_group.py +1 -1
- openstackclient/volume/v3/volume_snapshot.py +485 -10
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/AUTHORS +13 -0
- python_openstackclient-8.2.0.dist-info/METADATA +264 -0
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/RECORD +104 -98
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/entry_points.txt +7 -6
- python_openstackclient-8.2.0.dist-info/pbr.json +1 -0
- python_openstackclient-8.0.0.dist-info/METADATA +0 -166
- python_openstackclient-8.0.0.dist-info/pbr.json +0 -1
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/WHEEL +0 -0
- {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
|
|
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
|
|
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
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
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
|
-
|
|
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.
|
|
349
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
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 = [
|
|
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
|
|
384
|
-
self.
|
|
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
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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 = [
|
|
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.
|
|
403
|
-
|
|
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
|
-
|
|
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
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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,
|
|
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
|
-
|
|
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):
|