python-openstackclient 7.4.0__py3-none-any.whl → 8.1.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/common/availability_zone.py +3 -6
- openstackclient/common/clientmanager.py +2 -1
- openstackclient/common/envvars.py +57 -0
- openstackclient/common/extension.py +3 -11
- openstackclient/common/limits.py +1 -1
- openstackclient/common/project_cleanup.py +3 -2
- openstackclient/common/quota.py +54 -28
- openstackclient/compute/client.py +7 -5
- openstackclient/compute/v2/agent.py +5 -5
- openstackclient/compute/v2/aggregate.py +17 -15
- openstackclient/compute/v2/console.py +10 -4
- openstackclient/compute/v2/console_connection.py +48 -0
- openstackclient/compute/v2/flavor.py +14 -18
- openstackclient/compute/v2/host.py +3 -3
- openstackclient/compute/v2/hypervisor.py +10 -4
- openstackclient/compute/v2/hypervisor_stats.py +1 -1
- openstackclient/compute/v2/keypair.py +18 -13
- openstackclient/compute/v2/server.py +144 -121
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_event.py +8 -17
- openstackclient/compute/v2/server_group.py +6 -6
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +6 -6
- openstackclient/compute/v2/server_volume.py +4 -4
- openstackclient/compute/v2/service.py +9 -13
- openstackclient/compute/v2/usage.py +4 -6
- openstackclient/identity/client.py +2 -4
- openstackclient/identity/common.py +95 -17
- openstackclient/identity/v2_0/ec2creds.py +4 -3
- openstackclient/identity/v2_0/endpoint.py +12 -10
- openstackclient/identity/v2_0/project.py +6 -6
- openstackclient/identity/v2_0/role.py +1 -1
- openstackclient/identity/v2_0/service.py +7 -7
- openstackclient/identity/v2_0/user.py +6 -21
- openstackclient/identity/v3/access_rule.py +2 -5
- openstackclient/identity/v3/application_credential.py +2 -2
- openstackclient/identity/v3/consumer.py +4 -3
- openstackclient/identity/v3/credential.py +6 -7
- openstackclient/identity/v3/domain.py +63 -44
- openstackclient/identity/v3/ec2creds.py +4 -3
- openstackclient/identity/v3/endpoint.py +104 -88
- openstackclient/identity/v3/endpoint_group.py +1 -1
- openstackclient/identity/v3/group.py +116 -72
- openstackclient/identity/v3/identity_provider.py +1 -2
- openstackclient/identity/v3/limit.py +4 -9
- openstackclient/identity/v3/mapping.py +4 -3
- openstackclient/identity/v3/policy.py +5 -8
- openstackclient/identity/v3/project.py +23 -6
- openstackclient/identity/v3/region.py +2 -5
- openstackclient/identity/v3/registered_limit.py +4 -8
- openstackclient/identity/v3/role.py +15 -16
- openstackclient/identity/v3/service.py +8 -8
- openstackclient/identity/v3/service_provider.py +3 -6
- openstackclient/identity/v3/tag.py +2 -2
- openstackclient/identity/v3/token.py +1 -2
- openstackclient/identity/v3/trust.py +74 -25
- openstackclient/identity/v3/user.py +47 -11
- openstackclient/image/client.py +7 -5
- openstackclient/image/v1/image.py +11 -15
- openstackclient/image/v2/cache.py +2 -4
- openstackclient/image/v2/image.py +41 -48
- openstackclient/image/v2/metadef_namespaces.py +4 -3
- openstackclient/image/v2/metadef_resource_type_association.py +1 -2
- openstackclient/image/v2/metadef_resource_types.py +1 -2
- openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +9 -1370
- openstackclient/network/client.py +4 -16
- openstackclient/network/common.py +16 -12
- openstackclient/network/utils.py +3 -3
- openstackclient/network/v2/address_group.py +5 -9
- openstackclient/network/v2/address_scope.py +2 -3
- openstackclient/network/v2/default_security_group_rule.py +1 -2
- openstackclient/network/v2/floating_ip.py +69 -47
- openstackclient/network/v2/floating_ip_port_forwarding.py +7 -7
- openstackclient/network/v2/ip_availability.py +1 -2
- openstackclient/network/v2/l3_conntrack_helper.py +8 -12
- openstackclient/network/v2/local_ip.py +24 -26
- openstackclient/network/v2/local_ip_association.py +4 -5
- openstackclient/network/v2/ndp_proxy.py +9 -10
- openstackclient/network/v2/network.py +12 -16
- openstackclient/network/v2/network_agent.py +29 -37
- openstackclient/network/v2/network_auto_allocated_topology.py +4 -5
- openstackclient/network/v2/network_flavor.py +1 -1
- openstackclient/network/v2/network_flavor_profile.py +5 -5
- openstackclient/network/v2/network_meter.py +3 -3
- openstackclient/network/v2/network_meter_rule.py +5 -8
- openstackclient/network/v2/network_qos_policy.py +4 -4
- openstackclient/network/v2/network_qos_rule.py +7 -16
- openstackclient/network/v2/network_rbac.py +4 -4
- openstackclient/network/v2/network_segment.py +6 -7
- openstackclient/network/v2/network_segment_range.py +16 -20
- openstackclient/network/v2/network_trunk.py +24 -16
- openstackclient/network/v2/port.py +28 -29
- openstackclient/network/v2/router.py +53 -42
- openstackclient/network/v2/security_group.py +13 -19
- openstackclient/network/v2/security_group_rule.py +10 -11
- openstackclient/network/v2/subnet.py +31 -30
- openstackclient/network/v2/subnet_pool.py +4 -4
- openstackclient/object/client.py +2 -3
- openstackclient/object/v1/container.py +2 -3
- openstackclient/object/v1/object.py +2 -9
- openstackclient/shell.py +22 -5
- openstackclient/tests/functional/base.py +7 -3
- openstackclient/tests/functional/common/test_quota.py +3 -1
- openstackclient/tests/functional/compute/v2/common.py +12 -6
- openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
- openstackclient/tests/functional/compute/v2/test_server.py +2 -3
- openstackclient/tests/functional/compute/v2/test_server_event.py +1 -1
- openstackclient/tests/functional/identity/v2/test_user.py +1 -1
- openstackclient/tests/functional/identity/v3/common.py +3 -8
- openstackclient/tests/functional/identity/v3/test_application_credential.py +10 -10
- openstackclient/tests/functional/identity/v3/test_endpoint.py +3 -3
- openstackclient/tests/functional/identity/v3/test_group.py +3 -3
- openstackclient/tests/functional/identity/v3/test_idp.py +3 -7
- openstackclient/tests/functional/identity/v3/test_limit.py +4 -4
- openstackclient/tests/functional/identity/v3/test_project.py +5 -14
- openstackclient/tests/functional/identity/v3/test_region.py +1 -3
- openstackclient/tests/functional/identity/v3/test_registered_limit.py +3 -3
- openstackclient/tests/functional/identity/v3/test_role.py +1 -1
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +13 -31
- openstackclient/tests/functional/identity/v3/test_service_provider.py +3 -7
- openstackclient/tests/functional/identity/v3/test_user.py +8 -8
- openstackclient/tests/functional/network/v2/common.py +7 -3
- openstackclient/tests/functional/network/v2/test_address_group.py +4 -0
- openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +15 -11
- openstackclient/tests/functional/network/v2/test_local_ip.py +4 -0
- openstackclient/tests/functional/network/v2/test_network_meter_rule.py +2 -2
- openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +2 -3
- openstackclient/tests/functional/network/v2/test_network_rbac.py +2 -2
- openstackclient/tests/functional/network/v2/test_network_trunk.py +1 -1
- openstackclient/tests/functional/network/v2/test_port.py +17 -7
- openstackclient/tests/functional/network/v2/test_router.py +42 -0
- openstackclient/tests/functional/network/v2/test_subnet_pool.py +4 -0
- openstackclient/tests/unit/api/test_compute_v2.py +67 -87
- openstackclient/tests/unit/common/test_availability_zone.py +6 -14
- openstackclient/tests/unit/common/test_command.py +1 -1
- openstackclient/tests/unit/common/test_extension.py +5 -7
- openstackclient/tests/unit/common/test_limits.py +1 -1
- openstackclient/tests/unit/common/test_project_cleanup.py +5 -6
- openstackclient/tests/unit/common/test_quota.py +51 -28
- openstackclient/tests/unit/compute/v2/fakes.py +85 -315
- openstackclient/tests/unit/compute/v2/test_agent.py +16 -16
- openstackclient/tests/unit/compute/v2/test_aggregate.py +56 -60
- openstackclient/tests/unit/compute/v2/test_console.py +34 -17
- openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
- openstackclient/tests/unit/compute/v2/test_flavor.py +72 -72
- openstackclient/tests/unit/compute/v2/test_host.py +8 -8
- openstackclient/tests/unit/compute/v2/test_hypervisor.py +22 -30
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -2
- openstackclient/tests/unit/compute/v2/test_keypair.py +36 -29
- openstackclient/tests/unit/compute/v2/test_server.py +693 -606
- openstackclient/tests/unit/compute/v2/test_server_backup.py +36 -77
- openstackclient/tests/unit/compute/v2/test_server_event.py +18 -20
- openstackclient/tests/unit/compute/v2/test_server_group.py +25 -31
- openstackclient/tests/unit/compute/v2/test_server_image.py +37 -78
- openstackclient/tests/unit/compute/v2/test_server_migration.py +41 -41
- openstackclient/tests/unit/compute/v2/test_server_volume.py +12 -12
- openstackclient/tests/unit/compute/v2/test_service.py +39 -45
- openstackclient/tests/unit/compute/v2/test_usage.py +5 -5
- openstackclient/tests/unit/identity/v2_0/fakes.py +1 -1
- openstackclient/tests/unit/identity/v3/test_access_rule.py +1 -3
- openstackclient/tests/unit/identity/v3/test_application_credential.py +48 -26
- openstackclient/tests/unit/identity/v3/test_domain.py +115 -105
- openstackclient/tests/unit/identity/v3/test_endpoint.py +167 -172
- openstackclient/tests/unit/identity/v3/test_group.py +353 -202
- openstackclient/tests/unit/identity/v3/test_mappings.py +2 -2
- openstackclient/tests/unit/identity/v3/test_project.py +16 -0
- openstackclient/tests/unit/identity/v3/test_trust.py +5 -2
- openstackclient/tests/unit/identity/v3/test_user.py +102 -6
- openstackclient/tests/unit/image/v1/fakes.py +2 -2
- openstackclient/tests/unit/image/v1/test_image.py +8 -9
- openstackclient/tests/unit/image/v2/test_image.py +84 -46
- openstackclient/tests/unit/integ/cli/test_shell.py +1 -2
- openstackclient/tests/unit/network/test_common.py +2 -2
- openstackclient/tests/unit/network/v2/fakes.py +405 -485
- openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +8 -14
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +62 -54
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +1 -1
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +1 -3
- 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_compute.py +11 -11
- 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_network_trunk.py +2 -2
- openstackclient/tests/unit/network/v2/test_port.py +21 -22
- openstackclient/tests/unit/network/v2/test_router.py +130 -51
- openstackclient/tests/unit/network/v2/test_security_group_compute.py +11 -19
- openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -27
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +15 -17
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +33 -39
- openstackclient/tests/unit/object/v1/test_object_all.py +4 -3
- openstackclient/tests/unit/test_shell.py +16 -13
- 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 +109 -106
- 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/v2/test_volume_transfer_request.py +1 -1
- openstackclient/tests/unit/volume/v3/fakes.py +2 -8
- 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 +131 -120
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +4 -4
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +683 -49
- openstackclient/tests/unit/volume/v3/test_volume_transfer_request.py +1 -1
- openstackclient/volume/client.py +1 -3
- openstackclient/volume/v2/consistency_group.py +4 -8
- openstackclient/volume/v2/consistency_group_snapshot.py +1 -2
- openstackclient/volume/v2/qos_specs.py +1 -2
- openstackclient/volume/v2/service.py +41 -38
- openstackclient/volume/v2/volume.py +71 -53
- openstackclient/volume/v2/volume_backup.py +15 -10
- openstackclient/volume/v2/volume_snapshot.py +129 -93
- openstackclient/volume/v2/volume_transfer_request.py +0 -3
- openstackclient/volume/v2/volume_type.py +10 -21
- openstackclient/volume/v3/block_storage_cluster.py +3 -3
- openstackclient/volume/v3/block_storage_log_level.py +22 -28
- openstackclient/volume/v3/block_storage_manage.py +1 -3
- openstackclient/volume/v3/service.py +105 -14
- openstackclient/volume/v3/volume.py +218 -58
- openstackclient/volume/v3/volume_attachment.py +3 -2
- openstackclient/volume/v3/volume_backup.py +31 -27
- openstackclient/volume/v3/volume_group.py +2 -1
- openstackclient/volume/v3/volume_group_snapshot.py +2 -1
- openstackclient/volume/v3/volume_snapshot.py +489 -13
- openstackclient/volume/v3/volume_type.py +10 -21
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/AUTHORS +11 -0
- python_openstackclient-8.1.0.dist-info/METADATA +264 -0
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/RECORD +238 -259
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/entry_points.txt +7 -47
- python_openstackclient-8.1.0.dist-info/pbr.json +1 -0
- openstackclient/tests/functional/volume/v1/__init__.py +0 -0
- openstackclient/tests/functional/volume/v1/common.py +0 -35
- openstackclient/tests/functional/volume/v1/test_qos.py +0 -100
- openstackclient/tests/functional/volume/v1/test_service.py +0 -76
- openstackclient/tests/functional/volume/v1/test_snapshot.py +0 -232
- openstackclient/tests/functional/volume/v1/test_transfer_request.py +0 -111
- openstackclient/tests/functional/volume/v1/test_volume.py +0 -228
- openstackclient/tests/functional/volume/v1/test_volume_type.py +0 -213
- openstackclient/tests/unit/volume/v1/__init__.py +0 -0
- openstackclient/tests/unit/volume/v1/fakes.py +0 -615
- openstackclient/tests/unit/volume/v1/test_qos_specs.py +0 -471
- openstackclient/tests/unit/volume/v1/test_service.py +0 -295
- openstackclient/tests/unit/volume/v1/test_transfer_request.py +0 -380
- openstackclient/tests/unit/volume/v1/test_type.py +0 -633
- openstackclient/tests/unit/volume/v1/test_volume.py +0 -1447
- openstackclient/tests/unit/volume/v1/test_volume_backup.py +0 -435
- openstackclient/volume/v1/__init__.py +0 -0
- openstackclient/volume/v1/qos_specs.py +0 -377
- openstackclient/volume/v1/service.py +0 -136
- openstackclient/volume/v1/volume.py +0 -734
- openstackclient/volume/v1/volume_backup.py +0 -302
- openstackclient/volume/v1/volume_snapshot.py +0 -433
- openstackclient/volume/v1/volume_transfer_request.py +0 -200
- openstackclient/volume/v1/volume_type.py +0 -520
- python_openstackclient-7.4.0.dist-info/METADATA +0 -172
- python_openstackclient-7.4.0.dist-info/pbr.json +0 -1
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/top_level.txt +0 -0
|
@@ -13,9 +13,12 @@
|
|
|
13
13
|
|
|
14
14
|
from unittest import mock
|
|
15
15
|
|
|
16
|
+
from openstack.block_storage.v2 import snapshot as _snapshot
|
|
17
|
+
from openstack.block_storage.v3 import volume as _volume
|
|
18
|
+
from openstack import exceptions as sdk_exceptions
|
|
19
|
+
from openstack.test import fakes as sdk_fakes
|
|
16
20
|
from osc_lib.cli import format_columns
|
|
17
21
|
from osc_lib import exceptions
|
|
18
|
-
from osc_lib import utils
|
|
19
22
|
|
|
20
23
|
from openstackclient.tests.unit.identity.v3 import fakes as project_fakes
|
|
21
24
|
from openstackclient.tests.unit import utils as test_utils
|
|
@@ -23,19 +26,7 @@ from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
|
|
|
23
26
|
from openstackclient.volume.v2 import volume_snapshot
|
|
24
27
|
|
|
25
28
|
|
|
26
|
-
class
|
|
27
|
-
def setUp(self):
|
|
28
|
-
super().setUp()
|
|
29
|
-
|
|
30
|
-
self.snapshots_mock = self.volume_client.volume_snapshots
|
|
31
|
-
self.snapshots_mock.reset_mock()
|
|
32
|
-
self.volumes_mock = self.volume_client.volumes
|
|
33
|
-
self.volumes_mock.reset_mock()
|
|
34
|
-
self.project_mock = self.identity_client.projects
|
|
35
|
-
self.project_mock.reset_mock()
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class TestVolumeSnapshotCreate(TestVolumeSnapshot):
|
|
29
|
+
class TestVolumeSnapshotCreate(volume_fakes.TestVolume):
|
|
39
30
|
columns = (
|
|
40
31
|
'created_at',
|
|
41
32
|
'description',
|
|
@@ -50,69 +41,71 @@ class TestVolumeSnapshotCreate(TestVolumeSnapshot):
|
|
|
50
41
|
def setUp(self):
|
|
51
42
|
super().setUp()
|
|
52
43
|
|
|
53
|
-
self.volume =
|
|
54
|
-
self.
|
|
55
|
-
|
|
44
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
45
|
+
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
46
|
+
self.snapshot = sdk_fakes.generate_fake_resource(
|
|
47
|
+
_snapshot.Snapshot, volume_id=self.volume.id
|
|
56
48
|
)
|
|
49
|
+
self.volume_sdk_client.create_snapshot.return_value = self.snapshot
|
|
50
|
+
self.volume_sdk_client.manage_snapshot.return_value = self.snapshot
|
|
57
51
|
|
|
58
52
|
self.data = (
|
|
59
|
-
self.
|
|
60
|
-
self.
|
|
61
|
-
self.
|
|
62
|
-
self.
|
|
63
|
-
format_columns.DictColumn(self.
|
|
64
|
-
self.
|
|
65
|
-
self.
|
|
66
|
-
self.
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
self.volumes_mock.get.return_value = self.volume
|
|
70
|
-
self.snapshots_mock.create.return_value = self.new_snapshot
|
|
71
|
-
self.snapshots_mock.manage.return_value = self.new_snapshot
|
|
72
|
-
# Get the command object to test
|
|
53
|
+
self.snapshot.created_at,
|
|
54
|
+
self.snapshot.description,
|
|
55
|
+
self.snapshot.id,
|
|
56
|
+
self.snapshot.name,
|
|
57
|
+
format_columns.DictColumn(self.snapshot.metadata),
|
|
58
|
+
self.snapshot.size,
|
|
59
|
+
self.snapshot.status,
|
|
60
|
+
self.snapshot.volume_id,
|
|
61
|
+
)
|
|
62
|
+
|
|
73
63
|
self.cmd = volume_snapshot.CreateVolumeSnapshot(self.app, None)
|
|
74
64
|
|
|
75
65
|
def test_snapshot_create(self):
|
|
76
66
|
arglist = [
|
|
77
67
|
"--volume",
|
|
78
|
-
self.
|
|
68
|
+
self.snapshot.volume_id,
|
|
79
69
|
"--description",
|
|
80
|
-
self.
|
|
70
|
+
self.snapshot.description,
|
|
81
71
|
"--force",
|
|
82
72
|
'--property',
|
|
83
73
|
'Alpha=a',
|
|
84
74
|
'--property',
|
|
85
75
|
'Beta=b',
|
|
86
|
-
self.
|
|
76
|
+
self.snapshot.name,
|
|
87
77
|
]
|
|
88
78
|
verifylist = [
|
|
89
|
-
("volume", self.
|
|
90
|
-
("description", self.
|
|
79
|
+
("volume", self.snapshot.volume_id),
|
|
80
|
+
("description", self.snapshot.description),
|
|
91
81
|
("force", True),
|
|
92
|
-
('
|
|
93
|
-
("snapshot_name", self.
|
|
82
|
+
('properties', {'Alpha': 'a', 'Beta': 'b'}),
|
|
83
|
+
("snapshot_name", self.snapshot.name),
|
|
94
84
|
]
|
|
95
85
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
96
86
|
|
|
97
87
|
columns, data = self.cmd.take_action(parsed_args)
|
|
98
88
|
|
|
99
|
-
self.
|
|
100
|
-
|
|
89
|
+
self.assertEqual(self.columns, columns)
|
|
90
|
+
self.assertEqual(self.data, data)
|
|
91
|
+
self.volume_sdk_client.find_volume.assert_called_once_with(
|
|
92
|
+
self.snapshot.volume_id, ignore_missing=False
|
|
93
|
+
)
|
|
94
|
+
self.volume_sdk_client.create_snapshot.assert_called_with(
|
|
95
|
+
volume_id=self.snapshot.volume_id,
|
|
101
96
|
force=True,
|
|
102
|
-
name=self.
|
|
103
|
-
description=self.
|
|
97
|
+
name=self.snapshot.name,
|
|
98
|
+
description=self.snapshot.description,
|
|
104
99
|
metadata={'Alpha': 'a', 'Beta': 'b'},
|
|
105
100
|
)
|
|
106
|
-
self.assertEqual(self.columns, columns)
|
|
107
|
-
self.assertEqual(self.data, data)
|
|
108
101
|
|
|
109
102
|
def test_snapshot_create_without_name(self):
|
|
110
103
|
arglist = [
|
|
111
104
|
"--volume",
|
|
112
|
-
self.
|
|
105
|
+
self.snapshot.volume_id,
|
|
113
106
|
]
|
|
114
107
|
verifylist = [
|
|
115
|
-
("volume", self.
|
|
108
|
+
("volume", self.snapshot.volume_id),
|
|
116
109
|
]
|
|
117
110
|
self.assertRaises(
|
|
118
111
|
test_utils.ParserException,
|
|
@@ -125,29 +118,31 @@ class TestVolumeSnapshotCreate(TestVolumeSnapshot):
|
|
|
125
118
|
def test_snapshot_create_without_volume(self):
|
|
126
119
|
arglist = [
|
|
127
120
|
"--description",
|
|
128
|
-
self.
|
|
121
|
+
self.snapshot.description,
|
|
129
122
|
"--force",
|
|
130
|
-
self.
|
|
123
|
+
self.snapshot.name,
|
|
131
124
|
]
|
|
132
125
|
verifylist = [
|
|
133
|
-
("description", self.
|
|
126
|
+
("description", self.snapshot.description),
|
|
134
127
|
("force", True),
|
|
135
|
-
("snapshot_name", self.
|
|
128
|
+
("snapshot_name", self.snapshot.name),
|
|
136
129
|
]
|
|
137
130
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
138
131
|
|
|
139
132
|
columns, data = self.cmd.take_action(parsed_args)
|
|
140
133
|
|
|
141
|
-
self.
|
|
142
|
-
self.
|
|
143
|
-
|
|
134
|
+
self.assertEqual(self.columns, columns)
|
|
135
|
+
self.assertEqual(self.data, data)
|
|
136
|
+
self.volume_sdk_client.find_volume.assert_called_once_with(
|
|
137
|
+
self.snapshot.name, ignore_missing=False
|
|
138
|
+
)
|
|
139
|
+
self.volume_sdk_client.create_snapshot.assert_called_once_with(
|
|
140
|
+
volume_id=self.snapshot.volume_id,
|
|
144
141
|
force=True,
|
|
145
|
-
name=self.
|
|
146
|
-
description=self.
|
|
142
|
+
name=self.snapshot.name,
|
|
143
|
+
description=self.snapshot.description,
|
|
147
144
|
metadata=None,
|
|
148
145
|
)
|
|
149
|
-
self.assertEqual(self.columns, columns)
|
|
150
|
-
self.assertEqual(self.data, data)
|
|
151
146
|
|
|
152
147
|
def test_snapshot_create_with_remote_source(self):
|
|
153
148
|
arglist = [
|
|
@@ -156,8 +151,8 @@ class TestVolumeSnapshotCreate(TestVolumeSnapshot):
|
|
|
156
151
|
'--remote-source',
|
|
157
152
|
'source-id=test_source_id',
|
|
158
153
|
'--volume',
|
|
159
|
-
self.
|
|
160
|
-
self.
|
|
154
|
+
self.snapshot.volume_id,
|
|
155
|
+
self.snapshot.name,
|
|
161
156
|
]
|
|
162
157
|
ref_dict = {
|
|
163
158
|
'source-name': 'test_source_name',
|
|
@@ -165,35 +160,38 @@ class TestVolumeSnapshotCreate(TestVolumeSnapshot):
|
|
|
165
160
|
}
|
|
166
161
|
verifylist = [
|
|
167
162
|
('remote_source', ref_dict),
|
|
168
|
-
('volume', self.
|
|
169
|
-
("snapshot_name", self.
|
|
163
|
+
('volume', self.snapshot.volume_id),
|
|
164
|
+
("snapshot_name", self.snapshot.name),
|
|
170
165
|
]
|
|
171
166
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
172
167
|
|
|
173
168
|
columns, data = self.cmd.take_action(parsed_args)
|
|
174
169
|
|
|
175
|
-
self.
|
|
176
|
-
|
|
170
|
+
self.assertEqual(self.columns, columns)
|
|
171
|
+
self.assertEqual(self.data, data)
|
|
172
|
+
self.volume_sdk_client.find_volume.assert_called_once_with(
|
|
173
|
+
self.snapshot.volume_id, ignore_missing=False
|
|
174
|
+
)
|
|
175
|
+
self.volume_sdk_client.manage_snapshot.assert_called_with(
|
|
176
|
+
volume_id=self.snapshot.volume_id,
|
|
177
177
|
ref=ref_dict,
|
|
178
|
-
name=self.
|
|
178
|
+
name=self.snapshot.name,
|
|
179
179
|
description=None,
|
|
180
180
|
metadata=None,
|
|
181
181
|
)
|
|
182
|
-
self.
|
|
183
|
-
self.assertEqual(self.columns, columns)
|
|
184
|
-
self.assertEqual(self.data, data)
|
|
182
|
+
self.volume_sdk_client.create_snapshot.assert_not_called()
|
|
185
183
|
|
|
186
184
|
|
|
187
|
-
class TestVolumeSnapshotDelete(
|
|
188
|
-
snapshots = volume_fakes.create_snapshots(count=2)
|
|
189
|
-
|
|
185
|
+
class TestVolumeSnapshotDelete(volume_fakes.TestVolume):
|
|
190
186
|
def setUp(self):
|
|
191
187
|
super().setUp()
|
|
192
188
|
|
|
193
|
-
self.
|
|
194
|
-
|
|
189
|
+
self.snapshots = list(
|
|
190
|
+
sdk_fakes.generate_fake_resources(_snapshot.Snapshot)
|
|
191
|
+
)
|
|
192
|
+
self.volume_sdk_client.find_snapshot.side_effect = self.snapshots
|
|
193
|
+
self.volume_sdk_client.delete_snapshot.return_value = None
|
|
195
194
|
|
|
196
|
-
# Get the command object to mock
|
|
197
195
|
self.cmd = volume_snapshot.DeleteVolumeSnapshot(self.app, None)
|
|
198
196
|
|
|
199
197
|
def test_snapshot_delete(self):
|
|
@@ -202,11 +200,14 @@ class TestVolumeSnapshotDelete(TestVolumeSnapshot):
|
|
|
202
200
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
203
201
|
|
|
204
202
|
result = self.cmd.take_action(parsed_args)
|
|
203
|
+
self.assertIsNone(result)
|
|
205
204
|
|
|
206
|
-
self.
|
|
207
|
-
self.snapshots[0].id, False
|
|
205
|
+
self.volume_sdk_client.find_snapshot.assert_called_once_with(
|
|
206
|
+
self.snapshots[0].id, ignore_missing=False
|
|
207
|
+
)
|
|
208
|
+
self.volume_sdk_client.delete_snapshot.assert_called_once_with(
|
|
209
|
+
self.snapshots[0].id, force=False
|
|
208
210
|
)
|
|
209
|
-
self.assertIsNone(result)
|
|
210
211
|
|
|
211
212
|
def test_snapshot_delete_with_force(self):
|
|
212
213
|
arglist = ['--force', self.snapshots[0].id]
|
|
@@ -214,11 +215,14 @@ class TestVolumeSnapshotDelete(TestVolumeSnapshot):
|
|
|
214
215
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
215
216
|
|
|
216
217
|
result = self.cmd.take_action(parsed_args)
|
|
218
|
+
self.assertIsNone(result)
|
|
217
219
|
|
|
218
|
-
self.
|
|
219
|
-
self.snapshots[0].id,
|
|
220
|
+
self.volume_sdk_client.find_snapshot.assert_called_once_with(
|
|
221
|
+
self.snapshots[0].id, ignore_missing=False
|
|
222
|
+
)
|
|
223
|
+
self.volume_sdk_client.delete_snapshot.assert_called_once_with(
|
|
224
|
+
self.snapshots[0].id, force=True
|
|
220
225
|
)
|
|
221
|
-
self.assertIsNone(result)
|
|
222
226
|
|
|
223
227
|
def test_delete_multiple_snapshots(self):
|
|
224
228
|
arglist = []
|
|
@@ -227,17 +231,24 @@ class TestVolumeSnapshotDelete(TestVolumeSnapshot):
|
|
|
227
231
|
verifylist = [
|
|
228
232
|
('snapshots', arglist),
|
|
229
233
|
]
|
|
230
|
-
|
|
231
234
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
232
|
-
result = self.cmd.take_action(parsed_args)
|
|
233
235
|
|
|
234
|
-
|
|
235
|
-
for s in self.snapshots:
|
|
236
|
-
calls.append(mock.call(s.id, False))
|
|
237
|
-
self.snapshots_mock.delete.assert_has_calls(calls)
|
|
236
|
+
result = self.cmd.take_action(parsed_args)
|
|
238
237
|
self.assertIsNone(result)
|
|
239
238
|
|
|
239
|
+
self.volume_sdk_client.find_snapshot.assert_has_calls(
|
|
240
|
+
[mock.call(x.id, ignore_missing=False) for x in self.snapshots]
|
|
241
|
+
)
|
|
242
|
+
self.volume_sdk_client.delete_snapshot.assert_has_calls(
|
|
243
|
+
[mock.call(x.id, force=False) for x in self.snapshots]
|
|
244
|
+
)
|
|
245
|
+
|
|
240
246
|
def test_delete_multiple_snapshots_with_exception(self):
|
|
247
|
+
self.volume_sdk_client.find_snapshot.side_effect = [
|
|
248
|
+
self.snapshots[0],
|
|
249
|
+
sdk_exceptions.NotFoundException(),
|
|
250
|
+
]
|
|
251
|
+
|
|
241
252
|
arglist = [
|
|
242
253
|
self.snapshots[0].id,
|
|
243
254
|
'unexist_snapshot',
|
|
@@ -248,73 +259,77 @@ class TestVolumeSnapshotDelete(TestVolumeSnapshot):
|
|
|
248
259
|
|
|
249
260
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
250
261
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
self.fail('CommandError should be raised.')
|
|
258
|
-
except exceptions.CommandError as e:
|
|
259
|
-
self.assertEqual('1 of 2 snapshots failed to delete.', str(e))
|
|
260
|
-
|
|
261
|
-
find_mock.assert_any_call(
|
|
262
|
-
self.snapshots_mock, self.snapshots[0].id
|
|
263
|
-
)
|
|
264
|
-
find_mock.assert_any_call(self.snapshots_mock, 'unexist_snapshot')
|
|
262
|
+
exc = self.assertRaises(
|
|
263
|
+
exceptions.CommandError,
|
|
264
|
+
self.cmd.take_action,
|
|
265
|
+
parsed_args,
|
|
266
|
+
)
|
|
267
|
+
self.assertEqual('1 of 2 snapshots failed to delete.', str(exc))
|
|
265
268
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
self.snapshots[0].id, False
|
|
269
|
-
|
|
269
|
+
self.volume_sdk_client.find_snapshot.assert_has_calls(
|
|
270
|
+
[
|
|
271
|
+
mock.call(self.snapshots[0].id, ignore_missing=False),
|
|
272
|
+
mock.call('unexist_snapshot', ignore_missing=False),
|
|
273
|
+
]
|
|
274
|
+
)
|
|
275
|
+
self.volume_sdk_client.delete_snapshot.assert_has_calls(
|
|
276
|
+
[
|
|
277
|
+
mock.call(self.snapshots[0].id, force=False),
|
|
278
|
+
]
|
|
279
|
+
)
|
|
270
280
|
|
|
271
281
|
|
|
272
|
-
class TestVolumeSnapshotList(
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
snapshots = volume_fakes.create_snapshots(
|
|
276
|
-
attrs={'volume_id': volume.name}, count=3
|
|
277
|
-
)
|
|
282
|
+
class TestVolumeSnapshotList(volume_fakes.TestVolume):
|
|
283
|
+
def setUp(self):
|
|
284
|
+
super().setUp()
|
|
278
285
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
for s in snapshots:
|
|
284
|
-
data.append(
|
|
285
|
-
(
|
|
286
|
-
s.id,
|
|
287
|
-
s.name,
|
|
288
|
-
s.description,
|
|
289
|
-
s.status,
|
|
290
|
-
s.size,
|
|
286
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
287
|
+
self.snapshots = list(
|
|
288
|
+
sdk_fakes.generate_fake_resources(
|
|
289
|
+
_snapshot.Snapshot, attrs={'volume_id': self.volume.name}
|
|
291
290
|
)
|
|
292
291
|
)
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
),
|
|
306
|
-
format_columns.DictColumn(s.metadata),
|
|
307
|
-
)
|
|
292
|
+
self.project = project_fakes.FakeProject.create_one_project()
|
|
293
|
+
self.volume_sdk_client.volumes.return_value = [self.volume]
|
|
294
|
+
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
295
|
+
self.volume_sdk_client.snapshots.return_value = self.snapshots
|
|
296
|
+
self.project_mock = self.identity_client.projects
|
|
297
|
+
self.project_mock.get.return_value = self.project
|
|
298
|
+
|
|
299
|
+
self.columns = ("ID", "Name", "Description", "Status", "Size")
|
|
300
|
+
self.columns_long = self.columns + (
|
|
301
|
+
"Created At",
|
|
302
|
+
"Volume",
|
|
303
|
+
"Properties",
|
|
308
304
|
)
|
|
309
305
|
|
|
310
|
-
|
|
311
|
-
|
|
306
|
+
self.data = []
|
|
307
|
+
self.data_long = []
|
|
308
|
+
for s in self.snapshots:
|
|
309
|
+
self.data.append(
|
|
310
|
+
(
|
|
311
|
+
s.id,
|
|
312
|
+
s.name,
|
|
313
|
+
s.description,
|
|
314
|
+
s.status,
|
|
315
|
+
s.size,
|
|
316
|
+
)
|
|
317
|
+
)
|
|
318
|
+
self.data_long.append(
|
|
319
|
+
(
|
|
320
|
+
s.id,
|
|
321
|
+
s.name,
|
|
322
|
+
s.description,
|
|
323
|
+
s.status,
|
|
324
|
+
s.size,
|
|
325
|
+
s.created_at,
|
|
326
|
+
volume_snapshot.VolumeIdColumn(
|
|
327
|
+
s.volume_id, volume_cache={self.volume.id: self.volume}
|
|
328
|
+
),
|
|
329
|
+
format_columns.DictColumn(s.metadata),
|
|
330
|
+
)
|
|
331
|
+
)
|
|
312
332
|
|
|
313
|
-
self.volumes_mock.list.return_value = [self.volume]
|
|
314
|
-
self.volumes_mock.get.return_value = self.volume
|
|
315
|
-
self.project_mock.get.return_value = self.project
|
|
316
|
-
self.snapshots_mock.list.return_value = self.snapshots
|
|
317
|
-
# Get the command to test
|
|
318
333
|
self.cmd = volume_snapshot.ListVolumeSnapshot(self.app, None)
|
|
319
334
|
|
|
320
335
|
def test_snapshot_list_without_options(self):
|
|
@@ -324,16 +339,14 @@ class TestVolumeSnapshotList(TestVolumeSnapshot):
|
|
|
324
339
|
|
|
325
340
|
columns, data = self.cmd.take_action(parsed_args)
|
|
326
341
|
|
|
327
|
-
self.
|
|
342
|
+
self.volume_sdk_client.snapshots.assert_called_once_with(
|
|
328
343
|
limit=None,
|
|
329
344
|
marker=None,
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
'volume_id': None,
|
|
336
|
-
},
|
|
345
|
+
all_projects=False,
|
|
346
|
+
name=None,
|
|
347
|
+
status=None,
|
|
348
|
+
project_id=None,
|
|
349
|
+
volume_id=None,
|
|
337
350
|
)
|
|
338
351
|
self.assertEqual(self.columns, columns)
|
|
339
352
|
self.assertEqual(self.data, list(data))
|
|
@@ -359,16 +372,14 @@ class TestVolumeSnapshotList(TestVolumeSnapshot):
|
|
|
359
372
|
|
|
360
373
|
columns, data = self.cmd.take_action(parsed_args)
|
|
361
374
|
|
|
362
|
-
self.
|
|
375
|
+
self.volume_sdk_client.snapshots.assert_called_once_with(
|
|
363
376
|
limit=2,
|
|
364
377
|
marker=self.snapshots[0].id,
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
'volume_id': None,
|
|
371
|
-
},
|
|
378
|
+
all_projects=True,
|
|
379
|
+
project_id=self.project.id,
|
|
380
|
+
name=None,
|
|
381
|
+
status=None,
|
|
382
|
+
volume_id=None,
|
|
372
383
|
)
|
|
373
384
|
self.assertEqual(self.columns_long, columns)
|
|
374
385
|
self.assertEqual(self.data_long, list(data))
|
|
@@ -382,16 +393,14 @@ class TestVolumeSnapshotList(TestVolumeSnapshot):
|
|
|
382
393
|
|
|
383
394
|
columns, data = self.cmd.take_action(parsed_args)
|
|
384
395
|
|
|
385
|
-
self.
|
|
396
|
+
self.volume_sdk_client.snapshots.assert_called_once_with(
|
|
386
397
|
limit=None,
|
|
387
398
|
marker=None,
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
'volume_id': None,
|
|
394
|
-
},
|
|
399
|
+
all_projects=True,
|
|
400
|
+
name=None,
|
|
401
|
+
status=None,
|
|
402
|
+
project_id=None,
|
|
403
|
+
volume_id=None,
|
|
395
404
|
)
|
|
396
405
|
self.assertEqual(self.columns, columns)
|
|
397
406
|
self.assertEqual(self.data, list(data))
|
|
@@ -410,16 +419,14 @@ class TestVolumeSnapshotList(TestVolumeSnapshot):
|
|
|
410
419
|
|
|
411
420
|
columns, data = self.cmd.take_action(parsed_args)
|
|
412
421
|
|
|
413
|
-
self.
|
|
422
|
+
self.volume_sdk_client.snapshots.assert_called_once_with(
|
|
414
423
|
limit=None,
|
|
415
424
|
marker=None,
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
'volume_id': None,
|
|
422
|
-
},
|
|
425
|
+
all_projects=False,
|
|
426
|
+
name=self.snapshots[0].name,
|
|
427
|
+
status=None,
|
|
428
|
+
project_id=None,
|
|
429
|
+
volume_id=None,
|
|
423
430
|
)
|
|
424
431
|
self.assertEqual(self.columns, columns)
|
|
425
432
|
self.assertEqual(self.data, list(data))
|
|
@@ -427,27 +434,25 @@ class TestVolumeSnapshotList(TestVolumeSnapshot):
|
|
|
427
434
|
def test_snapshot_list_status_option(self):
|
|
428
435
|
arglist = [
|
|
429
436
|
'--status',
|
|
430
|
-
|
|
437
|
+
'available',
|
|
431
438
|
]
|
|
432
439
|
verifylist = [
|
|
433
440
|
('all_projects', False),
|
|
434
441
|
('long', False),
|
|
435
|
-
('status',
|
|
442
|
+
('status', 'available'),
|
|
436
443
|
]
|
|
437
444
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
438
445
|
|
|
439
446
|
columns, data = self.cmd.take_action(parsed_args)
|
|
440
447
|
|
|
441
|
-
self.
|
|
448
|
+
self.volume_sdk_client.snapshots.assert_called_once_with(
|
|
442
449
|
limit=None,
|
|
443
450
|
marker=None,
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
'volume_id': None,
|
|
450
|
-
},
|
|
451
|
+
all_projects=False,
|
|
452
|
+
name=None,
|
|
453
|
+
status='available',
|
|
454
|
+
project_id=None,
|
|
455
|
+
volume_id=None,
|
|
451
456
|
)
|
|
452
457
|
self.assertEqual(self.columns, columns)
|
|
453
458
|
self.assertEqual(self.data, list(data))
|
|
@@ -466,16 +471,14 @@ class TestVolumeSnapshotList(TestVolumeSnapshot):
|
|
|
466
471
|
|
|
467
472
|
columns, data = self.cmd.take_action(parsed_args)
|
|
468
473
|
|
|
469
|
-
self.
|
|
474
|
+
self.volume_sdk_client.snapshots.assert_called_once_with(
|
|
470
475
|
limit=None,
|
|
471
476
|
marker=None,
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
'volume_id': self.volume.id,
|
|
478
|
-
},
|
|
477
|
+
all_projects=False,
|
|
478
|
+
name=None,
|
|
479
|
+
status=None,
|
|
480
|
+
project_id=None,
|
|
481
|
+
volume_id=self.volume.id,
|
|
479
482
|
)
|
|
480
483
|
self.assertEqual(self.columns, columns)
|
|
481
484
|
self.assertEqual(self.data, list(data))
|
|
@@ -497,16 +500,18 @@ class TestVolumeSnapshotList(TestVolumeSnapshot):
|
|
|
497
500
|
)
|
|
498
501
|
|
|
499
502
|
|
|
500
|
-
class TestVolumeSnapshotSet(
|
|
501
|
-
snapshot = volume_fakes.create_one_snapshot()
|
|
502
|
-
|
|
503
|
+
class TestVolumeSnapshotSet(volume_fakes.TestVolume):
|
|
503
504
|
def setUp(self):
|
|
504
505
|
super().setUp()
|
|
505
506
|
|
|
506
|
-
self.
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
507
|
+
self.snapshot = sdk_fakes.generate_fake_resource(
|
|
508
|
+
_snapshot.Snapshot, metadata={'foo': 'bar'}
|
|
509
|
+
)
|
|
510
|
+
self.volume_sdk_client.find_snapshot.return_value = self.snapshot
|
|
511
|
+
self.volume_sdk_client.delete_snapshot_metadata.return_value = None
|
|
512
|
+
self.volume_sdk_client.set_snapshot_metadata.return_value = None
|
|
513
|
+
self.volume_sdk_client.update_snapshot.return_value = None
|
|
514
|
+
|
|
510
515
|
self.cmd = volume_snapshot.SetVolumeSnapshot(self.app, None)
|
|
511
516
|
|
|
512
517
|
def test_snapshot_set_no_option(self):
|
|
@@ -519,11 +524,14 @@ class TestVolumeSnapshotSet(TestVolumeSnapshot):
|
|
|
519
524
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
520
525
|
|
|
521
526
|
result = self.cmd.take_action(parsed_args)
|
|
522
|
-
|
|
523
|
-
self.assertNotCalled(self.snapshots_mock.reset_state)
|
|
524
|
-
self.assertNotCalled(self.snapshots_mock.update)
|
|
525
|
-
self.assertNotCalled(self.snapshots_mock.set_metadata)
|
|
527
|
+
|
|
526
528
|
self.assertIsNone(result)
|
|
529
|
+
self.volume_sdk_client.find_snapshot.assert_called_once_with(
|
|
530
|
+
parsed_args.snapshot, ignore_missing=False
|
|
531
|
+
)
|
|
532
|
+
self.volume_sdk_client.reset_snapshot_status.assert_not_called()
|
|
533
|
+
self.volume_sdk_client.update_snapshot.assert_not_called()
|
|
534
|
+
self.volume_sdk_client.set_snapshot_metadata.assert_not_called()
|
|
527
535
|
|
|
528
536
|
def test_snapshot_set_name_and_property(self):
|
|
529
537
|
arglist = [
|
|
@@ -535,26 +543,22 @@ class TestVolumeSnapshotSet(TestVolumeSnapshot):
|
|
|
535
543
|
"foo=foo",
|
|
536
544
|
self.snapshot.id,
|
|
537
545
|
]
|
|
538
|
-
new_property = {"x": "y", "foo": "foo"}
|
|
539
546
|
verifylist = [
|
|
540
547
|
("name", "new_snapshot"),
|
|
541
|
-
("
|
|
548
|
+
("properties", {"x": "y", "foo": "foo"}),
|
|
542
549
|
("snapshot", self.snapshot.id),
|
|
543
550
|
]
|
|
544
551
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
545
552
|
|
|
546
553
|
result = self.cmd.take_action(parsed_args)
|
|
547
554
|
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
self.snapshots_mock.update.assert_called_with(
|
|
552
|
-
self.snapshot.id, **kwargs
|
|
555
|
+
self.assertIsNone(result)
|
|
556
|
+
self.volume_sdk_client.update_snapshot.assert_called_with(
|
|
557
|
+
self.snapshot.id, name="new_snapshot"
|
|
553
558
|
)
|
|
554
|
-
self.
|
|
555
|
-
self.snapshot.id,
|
|
559
|
+
self.volume_sdk_client.set_snapshot_metadata.assert_called_with(
|
|
560
|
+
self.snapshot.id, x="y", foo="foo"
|
|
556
561
|
)
|
|
557
|
-
self.assertIsNone(result)
|
|
558
562
|
|
|
559
563
|
def test_snapshot_set_with_no_property(self):
|
|
560
564
|
arglist = [
|
|
@@ -568,14 +572,17 @@ class TestVolumeSnapshotSet(TestVolumeSnapshot):
|
|
|
568
572
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
569
573
|
|
|
570
574
|
result = self.cmd.take_action(parsed_args)
|
|
571
|
-
|
|
572
|
-
self.assertNotCalled(self.snapshots_mock.reset_state)
|
|
573
|
-
self.assertNotCalled(self.snapshots_mock.update)
|
|
574
|
-
self.assertNotCalled(self.snapshots_mock.set_metadata)
|
|
575
|
-
self.snapshots_mock.delete_metadata.assert_called_with(
|
|
576
|
-
self.snapshot.id, ["foo"]
|
|
577
|
-
)
|
|
575
|
+
|
|
578
576
|
self.assertIsNone(result)
|
|
577
|
+
self.volume_sdk_client.find_snapshot.assert_called_once_with(
|
|
578
|
+
parsed_args.snapshot, ignore_missing=False
|
|
579
|
+
)
|
|
580
|
+
self.volume_sdk_client.reset_snapshot_status.assert_not_called()
|
|
581
|
+
self.volume_sdk_client.update_snapshot.assert_not_called()
|
|
582
|
+
self.volume_sdk_client.set_snapshot_metadata.assert_not_called()
|
|
583
|
+
self.volume_sdk_client.delete_snapshot_metadata.assert_called_with(
|
|
584
|
+
self.snapshot.id, keys=["foo"]
|
|
585
|
+
)
|
|
579
586
|
|
|
580
587
|
def test_snapshot_set_with_no_property_and_property(self):
|
|
581
588
|
arglist = [
|
|
@@ -586,22 +593,26 @@ class TestVolumeSnapshotSet(TestVolumeSnapshot):
|
|
|
586
593
|
]
|
|
587
594
|
verifylist = [
|
|
588
595
|
("no_property", True),
|
|
589
|
-
("
|
|
596
|
+
("properties", {"foo_1": "bar_1"}),
|
|
590
597
|
("snapshot", self.snapshot.id),
|
|
591
598
|
]
|
|
592
599
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
593
600
|
|
|
594
601
|
result = self.cmd.take_action(parsed_args)
|
|
595
|
-
|
|
596
|
-
self.
|
|
597
|
-
self.
|
|
598
|
-
|
|
599
|
-
self.snapshot.id, ["foo"]
|
|
602
|
+
|
|
603
|
+
self.assertIsNone(result)
|
|
604
|
+
self.volume_sdk_client.find_snapshot.assert_called_once_with(
|
|
605
|
+
parsed_args.snapshot, ignore_missing=False
|
|
600
606
|
)
|
|
601
|
-
self.
|
|
602
|
-
|
|
607
|
+
self.volume_sdk_client.reset_snapshot_status.assert_not_called()
|
|
608
|
+
self.volume_sdk_client.update_snapshot.assert_not_called()
|
|
609
|
+
self.volume_sdk_client.delete_snapshot_metadata.assert_called_with(
|
|
610
|
+
self.snapshot.id, keys=["foo"]
|
|
611
|
+
)
|
|
612
|
+
self.volume_sdk_client.set_snapshot_metadata.assert_called_once_with(
|
|
613
|
+
self.snapshot.id,
|
|
614
|
+
foo_1="bar_1",
|
|
603
615
|
)
|
|
604
|
-
self.assertIsNone(result)
|
|
605
616
|
|
|
606
617
|
def test_snapshot_set_state_to_error(self):
|
|
607
618
|
arglist = ["--state", "error", self.snapshot.id]
|
|
@@ -610,30 +621,32 @@ class TestVolumeSnapshotSet(TestVolumeSnapshot):
|
|
|
610
621
|
|
|
611
622
|
result = self.cmd.take_action(parsed_args)
|
|
612
623
|
|
|
613
|
-
self.
|
|
624
|
+
self.assertIsNone(result)
|
|
625
|
+
self.volume_sdk_client.reset_snapshot_status.assert_called_with(
|
|
614
626
|
self.snapshot.id, "error"
|
|
615
627
|
)
|
|
616
|
-
self.assertIsNone(result)
|
|
617
628
|
|
|
618
629
|
def test_volume_set_state_failed(self):
|
|
619
|
-
self.
|
|
630
|
+
self.volume_sdk_client.reset_snapshot_status.side_effect = (
|
|
631
|
+
exceptions.CommandError()
|
|
632
|
+
)
|
|
620
633
|
arglist = ['--state', 'error', self.snapshot.id]
|
|
621
634
|
verifylist = [('state', 'error'), ('snapshot', self.snapshot.id)]
|
|
622
635
|
|
|
623
636
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
)
|
|
631
|
-
self.snapshots_mock.reset_state.assert_called_once_with(
|
|
637
|
+
|
|
638
|
+
exc = self.assertRaises(
|
|
639
|
+
exceptions.CommandError, self.cmd.take_action, parsed_args
|
|
640
|
+
)
|
|
641
|
+
self.assertEqual('One or more of the set operations failed', str(exc))
|
|
642
|
+
self.volume_sdk_client.reset_snapshot_status.assert_called_once_with(
|
|
632
643
|
self.snapshot.id, 'error'
|
|
633
644
|
)
|
|
634
645
|
|
|
635
646
|
def test_volume_set_name_and_state_failed(self):
|
|
636
|
-
self.
|
|
647
|
+
self.volume_sdk_client.reset_snapshot_status.side_effect = (
|
|
648
|
+
exceptions.CommandError()
|
|
649
|
+
)
|
|
637
650
|
arglist = [
|
|
638
651
|
'--state',
|
|
639
652
|
'error',
|
|
@@ -646,43 +659,39 @@ class TestVolumeSnapshotSet(TestVolumeSnapshot):
|
|
|
646
659
|
("name", "new_snapshot"),
|
|
647
660
|
('snapshot', self.snapshot.id),
|
|
648
661
|
]
|
|
649
|
-
|
|
650
662
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
self.snapshots_mock.update.assert_called_once_with(
|
|
662
|
-
self.snapshot.id, **kwargs
|
|
663
|
+
|
|
664
|
+
exc = self.assertRaises(
|
|
665
|
+
exceptions.CommandError,
|
|
666
|
+
self.cmd.take_action,
|
|
667
|
+
parsed_args,
|
|
668
|
+
)
|
|
669
|
+
|
|
670
|
+
self.assertEqual('One or more of the set operations failed', str(exc))
|
|
671
|
+
self.volume_sdk_client.update_snapshot.assert_called_once_with(
|
|
672
|
+
self.snapshot.id, name="new_snapshot"
|
|
663
673
|
)
|
|
664
|
-
self.
|
|
674
|
+
self.volume_sdk_client.reset_snapshot_status.assert_called_once_with(
|
|
665
675
|
self.snapshot.id, 'error'
|
|
666
676
|
)
|
|
667
677
|
|
|
668
678
|
|
|
669
|
-
class TestVolumeSnapshotShow(
|
|
670
|
-
columns = (
|
|
671
|
-
'created_at',
|
|
672
|
-
'description',
|
|
673
|
-
'id',
|
|
674
|
-
'name',
|
|
675
|
-
'properties',
|
|
676
|
-
'size',
|
|
677
|
-
'status',
|
|
678
|
-
'volume_id',
|
|
679
|
-
)
|
|
680
|
-
|
|
679
|
+
class TestVolumeSnapshotShow(volume_fakes.TestVolume):
|
|
681
680
|
def setUp(self):
|
|
682
681
|
super().setUp()
|
|
683
682
|
|
|
684
|
-
self.snapshot =
|
|
685
|
-
|
|
683
|
+
self.snapshot = sdk_fakes.generate_fake_resource(_snapshot.Snapshot)
|
|
684
|
+
|
|
685
|
+
self.columns = (
|
|
686
|
+
'created_at',
|
|
687
|
+
'description',
|
|
688
|
+
'id',
|
|
689
|
+
'name',
|
|
690
|
+
'properties',
|
|
691
|
+
'size',
|
|
692
|
+
'status',
|
|
693
|
+
'volume_id',
|
|
694
|
+
)
|
|
686
695
|
self.data = (
|
|
687
696
|
self.snapshot.created_at,
|
|
688
697
|
self.snapshot.description,
|
|
@@ -694,8 +703,8 @@ class TestVolumeSnapshotShow(TestVolumeSnapshot):
|
|
|
694
703
|
self.snapshot.volume_id,
|
|
695
704
|
)
|
|
696
705
|
|
|
697
|
-
self.
|
|
698
|
-
|
|
706
|
+
self.volume_sdk_client.find_snapshot.return_value = self.snapshot
|
|
707
|
+
|
|
699
708
|
self.cmd = volume_snapshot.ShowVolumeSnapshot(self.app, None)
|
|
700
709
|
|
|
701
710
|
def test_snapshot_show(self):
|
|
@@ -704,21 +713,22 @@ class TestVolumeSnapshotShow(TestVolumeSnapshot):
|
|
|
704
713
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
705
714
|
|
|
706
715
|
columns, data = self.cmd.take_action(parsed_args)
|
|
707
|
-
self.
|
|
716
|
+
self.volume_sdk_client.find_snapshot.assert_called_with(
|
|
717
|
+
self.snapshot.id, ignore_missing=False
|
|
718
|
+
)
|
|
708
719
|
|
|
709
720
|
self.assertEqual(self.columns, columns)
|
|
710
721
|
self.assertCountEqual(self.data, data)
|
|
711
722
|
|
|
712
723
|
|
|
713
|
-
class TestVolumeSnapshotUnset(
|
|
714
|
-
snapshot = volume_fakes.create_one_snapshot()
|
|
715
|
-
|
|
724
|
+
class TestVolumeSnapshotUnset(volume_fakes.TestVolume):
|
|
716
725
|
def setUp(self):
|
|
717
726
|
super().setUp()
|
|
718
727
|
|
|
719
|
-
self.
|
|
720
|
-
self.
|
|
721
|
-
|
|
728
|
+
self.snapshot = sdk_fakes.generate_fake_resource(_snapshot.Snapshot)
|
|
729
|
+
self.volume_sdk_client.find_snapshot.return_value = self.snapshot
|
|
730
|
+
self.volume_sdk_client.delete_snapshot_metadata.return_value = None
|
|
731
|
+
|
|
722
732
|
self.cmd = volume_snapshot.UnsetVolumeSnapshot(self.app, None)
|
|
723
733
|
|
|
724
734
|
def test_snapshot_unset(self):
|
|
@@ -728,7 +738,7 @@ class TestVolumeSnapshotUnset(TestVolumeSnapshot):
|
|
|
728
738
|
self.snapshot.id,
|
|
729
739
|
]
|
|
730
740
|
verifylist = [
|
|
731
|
-
("
|
|
741
|
+
("properties", ["foo"]),
|
|
732
742
|
("snapshot", self.snapshot.id),
|
|
733
743
|
]
|
|
734
744
|
|
|
@@ -736,7 +746,7 @@ class TestVolumeSnapshotUnset(TestVolumeSnapshot):
|
|
|
736
746
|
|
|
737
747
|
result = self.cmd.take_action(parsed_args)
|
|
738
748
|
|
|
739
|
-
self.snapshots_mock.delete_metadata.assert_called_with(
|
|
740
|
-
self.snapshot.id, ["foo"]
|
|
741
|
-
)
|
|
742
749
|
self.assertIsNone(result)
|
|
750
|
+
self.volume_sdk_client.delete_snapshot_metadata.assert_called_with(
|
|
751
|
+
self.snapshot.id, keys=["foo"]
|
|
752
|
+
)
|