python-openstackclient 8.1.0__py3-none-any.whl → 8.3.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/object_store_v1.py +4 -1
- openstackclient/api/volume_v2.py +60 -0
- openstackclient/api/volume_v3.py +60 -0
- openstackclient/command.py +27 -0
- openstackclient/common/availability_zone.py +1 -1
- openstackclient/common/clientmanager.py +59 -21
- openstackclient/common/configuration.py +1 -1
- openstackclient/common/extension.py +1 -1
- openstackclient/common/limits.py +1 -1
- openstackclient/common/module.py +4 -2
- openstackclient/common/project_cleanup.py +10 -8
- openstackclient/common/quota.py +23 -6
- openstackclient/common/versions.py +1 -2
- openstackclient/compute/v2/agent.py +1 -1
- openstackclient/compute/v2/aggregate.py +6 -5
- openstackclient/compute/v2/console.py +5 -3
- openstackclient/compute/v2/console_connection.py +1 -1
- openstackclient/compute/v2/flavor.py +15 -2
- openstackclient/compute/v2/host.py +1 -1
- openstackclient/compute/v2/hypervisor.py +1 -1
- openstackclient/compute/v2/hypervisor_stats.py +1 -1
- openstackclient/compute/v2/keypair.py +1 -1
- openstackclient/compute/v2/server.py +77 -30
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_event.py +1 -1
- openstackclient/compute/v2/server_group.py +4 -2
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +1 -1
- openstackclient/compute/v2/server_volume.py +1 -1
- openstackclient/compute/v2/service.py +1 -1
- openstackclient/compute/v2/usage.py +6 -4
- openstackclient/identity/common.py +10 -14
- openstackclient/identity/v2_0/catalog.py +3 -2
- openstackclient/identity/v2_0/ec2creds.py +1 -1
- openstackclient/identity/v2_0/endpoint.py +1 -1
- openstackclient/identity/v2_0/project.py +17 -7
- openstackclient/identity/v2_0/role.py +1 -1
- openstackclient/identity/v2_0/role_assignment.py +3 -3
- openstackclient/identity/v2_0/service.py +1 -1
- openstackclient/identity/v2_0/token.py +1 -1
- openstackclient/identity/v2_0/user.py +2 -2
- openstackclient/identity/v3/access_rule.py +16 -4
- openstackclient/identity/v3/application_credential.py +116 -95
- openstackclient/identity/v3/catalog.py +3 -3
- openstackclient/identity/v3/consumer.py +1 -1
- openstackclient/identity/v3/credential.py +1 -1
- openstackclient/identity/v3/domain.py +15 -10
- openstackclient/identity/v3/ec2creds.py +1 -1
- openstackclient/identity/v3/endpoint.py +33 -12
- openstackclient/identity/v3/endpoint_group.py +1 -1
- openstackclient/identity/v3/federation_protocol.py +1 -1
- openstackclient/identity/v3/group.py +11 -5
- openstackclient/identity/v3/identity_provider.py +12 -10
- openstackclient/identity/v3/implied_role.py +1 -1
- openstackclient/identity/v3/limit.py +1 -1
- openstackclient/identity/v3/mapping.py +1 -1
- openstackclient/identity/v3/policy.py +1 -1
- openstackclient/identity/v3/project.py +34 -22
- openstackclient/identity/v3/region.py +1 -1
- openstackclient/identity/v3/registered_limit.py +16 -11
- openstackclient/identity/v3/role.py +27 -41
- openstackclient/identity/v3/role_assignment.py +12 -23
- openstackclient/identity/v3/service.py +1 -1
- openstackclient/identity/v3/service_provider.py +1 -1
- openstackclient/identity/v3/tag.py +3 -2
- openstackclient/identity/v3/token.py +3 -2
- openstackclient/identity/v3/trust.py +4 -2
- openstackclient/identity/v3/unscoped_saml.py +1 -1
- openstackclient/identity/v3/user.py +22 -13
- openstackclient/image/v1/image.py +35 -17
- openstackclient/image/v2/cache.py +11 -7
- openstackclient/image/v2/image.py +62 -12
- openstackclient/image/v2/info.py +1 -1
- openstackclient/image/v2/metadef_namespaces.py +1 -1
- openstackclient/image/v2/metadef_objects.py +9 -3
- openstackclient/image/v2/metadef_properties.py +11 -3
- openstackclient/image/v2/metadef_resource_type_association.py +1 -1
- openstackclient/image/v2/metadef_resource_types.py +1 -1
- openstackclient/image/v2/task.py +1 -1
- openstackclient/network/common.py +10 -9
- openstackclient/network/v2/address_group.py +4 -3
- openstackclient/network/v2/address_scope.py +8 -6
- openstackclient/network/v2/default_security_group_rule.py +9 -8
- openstackclient/network/v2/floating_ip.py +16 -9
- openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
- openstackclient/network/v2/ip_availability.py +7 -4
- openstackclient/network/v2/l3_conntrack_helper.py +11 -4
- openstackclient/network/v2/local_ip.py +13 -7
- openstackclient/network/v2/local_ip_association.py +7 -4
- openstackclient/network/v2/ndp_proxy.py +13 -6
- openstackclient/network/v2/network.py +33 -16
- openstackclient/network/v2/network_agent.py +5 -5
- openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
- openstackclient/network/v2/network_flavor.py +1 -1
- openstackclient/network/v2/network_flavor_profile.py +1 -1
- openstackclient/network/v2/network_meter.py +1 -1
- openstackclient/network/v2/network_meter_rule.py +1 -1
- openstackclient/network/v2/network_qos_policy.py +7 -5
- openstackclient/network/v2/network_qos_rule.py +1 -1
- openstackclient/network/v2/network_qos_rule_type.py +1 -1
- openstackclient/network/v2/network_rbac.py +8 -5
- openstackclient/network/v2/network_segment.py +2 -2
- openstackclient/network/v2/network_segment_range.py +13 -6
- openstackclient/network/v2/network_service_provider.py +1 -1
- openstackclient/network/v2/network_trunk.py +65 -42
- openstackclient/network/v2/port.py +38 -20
- openstackclient/network/v2/router.py +19 -8
- openstackclient/network/v2/security_group.py +52 -7
- openstackclient/network/v2/security_group_rule.py +27 -4
- openstackclient/network/v2/subnet.py +17 -18
- openstackclient/network/v2/subnet_pool.py +11 -9
- openstackclient/network/v2/taas/__init__.py +0 -0
- openstackclient/network/v2/taas/tap_flow.py +245 -0
- openstackclient/network/v2/taas/tap_mirror.py +237 -0
- openstackclient/network/v2/taas/tap_service.py +211 -0
- openstackclient/object/v1/account.py +1 -1
- openstackclient/object/v1/container.py +1 -1
- openstackclient/object/v1/object.py +1 -1
- openstackclient/shell.py +18 -8
- 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/identity/v3/test_catalog.py +42 -23
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
- openstackclient/tests/functional/image/v2/test_cache.py +54 -0
- openstackclient/tests/functional/image/v2/test_image.py +36 -14
- openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
- 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/common/test_command.py +1 -1
- openstackclient/tests/unit/common/test_extension.py +2 -3
- openstackclient/tests/unit/common/test_module.py +14 -7
- openstackclient/tests/unit/common/test_quota.py +20 -0
- openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
- openstackclient/tests/unit/compute/v2/test_console.py +1 -4
- openstackclient/tests/unit/compute/v2/test_flavor.py +160 -177
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
- openstackclient/tests/unit/compute/v2/test_server.py +406 -81
- openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
- openstackclient/tests/unit/compute/v2/test_service.py +1 -3
- openstackclient/tests/unit/fakes.py +35 -134
- openstackclient/tests/unit/identity/test_common.py +100 -0
- openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
- openstackclient/tests/unit/identity/v3/fakes.py +10 -2
- openstackclient/tests/unit/identity/v3/test_application_credential.py +50 -44
- openstackclient/tests/unit/identity/v3/test_domain.py +3 -3
- openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
- openstackclient/tests/unit/identity/v3/test_group.py +4 -2
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
- openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
- openstackclient/tests/unit/identity/v3/test_project.py +31 -54
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
- openstackclient/tests/unit/identity/v3/test_role.py +3 -90
- openstackclient/tests/unit/identity/v3/test_user.py +7 -51
- openstackclient/tests/unit/image/v1/test_image.py +47 -0
- openstackclient/tests/unit/image/v2/test_image.py +190 -9
- 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/test_common.py +9 -13
- openstackclient/tests/unit/network/v2/fakes.py +1 -0
- openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
- openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
- openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
- openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
- openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
- openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
- openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -23
- openstackclient/tests/unit/network/v2/test_network.py +41 -37
- openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
- openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
- openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
- openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
- openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
- openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
- openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
- openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
- openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
- openstackclient/tests/unit/network/v2/test_port.py +113 -84
- openstackclient/tests/unit/network/v2/test_router.py +104 -126
- openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -26
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +66 -18
- openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
- openstackclient/tests/unit/volume/test_find_resource.py +4 -13
- openstackclient/tests/unit/volume/v2/test_volume.py +358 -305
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume.py +443 -415
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
- openstackclient/volume/client.py +7 -17
- openstackclient/volume/v2/backup_record.py +1 -1
- openstackclient/volume/v2/consistency_group.py +1 -1
- openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
- openstackclient/volume/v2/qos_specs.py +1 -1
- openstackclient/volume/v2/service.py +2 -2
- openstackclient/volume/v2/volume.py +80 -54
- openstackclient/volume/v2/volume_backend.py +1 -1
- openstackclient/volume/v2/volume_backup.py +5 -3
- openstackclient/volume/v2/volume_host.py +1 -2
- openstackclient/volume/v2/volume_snapshot.py +2 -2
- openstackclient/volume/v2/volume_transfer_request.py +1 -1
- openstackclient/volume/v2/volume_type.py +11 -6
- openstackclient/volume/v3/block_storage_cleanup.py +1 -1
- openstackclient/volume/v3/block_storage_cluster.py +1 -1
- openstackclient/volume/v3/block_storage_log_level.py +1 -1
- openstackclient/volume/v3/block_storage_manage.py +1 -1
- openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
- openstackclient/volume/v3/service.py +2 -2
- openstackclient/volume/v3/volume.py +104 -77
- openstackclient/volume/v3/volume_attachment.py +6 -5
- openstackclient/volume/v3/volume_backup.py +18 -3
- openstackclient/volume/v3/volume_group.py +2 -2
- openstackclient/volume/v3/volume_group_snapshot.py +1 -1
- openstackclient/volume/v3/volume_group_type.py +1 -1
- openstackclient/volume/v3/volume_message.py +1 -1
- openstackclient/volume/v3/volume_snapshot.py +2 -2
- openstackclient/volume/v3/volume_transfer_request.py +1 -1
- openstackclient/volume/v3/volume_type.py +15 -9
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +19 -17
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +239 -224
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +15 -0
- python_openstackclient-8.3.0.dist-info/pbr.json +1 -0
- openstackclient/tests/unit/common/test_logs.py +0 -221
- python_openstackclient-8.1.0.dist-info/pbr.json +0 -1
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/LICENSE +0 -0
- {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
|
|
14
14
|
import copy
|
|
15
15
|
from unittest import mock
|
|
16
|
+
import uuid
|
|
16
17
|
|
|
18
|
+
from openstack.block_storage.v3 import backup as _backup
|
|
17
19
|
from openstack.block_storage.v3 import block_storage_summary as _summary
|
|
18
20
|
from openstack.block_storage.v3 import snapshot as _snapshot
|
|
19
21
|
from openstack.block_storage.v3 import volume as _volume
|
|
@@ -23,6 +25,7 @@ from osc_lib.cli import format_columns
|
|
|
23
25
|
from osc_lib import exceptions
|
|
24
26
|
from osc_lib import utils
|
|
25
27
|
|
|
28
|
+
from openstackclient.api import volume_v3
|
|
26
29
|
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
|
|
27
30
|
from openstackclient.tests.unit.image.v2 import fakes as image_fakes
|
|
28
31
|
from openstackclient.tests.unit import utils as test_utils
|
|
@@ -30,55 +33,83 @@ from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
|
|
|
30
33
|
from openstackclient.volume.v3 import volume
|
|
31
34
|
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
35
|
-
project = identity_fakes.FakeProject.create_one_project()
|
|
36
|
-
user = identity_fakes.FakeUser.create_one_user()
|
|
37
|
-
|
|
36
|
+
class TestVolumeCreate(volume_fakes.TestVolume):
|
|
38
37
|
columns = (
|
|
39
38
|
'attachments',
|
|
40
39
|
'availability_zone',
|
|
40
|
+
'backup_id',
|
|
41
41
|
'bootable',
|
|
42
|
+
'cluster_name',
|
|
43
|
+
'consistencygroup_id',
|
|
44
|
+
'consumes_quota',
|
|
45
|
+
'created_at',
|
|
42
46
|
'description',
|
|
47
|
+
'encrypted',
|
|
48
|
+
'encryption_key_id',
|
|
49
|
+
'group_id',
|
|
43
50
|
'id',
|
|
51
|
+
'multiattach',
|
|
44
52
|
'name',
|
|
53
|
+
'os-vol-host-attr:host',
|
|
54
|
+
'os-vol-mig-status-attr:migstat',
|
|
55
|
+
'os-vol-mig-status-attr:name_id',
|
|
56
|
+
'os-vol-tenant-attr:tenant_id',
|
|
45
57
|
'properties',
|
|
58
|
+
'provider_id',
|
|
59
|
+
'replication_status',
|
|
60
|
+
'service_uuid',
|
|
61
|
+
'shared_targets',
|
|
46
62
|
'size',
|
|
47
63
|
'snapshot_id',
|
|
64
|
+
'source_volid',
|
|
48
65
|
'status',
|
|
49
66
|
'type',
|
|
67
|
+
'updated_at',
|
|
68
|
+
'user_id',
|
|
69
|
+
'volume_image_metadata',
|
|
70
|
+
'volume_type_id',
|
|
50
71
|
)
|
|
51
72
|
|
|
52
73
|
def setUp(self):
|
|
53
74
|
super().setUp()
|
|
54
75
|
|
|
55
|
-
self.
|
|
56
|
-
self.
|
|
57
|
-
|
|
58
|
-
self.consistencygroups_mock = self.volume_client.consistencygroups
|
|
59
|
-
self.consistencygroups_mock.reset_mock()
|
|
60
|
-
|
|
61
|
-
self.snapshots_mock = self.volume_client.volume_snapshots
|
|
62
|
-
self.snapshots_mock.reset_mock()
|
|
63
|
-
|
|
64
|
-
self.backups_mock = self.volume_client.backups
|
|
65
|
-
self.backups_mock.reset_mock()
|
|
66
|
-
|
|
67
|
-
self.new_volume = volume_fakes.create_one_volume()
|
|
68
|
-
self.volumes_mock.create.return_value = self.new_volume
|
|
76
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
77
|
+
self.volume_sdk_client.create_volume.return_value = self.volume
|
|
69
78
|
|
|
70
79
|
self.datalist = (
|
|
71
|
-
self.
|
|
72
|
-
self.
|
|
73
|
-
self.
|
|
74
|
-
self.
|
|
75
|
-
self.
|
|
76
|
-
self.
|
|
77
|
-
|
|
78
|
-
self.
|
|
79
|
-
self.
|
|
80
|
-
self.
|
|
81
|
-
self.
|
|
80
|
+
self.volume.attachments,
|
|
81
|
+
self.volume.availability_zone,
|
|
82
|
+
self.volume.backup_id,
|
|
83
|
+
self.volume.is_bootable,
|
|
84
|
+
self.volume.cluster_name,
|
|
85
|
+
self.volume.consistency_group_id,
|
|
86
|
+
self.volume.consumes_quota,
|
|
87
|
+
self.volume.created_at,
|
|
88
|
+
self.volume.description,
|
|
89
|
+
self.volume.is_encrypted,
|
|
90
|
+
self.volume.encryption_key_id,
|
|
91
|
+
self.volume.group_id,
|
|
92
|
+
self.volume.id,
|
|
93
|
+
self.volume.is_multiattach,
|
|
94
|
+
self.volume.name,
|
|
95
|
+
self.volume.host,
|
|
96
|
+
self.volume.migration_status,
|
|
97
|
+
self.volume.migration_id,
|
|
98
|
+
self.volume.project_id,
|
|
99
|
+
format_columns.DictColumn(self.volume.metadata),
|
|
100
|
+
self.volume.provider_id,
|
|
101
|
+
self.volume.replication_status,
|
|
102
|
+
self.volume.service_uuid,
|
|
103
|
+
self.volume.shared_targets,
|
|
104
|
+
self.volume.size,
|
|
105
|
+
self.volume.snapshot_id,
|
|
106
|
+
self.volume.source_volume_id,
|
|
107
|
+
self.volume.status,
|
|
108
|
+
self.volume.volume_type,
|
|
109
|
+
self.volume.updated_at,
|
|
110
|
+
self.volume.user_id,
|
|
111
|
+
self.volume.volume_image_metadata,
|
|
112
|
+
self.volume.volume_type_id,
|
|
82
113
|
)
|
|
83
114
|
|
|
84
115
|
# Get the command object to test
|
|
@@ -87,87 +118,88 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
87
118
|
def test_volume_create_min_options(self):
|
|
88
119
|
arglist = [
|
|
89
120
|
'--size',
|
|
90
|
-
str(self.
|
|
121
|
+
str(self.volume.size),
|
|
91
122
|
]
|
|
92
123
|
verifylist = [
|
|
93
|
-
('size', self.
|
|
124
|
+
('size', self.volume.size),
|
|
94
125
|
]
|
|
95
126
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
96
127
|
|
|
97
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
98
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
99
|
-
# data to be shown.
|
|
100
128
|
columns, data = self.cmd.take_action(parsed_args)
|
|
101
129
|
|
|
102
|
-
self.
|
|
103
|
-
size=self.
|
|
130
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
131
|
+
size=self.volume.size,
|
|
104
132
|
snapshot_id=None,
|
|
105
133
|
name=None,
|
|
106
134
|
description=None,
|
|
107
135
|
volume_type=None,
|
|
108
136
|
availability_zone=None,
|
|
109
137
|
metadata=None,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
138
|
+
image_id=None,
|
|
139
|
+
source_volume_id=None,
|
|
140
|
+
consistency_group_id=None,
|
|
113
141
|
scheduler_hints=None,
|
|
114
142
|
backup_id=None,
|
|
115
143
|
)
|
|
116
144
|
|
|
117
145
|
self.assertEqual(self.columns, columns)
|
|
118
|
-
self.
|
|
146
|
+
self.assertEqual(self.datalist, data)
|
|
119
147
|
|
|
120
148
|
def test_volume_create_options(self):
|
|
121
|
-
|
|
122
|
-
self.consistencygroups_mock.get.return_value = consistency_group
|
|
149
|
+
consistency_group_id = 'cg123'
|
|
123
150
|
arglist = [
|
|
124
151
|
'--size',
|
|
125
|
-
str(self.
|
|
152
|
+
str(self.volume.size),
|
|
126
153
|
'--description',
|
|
127
|
-
self.
|
|
154
|
+
self.volume.description,
|
|
128
155
|
'--type',
|
|
129
|
-
self.
|
|
156
|
+
self.volume.volume_type,
|
|
130
157
|
'--availability-zone',
|
|
131
|
-
self.
|
|
158
|
+
self.volume.availability_zone,
|
|
132
159
|
'--consistency-group',
|
|
133
|
-
|
|
160
|
+
consistency_group_id,
|
|
134
161
|
'--hint',
|
|
135
162
|
'k=v',
|
|
136
|
-
self.
|
|
163
|
+
self.volume.name,
|
|
137
164
|
]
|
|
138
165
|
verifylist = [
|
|
139
|
-
('size', self.
|
|
140
|
-
('description', self.
|
|
141
|
-
('type', self.
|
|
142
|
-
('availability_zone', self.
|
|
143
|
-
('consistency_group',
|
|
166
|
+
('size', self.volume.size),
|
|
167
|
+
('description', self.volume.description),
|
|
168
|
+
('type', self.volume.volume_type),
|
|
169
|
+
('availability_zone', self.volume.availability_zone),
|
|
170
|
+
('consistency_group', consistency_group_id),
|
|
144
171
|
('hint', {'k': 'v'}),
|
|
145
|
-
('name', self.
|
|
172
|
+
('name', self.volume.name),
|
|
146
173
|
]
|
|
147
174
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
148
175
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
176
|
+
with mock.patch.object(
|
|
177
|
+
volume_v3,
|
|
178
|
+
'find_consistency_group',
|
|
179
|
+
return_value={'id': consistency_group_id},
|
|
180
|
+
) as mock_find_cg:
|
|
181
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
153
182
|
|
|
154
|
-
self.
|
|
155
|
-
size=self.
|
|
183
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
184
|
+
size=self.volume.size,
|
|
156
185
|
snapshot_id=None,
|
|
157
|
-
name=self.
|
|
158
|
-
description=self.
|
|
159
|
-
volume_type=self.
|
|
160
|
-
availability_zone=self.
|
|
186
|
+
name=self.volume.name,
|
|
187
|
+
description=self.volume.description,
|
|
188
|
+
volume_type=self.volume.volume_type,
|
|
189
|
+
availability_zone=self.volume.availability_zone,
|
|
161
190
|
metadata=None,
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
191
|
+
image_id=None,
|
|
192
|
+
source_volume_id=None,
|
|
193
|
+
consistency_group_id=consistency_group_id,
|
|
165
194
|
scheduler_hints={'k': 'v'},
|
|
166
195
|
backup_id=None,
|
|
167
196
|
)
|
|
197
|
+
mock_find_cg.assert_called_once_with(
|
|
198
|
+
self.volume_sdk_client, consistency_group_id
|
|
199
|
+
)
|
|
168
200
|
|
|
169
201
|
self.assertEqual(self.columns, columns)
|
|
170
|
-
self.
|
|
202
|
+
self.assertEqual(self.datalist, data)
|
|
171
203
|
|
|
172
204
|
def test_volume_create_properties(self):
|
|
173
205
|
arglist = [
|
|
@@ -176,38 +208,35 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
176
208
|
'--property',
|
|
177
209
|
'Beta=b',
|
|
178
210
|
'--size',
|
|
179
|
-
str(self.
|
|
180
|
-
self.
|
|
211
|
+
str(self.volume.size),
|
|
212
|
+
self.volume.name,
|
|
181
213
|
]
|
|
182
214
|
verifylist = [
|
|
183
215
|
('properties', {'Alpha': 'a', 'Beta': 'b'}),
|
|
184
|
-
('size', self.
|
|
185
|
-
('name', self.
|
|
216
|
+
('size', self.volume.size),
|
|
217
|
+
('name', self.volume.name),
|
|
186
218
|
]
|
|
187
219
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
188
220
|
|
|
189
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
190
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
191
|
-
# data to be shown.
|
|
192
221
|
columns, data = self.cmd.take_action(parsed_args)
|
|
193
222
|
|
|
194
|
-
self.
|
|
195
|
-
size=self.
|
|
223
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
224
|
+
size=self.volume.size,
|
|
196
225
|
snapshot_id=None,
|
|
197
|
-
name=self.
|
|
226
|
+
name=self.volume.name,
|
|
198
227
|
description=None,
|
|
199
228
|
volume_type=None,
|
|
200
229
|
availability_zone=None,
|
|
201
230
|
metadata={'Alpha': 'a', 'Beta': 'b'},
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
231
|
+
image_id=None,
|
|
232
|
+
source_volume_id=None,
|
|
233
|
+
consistency_group_id=None,
|
|
205
234
|
scheduler_hints=None,
|
|
206
235
|
backup_id=None,
|
|
207
236
|
)
|
|
208
237
|
|
|
209
238
|
self.assertEqual(self.columns, columns)
|
|
210
|
-
self.
|
|
239
|
+
self.assertEqual(self.datalist, data)
|
|
211
240
|
|
|
212
241
|
def test_volume_create_image_id(self):
|
|
213
242
|
image = image_fakes.create_one_image()
|
|
@@ -217,38 +246,35 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
217
246
|
'--image',
|
|
218
247
|
image.id,
|
|
219
248
|
'--size',
|
|
220
|
-
str(self.
|
|
221
|
-
self.
|
|
249
|
+
str(self.volume.size),
|
|
250
|
+
self.volume.name,
|
|
222
251
|
]
|
|
223
252
|
verifylist = [
|
|
224
253
|
('image', image.id),
|
|
225
|
-
('size', self.
|
|
226
|
-
('name', self.
|
|
254
|
+
('size', self.volume.size),
|
|
255
|
+
('name', self.volume.name),
|
|
227
256
|
]
|
|
228
257
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
229
258
|
|
|
230
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
231
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
232
|
-
# data to be shown.
|
|
233
259
|
columns, data = self.cmd.take_action(parsed_args)
|
|
234
260
|
|
|
235
|
-
self.
|
|
236
|
-
size=self.
|
|
261
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
262
|
+
size=self.volume.size,
|
|
237
263
|
snapshot_id=None,
|
|
238
|
-
name=self.
|
|
264
|
+
name=self.volume.name,
|
|
239
265
|
description=None,
|
|
240
266
|
volume_type=None,
|
|
241
267
|
availability_zone=None,
|
|
242
268
|
metadata=None,
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
269
|
+
image_id=image.id,
|
|
270
|
+
source_volume_id=None,
|
|
271
|
+
consistency_group_id=None,
|
|
246
272
|
scheduler_hints=None,
|
|
247
273
|
backup_id=None,
|
|
248
274
|
)
|
|
249
275
|
|
|
250
276
|
self.assertEqual(self.columns, columns)
|
|
251
|
-
self.
|
|
277
|
+
self.assertEqual(self.datalist, data)
|
|
252
278
|
|
|
253
279
|
def test_volume_create_image_name(self):
|
|
254
280
|
image = image_fakes.create_one_image()
|
|
@@ -258,177 +284,173 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
258
284
|
'--image',
|
|
259
285
|
image.name,
|
|
260
286
|
'--size',
|
|
261
|
-
str(self.
|
|
262
|
-
self.
|
|
287
|
+
str(self.volume.size),
|
|
288
|
+
self.volume.name,
|
|
263
289
|
]
|
|
264
290
|
verifylist = [
|
|
265
291
|
('image', image.name),
|
|
266
|
-
('size', self.
|
|
267
|
-
('name', self.
|
|
292
|
+
('size', self.volume.size),
|
|
293
|
+
('name', self.volume.name),
|
|
268
294
|
]
|
|
269
295
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
270
296
|
|
|
271
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
272
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
273
|
-
# data to be shown.
|
|
274
297
|
columns, data = self.cmd.take_action(parsed_args)
|
|
275
298
|
|
|
276
|
-
self.
|
|
277
|
-
size=self.
|
|
299
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
300
|
+
size=self.volume.size,
|
|
278
301
|
snapshot_id=None,
|
|
279
|
-
name=self.
|
|
302
|
+
name=self.volume.name,
|
|
280
303
|
description=None,
|
|
281
304
|
volume_type=None,
|
|
282
305
|
availability_zone=None,
|
|
283
306
|
metadata=None,
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
307
|
+
image_id=image.id,
|
|
308
|
+
source_volume_id=None,
|
|
309
|
+
consistency_group_id=None,
|
|
287
310
|
scheduler_hints=None,
|
|
288
311
|
backup_id=None,
|
|
289
312
|
)
|
|
290
313
|
|
|
291
314
|
self.assertEqual(self.columns, columns)
|
|
292
|
-
self.
|
|
315
|
+
self.assertEqual(self.datalist, data)
|
|
293
316
|
|
|
294
317
|
def test_volume_create_with_snapshot(self):
|
|
295
|
-
snapshot =
|
|
296
|
-
self.
|
|
318
|
+
snapshot = sdk_fakes.generate_fake_resource(_snapshot.Snapshot)
|
|
319
|
+
self.volume_sdk_client.find_snapshot.return_value = snapshot
|
|
320
|
+
|
|
297
321
|
arglist = [
|
|
298
322
|
'--snapshot',
|
|
299
|
-
|
|
300
|
-
self.
|
|
323
|
+
snapshot.id,
|
|
324
|
+
self.volume.name,
|
|
301
325
|
]
|
|
302
326
|
verifylist = [
|
|
303
|
-
('snapshot',
|
|
304
|
-
('name', self.
|
|
327
|
+
('snapshot', snapshot.id),
|
|
328
|
+
('name', self.volume.name),
|
|
305
329
|
]
|
|
306
330
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
307
331
|
|
|
308
|
-
self.snapshots_mock.get.return_value = snapshot
|
|
309
|
-
|
|
310
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
311
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
312
|
-
# data to be shown.
|
|
313
332
|
columns, data = self.cmd.take_action(parsed_args)
|
|
314
333
|
|
|
315
|
-
self.
|
|
334
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
316
335
|
size=snapshot.size,
|
|
317
336
|
snapshot_id=snapshot.id,
|
|
318
|
-
name=self.
|
|
337
|
+
name=self.volume.name,
|
|
319
338
|
description=None,
|
|
320
339
|
volume_type=None,
|
|
321
340
|
availability_zone=None,
|
|
322
341
|
metadata=None,
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
342
|
+
image_id=None,
|
|
343
|
+
source_volume_id=None,
|
|
344
|
+
consistency_group_id=None,
|
|
326
345
|
scheduler_hints=None,
|
|
327
346
|
backup_id=None,
|
|
328
347
|
)
|
|
348
|
+
self.volume_sdk_client.find_snapshot.assert_called_once_with(
|
|
349
|
+
snapshot.id, ignore_missing=False
|
|
350
|
+
)
|
|
329
351
|
|
|
330
352
|
self.assertEqual(self.columns, columns)
|
|
331
|
-
self.
|
|
353
|
+
self.assertEqual(self.datalist, data)
|
|
332
354
|
|
|
333
355
|
def test_volume_create_with_backup(self):
|
|
334
356
|
self.set_volume_api_version('3.47')
|
|
335
357
|
|
|
336
|
-
backup =
|
|
337
|
-
self.
|
|
358
|
+
backup = sdk_fakes.generate_fake_resource(_backup.Backup)
|
|
359
|
+
self.volume_sdk_client.find_backup.return_value = backup
|
|
360
|
+
|
|
338
361
|
arglist = [
|
|
339
362
|
'--backup',
|
|
340
|
-
|
|
341
|
-
self.
|
|
363
|
+
backup.id,
|
|
364
|
+
self.volume.name,
|
|
342
365
|
]
|
|
343
366
|
verifylist = [
|
|
344
|
-
('backup',
|
|
345
|
-
('name', self.
|
|
367
|
+
('backup', backup.id),
|
|
368
|
+
('name', self.volume.name),
|
|
346
369
|
]
|
|
347
370
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
348
371
|
|
|
349
|
-
self.backups_mock.get.return_value = backup
|
|
350
|
-
|
|
351
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
352
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
353
|
-
# data to be shown.
|
|
354
372
|
columns, data = self.cmd.take_action(parsed_args)
|
|
355
373
|
|
|
356
|
-
self.
|
|
374
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
357
375
|
size=backup.size,
|
|
358
376
|
snapshot_id=None,
|
|
359
|
-
name=self.
|
|
377
|
+
name=self.volume.name,
|
|
360
378
|
description=None,
|
|
361
379
|
volume_type=None,
|
|
362
380
|
availability_zone=None,
|
|
363
381
|
metadata=None,
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
382
|
+
image_id=None,
|
|
383
|
+
source_volume_id=None,
|
|
384
|
+
consistency_group_id=None,
|
|
367
385
|
scheduler_hints=None,
|
|
368
386
|
backup_id=backup.id,
|
|
369
387
|
)
|
|
388
|
+
self.volume_sdk_client.find_backup.assert_called_once_with(
|
|
389
|
+
backup.id, ignore_missing=False
|
|
390
|
+
)
|
|
370
391
|
|
|
371
392
|
self.assertEqual(self.columns, columns)
|
|
372
|
-
self.
|
|
393
|
+
self.assertEqual(self.datalist, data)
|
|
373
394
|
|
|
374
395
|
def test_volume_create_with_backup_pre_v347(self):
|
|
375
|
-
backup =
|
|
376
|
-
self.
|
|
396
|
+
backup = sdk_fakes.generate_fake_resource(_backup.Backup)
|
|
397
|
+
self.volume_sdk_client.find_backup.return_value = backup
|
|
398
|
+
|
|
377
399
|
arglist = [
|
|
378
400
|
'--backup',
|
|
379
|
-
|
|
380
|
-
self.
|
|
401
|
+
backup.id,
|
|
402
|
+
self.volume.name,
|
|
381
403
|
]
|
|
382
404
|
verifylist = [
|
|
383
|
-
('backup',
|
|
384
|
-
('name', self.
|
|
405
|
+
('backup', backup.id),
|
|
406
|
+
('name', self.volume.name),
|
|
385
407
|
]
|
|
386
408
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
387
409
|
|
|
388
|
-
self.backups_mock.get.return_value = backup
|
|
389
|
-
|
|
390
410
|
exc = self.assertRaises(
|
|
391
411
|
exceptions.CommandError, self.cmd.take_action, parsed_args
|
|
392
412
|
)
|
|
393
413
|
self.assertIn("--os-volume-api-version 3.47 or greater", str(exc))
|
|
394
414
|
|
|
415
|
+
self.volume_sdk_client.create_volume.assert_not_called()
|
|
416
|
+
|
|
395
417
|
def test_volume_create_with_source_volume(self):
|
|
396
|
-
|
|
418
|
+
source_volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
419
|
+
self.volume_sdk_client.find_volume.return_value = source_volume
|
|
420
|
+
|
|
397
421
|
arglist = [
|
|
398
422
|
'--source',
|
|
399
|
-
|
|
400
|
-
|
|
423
|
+
source_volume.id,
|
|
424
|
+
self.volume.name,
|
|
401
425
|
]
|
|
402
426
|
verifylist = [
|
|
403
|
-
('source',
|
|
404
|
-
('name',
|
|
427
|
+
('source', source_volume.id),
|
|
428
|
+
('name', self.volume.name),
|
|
405
429
|
]
|
|
406
430
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
407
431
|
|
|
408
|
-
self.volumes_mock.get.return_value = self.new_volume
|
|
409
|
-
|
|
410
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
411
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
412
|
-
# data to be shown.
|
|
413
432
|
columns, data = self.cmd.take_action(parsed_args)
|
|
414
433
|
|
|
415
|
-
self.
|
|
416
|
-
size=
|
|
434
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
435
|
+
size=source_volume.size,
|
|
417
436
|
snapshot_id=None,
|
|
418
|
-
name=
|
|
437
|
+
name=self.volume.name,
|
|
419
438
|
description=None,
|
|
420
439
|
volume_type=None,
|
|
421
440
|
availability_zone=None,
|
|
422
441
|
metadata=None,
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
442
|
+
image_id=None,
|
|
443
|
+
source_volume_id=source_volume.id,
|
|
444
|
+
consistency_group_id=None,
|
|
426
445
|
scheduler_hints=None,
|
|
427
446
|
backup_id=None,
|
|
428
447
|
)
|
|
448
|
+
self.volume_sdk_client.find_volume.assert_called_once_with(
|
|
449
|
+
source_volume.id, ignore_missing=False
|
|
450
|
+
)
|
|
429
451
|
|
|
430
452
|
self.assertEqual(self.columns, columns)
|
|
431
|
-
self.
|
|
453
|
+
self.assertEqual(self.datalist, data)
|
|
432
454
|
|
|
433
455
|
@mock.patch.object(utils, 'wait_for_status', return_value=True)
|
|
434
456
|
def test_volume_create_with_bootable_and_readonly(self, mock_wait):
|
|
@@ -436,192 +458,191 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
436
458
|
'--bootable',
|
|
437
459
|
'--read-only',
|
|
438
460
|
'--size',
|
|
439
|
-
str(self.
|
|
440
|
-
self.
|
|
461
|
+
str(self.volume.size),
|
|
462
|
+
self.volume.name,
|
|
441
463
|
]
|
|
442
464
|
verifylist = [
|
|
443
465
|
('bootable', True),
|
|
444
466
|
('read_only', True),
|
|
445
|
-
('size', self.
|
|
446
|
-
('name', self.
|
|
467
|
+
('size', self.volume.size),
|
|
468
|
+
('name', self.volume.name),
|
|
447
469
|
]
|
|
448
470
|
|
|
449
471
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
450
472
|
|
|
451
473
|
columns, data = self.cmd.take_action(parsed_args)
|
|
452
474
|
|
|
453
|
-
self.
|
|
454
|
-
size=self.
|
|
475
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
476
|
+
size=self.volume.size,
|
|
455
477
|
snapshot_id=None,
|
|
456
|
-
name=self.
|
|
478
|
+
name=self.volume.name,
|
|
457
479
|
description=None,
|
|
458
480
|
volume_type=None,
|
|
459
481
|
availability_zone=None,
|
|
460
482
|
metadata=None,
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
483
|
+
image_id=None,
|
|
484
|
+
source_volume_id=None,
|
|
485
|
+
consistency_group_id=None,
|
|
464
486
|
scheduler_hints=None,
|
|
465
487
|
backup_id=None,
|
|
466
488
|
)
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
self.assertCountEqual(self.datalist, data)
|
|
470
|
-
self.volumes_mock.set_bootable.assert_called_with(
|
|
471
|
-
self.new_volume.id, True
|
|
489
|
+
self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
|
|
490
|
+
self.volume, True
|
|
472
491
|
)
|
|
473
|
-
self.
|
|
474
|
-
self.
|
|
492
|
+
self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
|
|
493
|
+
self.volume, True
|
|
475
494
|
)
|
|
476
495
|
|
|
496
|
+
self.assertEqual(self.columns, columns)
|
|
497
|
+
self.assertEqual(self.datalist, data)
|
|
498
|
+
|
|
477
499
|
@mock.patch.object(utils, 'wait_for_status', return_value=True)
|
|
478
500
|
def test_volume_create_with_nonbootable_and_readwrite(self, mock_wait):
|
|
479
501
|
arglist = [
|
|
480
502
|
'--non-bootable',
|
|
481
503
|
'--read-write',
|
|
482
504
|
'--size',
|
|
483
|
-
str(self.
|
|
484
|
-
self.
|
|
505
|
+
str(self.volume.size),
|
|
506
|
+
self.volume.name,
|
|
485
507
|
]
|
|
486
508
|
verifylist = [
|
|
487
509
|
('bootable', False),
|
|
488
510
|
('read_only', False),
|
|
489
|
-
('size', self.
|
|
490
|
-
('name', self.
|
|
511
|
+
('size', self.volume.size),
|
|
512
|
+
('name', self.volume.name),
|
|
491
513
|
]
|
|
492
514
|
|
|
493
515
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
494
516
|
|
|
495
517
|
columns, data = self.cmd.take_action(parsed_args)
|
|
496
518
|
|
|
497
|
-
self.
|
|
498
|
-
size=self.
|
|
519
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
520
|
+
size=self.volume.size,
|
|
499
521
|
snapshot_id=None,
|
|
500
|
-
name=self.
|
|
522
|
+
name=self.volume.name,
|
|
501
523
|
description=None,
|
|
502
524
|
volume_type=None,
|
|
503
525
|
availability_zone=None,
|
|
504
526
|
metadata=None,
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
527
|
+
image_id=None,
|
|
528
|
+
source_volume_id=None,
|
|
529
|
+
consistency_group_id=None,
|
|
508
530
|
scheduler_hints=None,
|
|
509
531
|
backup_id=None,
|
|
510
532
|
)
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
self.assertCountEqual(self.datalist, data)
|
|
514
|
-
self.volumes_mock.set_bootable.assert_called_with(
|
|
515
|
-
self.new_volume.id, False
|
|
533
|
+
self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
|
|
534
|
+
self.volume, False
|
|
516
535
|
)
|
|
517
|
-
self.
|
|
518
|
-
self.
|
|
536
|
+
self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
|
|
537
|
+
self.volume, False
|
|
519
538
|
)
|
|
520
539
|
|
|
540
|
+
self.assertEqual(self.columns, columns)
|
|
541
|
+
self.assertEqual(self.datalist, data)
|
|
542
|
+
|
|
521
543
|
@mock.patch.object(volume.LOG, 'error')
|
|
522
544
|
@mock.patch.object(utils, 'wait_for_status', return_value=True)
|
|
523
545
|
def test_volume_create_with_bootable_and_readonly_fail(
|
|
524
546
|
self, mock_wait, mock_error
|
|
525
547
|
):
|
|
526
|
-
self.
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
548
|
+
self.volume_sdk_client.set_volume_bootable_status.side_effect = (
|
|
549
|
+
sdk_exceptions.NotFoundException('foo')
|
|
550
|
+
)
|
|
551
|
+
self.volume_sdk_client.set_volume_readonly.side_effect = (
|
|
552
|
+
sdk_exceptions.NotFoundException('foo')
|
|
530
553
|
)
|
|
531
554
|
|
|
532
555
|
arglist = [
|
|
533
556
|
'--bootable',
|
|
534
557
|
'--read-only',
|
|
535
558
|
'--size',
|
|
536
|
-
str(self.
|
|
537
|
-
self.
|
|
559
|
+
str(self.volume.size),
|
|
560
|
+
self.volume.name,
|
|
538
561
|
]
|
|
539
562
|
verifylist = [
|
|
540
563
|
('bootable', True),
|
|
541
564
|
('read_only', True),
|
|
542
|
-
('size', self.
|
|
543
|
-
('name', self.
|
|
565
|
+
('size', self.volume.size),
|
|
566
|
+
('name', self.volume.name),
|
|
544
567
|
]
|
|
545
568
|
|
|
546
569
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
547
570
|
|
|
548
571
|
columns, data = self.cmd.take_action(parsed_args)
|
|
549
572
|
|
|
550
|
-
self.
|
|
551
|
-
size=self.
|
|
573
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
574
|
+
size=self.volume.size,
|
|
552
575
|
snapshot_id=None,
|
|
553
|
-
name=self.
|
|
576
|
+
name=self.volume.name,
|
|
554
577
|
description=None,
|
|
555
578
|
volume_type=None,
|
|
556
579
|
availability_zone=None,
|
|
557
580
|
metadata=None,
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
581
|
+
image_id=None,
|
|
582
|
+
source_volume_id=None,
|
|
583
|
+
consistency_group_id=None,
|
|
561
584
|
scheduler_hints=None,
|
|
562
585
|
backup_id=None,
|
|
563
586
|
)
|
|
587
|
+
self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
|
|
588
|
+
self.volume, True
|
|
589
|
+
)
|
|
590
|
+
self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
|
|
591
|
+
self.volume, True
|
|
592
|
+
)
|
|
564
593
|
|
|
565
594
|
self.assertEqual(2, mock_error.call_count)
|
|
566
595
|
self.assertEqual(self.columns, columns)
|
|
567
|
-
self.
|
|
568
|
-
self.volumes_mock.set_bootable.assert_called_with(
|
|
569
|
-
self.new_volume.id, True
|
|
570
|
-
)
|
|
571
|
-
self.volumes_mock.update_readonly_flag.assert_called_with(
|
|
572
|
-
self.new_volume.id, True
|
|
573
|
-
)
|
|
596
|
+
self.assertEqual(self.datalist, data)
|
|
574
597
|
|
|
575
598
|
@mock.patch.object(volume.LOG, 'error')
|
|
576
599
|
@mock.patch.object(utils, 'wait_for_status', return_value=False)
|
|
577
600
|
def test_volume_create_non_available_with_readonly(
|
|
578
|
-
self,
|
|
579
|
-
mock_wait,
|
|
580
|
-
mock_error,
|
|
601
|
+
self, mock_wait, mock_error
|
|
581
602
|
):
|
|
582
603
|
arglist = [
|
|
583
604
|
'--non-bootable',
|
|
584
605
|
'--read-only',
|
|
585
606
|
'--size',
|
|
586
|
-
str(self.
|
|
587
|
-
self.
|
|
607
|
+
str(self.volume.size),
|
|
608
|
+
self.volume.name,
|
|
588
609
|
]
|
|
589
610
|
verifylist = [
|
|
590
611
|
('bootable', False),
|
|
591
612
|
('read_only', True),
|
|
592
|
-
('size', self.
|
|
593
|
-
('name', self.
|
|
613
|
+
('size', self.volume.size),
|
|
614
|
+
('name', self.volume.name),
|
|
594
615
|
]
|
|
595
616
|
|
|
596
617
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
597
618
|
|
|
598
619
|
columns, data = self.cmd.take_action(parsed_args)
|
|
599
620
|
|
|
600
|
-
self.
|
|
601
|
-
size=self.
|
|
621
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
622
|
+
size=self.volume.size,
|
|
602
623
|
snapshot_id=None,
|
|
603
|
-
name=self.
|
|
624
|
+
name=self.volume.name,
|
|
604
625
|
description=None,
|
|
605
626
|
volume_type=None,
|
|
606
627
|
availability_zone=None,
|
|
607
628
|
metadata=None,
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
629
|
+
image_id=None,
|
|
630
|
+
source_volume_id=None,
|
|
631
|
+
consistency_group_id=None,
|
|
611
632
|
scheduler_hints=None,
|
|
612
633
|
backup_id=None,
|
|
613
634
|
)
|
|
614
635
|
|
|
615
636
|
self.assertEqual(2, mock_error.call_count)
|
|
616
637
|
self.assertEqual(self.columns, columns)
|
|
617
|
-
self.
|
|
638
|
+
self.assertEqual(self.datalist, data)
|
|
618
639
|
|
|
619
640
|
def test_volume_create_without_size(self):
|
|
620
641
|
arglist = [
|
|
621
|
-
self.
|
|
642
|
+
self.volume.name,
|
|
622
643
|
]
|
|
623
644
|
verifylist = [
|
|
624
|
-
('name', self.
|
|
645
|
+
('name', self.volume.name),
|
|
625
646
|
]
|
|
626
647
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
627
648
|
|
|
@@ -638,15 +659,15 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
638
659
|
'--snapshot',
|
|
639
660
|
'source_snapshot',
|
|
640
661
|
'--size',
|
|
641
|
-
str(self.
|
|
642
|
-
self.
|
|
662
|
+
str(self.volume.size),
|
|
663
|
+
self.volume.name,
|
|
643
664
|
]
|
|
644
665
|
verifylist = [
|
|
645
666
|
('image', 'source_image'),
|
|
646
667
|
('source', 'source_volume'),
|
|
647
668
|
('snapshot', 'source_snapshot'),
|
|
648
|
-
('size', self.
|
|
649
|
-
('name', self.
|
|
669
|
+
('size', self.volume.size),
|
|
670
|
+
('name', self.volume.name),
|
|
650
671
|
]
|
|
651
672
|
|
|
652
673
|
self.assertRaises(
|
|
@@ -665,7 +686,7 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
665
686
|
"""
|
|
666
687
|
arglist = [
|
|
667
688
|
'--size',
|
|
668
|
-
str(self.
|
|
689
|
+
str(self.volume.size),
|
|
669
690
|
'--hint',
|
|
670
691
|
'k=v',
|
|
671
692
|
'--hint',
|
|
@@ -680,10 +701,10 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
680
701
|
'local_to_instance=v6',
|
|
681
702
|
'--hint',
|
|
682
703
|
'different_host=v7',
|
|
683
|
-
self.
|
|
704
|
+
self.volume.name,
|
|
684
705
|
]
|
|
685
706
|
verifylist = [
|
|
686
|
-
('size', self.
|
|
707
|
+
('size', self.volume.size),
|
|
687
708
|
(
|
|
688
709
|
'hint',
|
|
689
710
|
{
|
|
@@ -693,26 +714,23 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
693
714
|
'different_host': ['v5', 'v7'],
|
|
694
715
|
},
|
|
695
716
|
),
|
|
696
|
-
('name', self.
|
|
717
|
+
('name', self.volume.name),
|
|
697
718
|
]
|
|
698
719
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
699
720
|
|
|
700
|
-
# In base command class ShowOne in cliff, abstract method take_action()
|
|
701
|
-
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
702
|
-
# data to be shown.
|
|
703
721
|
columns, data = self.cmd.take_action(parsed_args)
|
|
704
722
|
|
|
705
|
-
self.
|
|
706
|
-
size=self.
|
|
723
|
+
self.volume_sdk_client.create_volume.assert_called_with(
|
|
724
|
+
size=self.volume.size,
|
|
707
725
|
snapshot_id=None,
|
|
708
|
-
name=self.
|
|
726
|
+
name=self.volume.name,
|
|
709
727
|
description=None,
|
|
710
728
|
volume_type=None,
|
|
711
729
|
availability_zone=None,
|
|
712
730
|
metadata=None,
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
731
|
+
image_id=None,
|
|
732
|
+
source_volume_id=None,
|
|
733
|
+
consistency_group_id=None,
|
|
716
734
|
scheduler_hints={
|
|
717
735
|
'k': 'v2',
|
|
718
736
|
'same_host': ['v3', 'v4'],
|
|
@@ -723,102 +741,22 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
|
|
|
723
741
|
)
|
|
724
742
|
|
|
725
743
|
self.assertEqual(self.columns, columns)
|
|
726
|
-
self.
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
class TestVolumeCreate(volume_fakes.TestVolume):
|
|
730
|
-
columns = (
|
|
731
|
-
'attachments',
|
|
732
|
-
'availability_zone',
|
|
733
|
-
'consistency_group_id',
|
|
734
|
-
'created_at',
|
|
735
|
-
'description',
|
|
736
|
-
'extended_replication_status',
|
|
737
|
-
'group_id',
|
|
738
|
-
'host',
|
|
739
|
-
'id',
|
|
740
|
-
'image_id',
|
|
741
|
-
'is_bootable',
|
|
742
|
-
'is_encrypted',
|
|
743
|
-
'is_multiattach',
|
|
744
|
-
'location',
|
|
745
|
-
'metadata',
|
|
746
|
-
'migration_id',
|
|
747
|
-
'migration_status',
|
|
748
|
-
'name',
|
|
749
|
-
'project_id',
|
|
750
|
-
'provider_id',
|
|
751
|
-
'replication_driver_data',
|
|
752
|
-
'replication_status',
|
|
753
|
-
'scheduler_hints',
|
|
754
|
-
'size',
|
|
755
|
-
'snapshot_id',
|
|
756
|
-
'source_volume_id',
|
|
757
|
-
'status',
|
|
758
|
-
'updated_at',
|
|
759
|
-
'user_id',
|
|
760
|
-
'volume_image_metadata',
|
|
761
|
-
'volume_type',
|
|
762
|
-
)
|
|
763
|
-
|
|
764
|
-
def setUp(self):
|
|
765
|
-
super().setUp()
|
|
766
|
-
|
|
767
|
-
self.new_volume = sdk_fakes.generate_fake_resource(
|
|
768
|
-
_volume.Volume, **{'size': 1}
|
|
769
|
-
)
|
|
770
|
-
|
|
771
|
-
self.datalist = (
|
|
772
|
-
self.new_volume.attachments,
|
|
773
|
-
self.new_volume.availability_zone,
|
|
774
|
-
self.new_volume.consistency_group_id,
|
|
775
|
-
self.new_volume.created_at,
|
|
776
|
-
self.new_volume.description,
|
|
777
|
-
self.new_volume.extended_replication_status,
|
|
778
|
-
self.new_volume.group_id,
|
|
779
|
-
self.new_volume.host,
|
|
780
|
-
self.new_volume.id,
|
|
781
|
-
self.new_volume.image_id,
|
|
782
|
-
self.new_volume.is_bootable,
|
|
783
|
-
self.new_volume.is_encrypted,
|
|
784
|
-
self.new_volume.is_multiattach,
|
|
785
|
-
self.new_volume.location,
|
|
786
|
-
self.new_volume.metadata,
|
|
787
|
-
self.new_volume.migration_id,
|
|
788
|
-
self.new_volume.migration_status,
|
|
789
|
-
self.new_volume.name,
|
|
790
|
-
self.new_volume.project_id,
|
|
791
|
-
self.new_volume.provider_id,
|
|
792
|
-
self.new_volume.replication_driver_data,
|
|
793
|
-
self.new_volume.replication_status,
|
|
794
|
-
self.new_volume.scheduler_hints,
|
|
795
|
-
self.new_volume.size,
|
|
796
|
-
self.new_volume.snapshot_id,
|
|
797
|
-
self.new_volume.source_volume_id,
|
|
798
|
-
self.new_volume.status,
|
|
799
|
-
self.new_volume.updated_at,
|
|
800
|
-
self.new_volume.user_id,
|
|
801
|
-
self.new_volume.volume_image_metadata,
|
|
802
|
-
self.new_volume.volume_type,
|
|
803
|
-
)
|
|
804
|
-
|
|
805
|
-
# Get the command object to test
|
|
806
|
-
self.cmd = volume.CreateVolume(self.app, None)
|
|
744
|
+
self.assertEqual(self.datalist, data)
|
|
807
745
|
|
|
808
746
|
def test_volume_create_remote_source(self):
|
|
809
|
-
self.volume_sdk_client.manage_volume.return_value = self.
|
|
747
|
+
self.volume_sdk_client.manage_volume.return_value = self.volume
|
|
810
748
|
|
|
811
749
|
arglist = [
|
|
812
750
|
'--remote-source',
|
|
813
751
|
'key=val',
|
|
814
752
|
'--host',
|
|
815
753
|
'fake_host',
|
|
816
|
-
self.
|
|
754
|
+
self.volume.name,
|
|
817
755
|
]
|
|
818
756
|
verifylist = [
|
|
819
757
|
('remote_source', {'key': 'val'}),
|
|
820
758
|
('host', 'fake_host'),
|
|
821
|
-
('name', self.
|
|
759
|
+
('name', self.volume.name),
|
|
822
760
|
]
|
|
823
761
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
824
762
|
|
|
@@ -837,7 +775,7 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
837
775
|
)
|
|
838
776
|
|
|
839
777
|
self.assertEqual(self.columns, columns)
|
|
840
|
-
self.
|
|
778
|
+
self.assertEqual(self.datalist, data)
|
|
841
779
|
|
|
842
780
|
def test_volume_create_remote_source_pre_v316(self):
|
|
843
781
|
self.set_volume_api_version('3.15')
|
|
@@ -846,12 +784,12 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
846
784
|
'key=val',
|
|
847
785
|
'--cluster',
|
|
848
786
|
'fake_cluster',
|
|
849
|
-
self.
|
|
787
|
+
self.volume.name,
|
|
850
788
|
]
|
|
851
789
|
verifylist = [
|
|
852
790
|
('remote_source', {'key': 'val'}),
|
|
853
791
|
('cluster', 'fake_cluster'),
|
|
854
|
-
('name', self.
|
|
792
|
+
('name', self.volume.name),
|
|
855
793
|
]
|
|
856
794
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
857
795
|
|
|
@@ -871,13 +809,13 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
871
809
|
'fake_host',
|
|
872
810
|
'--cluster',
|
|
873
811
|
'fake_cluster',
|
|
874
|
-
self.
|
|
812
|
+
self.volume.name,
|
|
875
813
|
]
|
|
876
814
|
verifylist = [
|
|
877
815
|
('remote_source', {'key': 'val'}),
|
|
878
816
|
('host', 'fake_host'),
|
|
879
817
|
('cluster', 'fake_cluster'),
|
|
880
|
-
('name', self.
|
|
818
|
+
('name', self.volume.name),
|
|
881
819
|
]
|
|
882
820
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
883
821
|
|
|
@@ -892,11 +830,11 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
892
830
|
arglist = [
|
|
893
831
|
'--remote-source',
|
|
894
832
|
'key=val',
|
|
895
|
-
self.
|
|
833
|
+
self.volume.name,
|
|
896
834
|
]
|
|
897
835
|
verifylist = [
|
|
898
836
|
('remote_source', {'key': 'val'}),
|
|
899
|
-
('name', self.
|
|
837
|
+
('name', self.volume.name),
|
|
900
838
|
]
|
|
901
839
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
902
840
|
|
|
@@ -910,15 +848,15 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
910
848
|
def test_volume_create_remote_source_size(self):
|
|
911
849
|
arglist = [
|
|
912
850
|
'--size',
|
|
913
|
-
str(self.
|
|
851
|
+
str(self.volume.size),
|
|
914
852
|
'--remote-source',
|
|
915
853
|
'key=val',
|
|
916
|
-
self.
|
|
854
|
+
self.volume.name,
|
|
917
855
|
]
|
|
918
856
|
verifylist = [
|
|
919
|
-
('size', self.
|
|
857
|
+
('size', self.volume.size),
|
|
920
858
|
('remote_source', {'key': 'val'}),
|
|
921
|
-
('name', self.
|
|
859
|
+
('name', self.volume.name),
|
|
922
860
|
]
|
|
923
861
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
924
862
|
|
|
@@ -934,15 +872,15 @@ class TestVolumeCreate(volume_fakes.TestVolume):
|
|
|
934
872
|
def test_volume_create_host_no_remote_source(self):
|
|
935
873
|
arglist = [
|
|
936
874
|
'--size',
|
|
937
|
-
str(self.
|
|
875
|
+
str(self.volume.size),
|
|
938
876
|
'--host',
|
|
939
877
|
'fake_host',
|
|
940
|
-
self.
|
|
878
|
+
self.volume.name,
|
|
941
879
|
]
|
|
942
880
|
verifylist = [
|
|
943
|
-
('size', self.
|
|
881
|
+
('size', self.volume.size),
|
|
944
882
|
('host', 'fake_host'),
|
|
945
|
-
('name', self.
|
|
883
|
+
('name', self.volume.name),
|
|
946
884
|
]
|
|
947
885
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
948
886
|
|
|
@@ -1239,6 +1177,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1239
1177
|
'user_id': None,
|
|
1240
1178
|
'name': None,
|
|
1241
1179
|
'status': None,
|
|
1180
|
+
'metadata': None,
|
|
1242
1181
|
}
|
|
1243
1182
|
self.volumes_mock.list.assert_called_once_with(
|
|
1244
1183
|
search_opts=search_opts,
|
|
@@ -1282,6 +1221,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1282
1221
|
'user_id': None,
|
|
1283
1222
|
'name': None,
|
|
1284
1223
|
'status': None,
|
|
1224
|
+
'metadata': None,
|
|
1285
1225
|
}
|
|
1286
1226
|
self.volumes_mock.list.assert_called_once_with(
|
|
1287
1227
|
search_opts=search_opts,
|
|
@@ -1328,6 +1268,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1328
1268
|
'user_id': None,
|
|
1329
1269
|
'name': None,
|
|
1330
1270
|
'status': None,
|
|
1271
|
+
'metadata': None,
|
|
1331
1272
|
}
|
|
1332
1273
|
self.volumes_mock.list.assert_called_once_with(
|
|
1333
1274
|
search_opts=search_opts,
|
|
@@ -1371,6 +1312,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1371
1312
|
'user_id': self.user.id,
|
|
1372
1313
|
'name': None,
|
|
1373
1314
|
'status': None,
|
|
1315
|
+
'metadata': None,
|
|
1374
1316
|
}
|
|
1375
1317
|
self.volumes_mock.list.assert_called_once_with(
|
|
1376
1318
|
search_opts=search_opts,
|
|
@@ -1416,6 +1358,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1416
1358
|
'user_id': self.user.id,
|
|
1417
1359
|
'name': None,
|
|
1418
1360
|
'status': None,
|
|
1361
|
+
'metadata': None,
|
|
1419
1362
|
}
|
|
1420
1363
|
self.volumes_mock.list.assert_called_once_with(
|
|
1421
1364
|
search_opts=search_opts,
|
|
@@ -1459,6 +1402,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1459
1402
|
'user_id': None,
|
|
1460
1403
|
'name': self.mock_volume.name,
|
|
1461
1404
|
'status': None,
|
|
1405
|
+
'metadata': None,
|
|
1462
1406
|
}
|
|
1463
1407
|
self.volumes_mock.list.assert_called_once_with(
|
|
1464
1408
|
search_opts=search_opts,
|
|
@@ -1502,6 +1446,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1502
1446
|
'user_id': None,
|
|
1503
1447
|
'name': None,
|
|
1504
1448
|
'status': self.mock_volume.status,
|
|
1449
|
+
'metadata': None,
|
|
1505
1450
|
}
|
|
1506
1451
|
self.volumes_mock.list.assert_called_once_with(
|
|
1507
1452
|
search_opts=search_opts,
|
|
@@ -1544,6 +1489,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1544
1489
|
'user_id': None,
|
|
1545
1490
|
'name': None,
|
|
1546
1491
|
'status': None,
|
|
1492
|
+
'metadata': None,
|
|
1547
1493
|
}
|
|
1548
1494
|
self.volumes_mock.list.assert_called_once_with(
|
|
1549
1495
|
search_opts=search_opts,
|
|
@@ -1587,6 +1533,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1587
1533
|
'user_id': None,
|
|
1588
1534
|
'name': None,
|
|
1589
1535
|
'status': None,
|
|
1536
|
+
'metadata': None,
|
|
1590
1537
|
}
|
|
1591
1538
|
self.volumes_mock.list.assert_called_once_with(
|
|
1592
1539
|
search_opts=search_opts,
|
|
@@ -1660,6 +1607,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1660
1607
|
'user_id': None,
|
|
1661
1608
|
'name': None,
|
|
1662
1609
|
'all_tenants': False,
|
|
1610
|
+
'metadata': None,
|
|
1663
1611
|
},
|
|
1664
1612
|
)
|
|
1665
1613
|
self.assertCountEqual(datalist, tuple(data))
|
|
@@ -1704,6 +1652,7 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1704
1652
|
'user_id': None,
|
|
1705
1653
|
'name': None,
|
|
1706
1654
|
'status': None,
|
|
1655
|
+
'metadata': None,
|
|
1707
1656
|
}
|
|
1708
1657
|
self.volumes_mock.list.assert_called_once_with(
|
|
1709
1658
|
search_opts=search_opts,
|
|
@@ -1719,71 +1668,79 @@ class TestVolumeList(volume_fakes.TestVolume):
|
|
|
1719
1668
|
|
|
1720
1669
|
|
|
1721
1670
|
class TestVolumeMigrate(volume_fakes.TestVolume):
|
|
1722
|
-
_volume = volume_fakes.create_one_volume()
|
|
1723
|
-
|
|
1724
1671
|
def setUp(self):
|
|
1725
1672
|
super().setUp()
|
|
1726
1673
|
|
|
1727
|
-
self.
|
|
1728
|
-
self.
|
|
1674
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
1675
|
+
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
1676
|
+
self.volume_sdk_client.migrate_volume.return_value = None
|
|
1729
1677
|
|
|
1730
|
-
self.volumes_mock.get.return_value = self._volume
|
|
1731
|
-
self.volumes_mock.migrate_volume.return_value = None
|
|
1732
|
-
# Get the command object to test
|
|
1733
1678
|
self.cmd = volume.MigrateVolume(self.app, None)
|
|
1734
1679
|
|
|
1735
1680
|
def test_volume_migrate(self):
|
|
1736
1681
|
arglist = [
|
|
1737
1682
|
"--host",
|
|
1738
1683
|
"host@backend-name#pool",
|
|
1739
|
-
self.
|
|
1684
|
+
self.volume.id,
|
|
1740
1685
|
]
|
|
1741
1686
|
verifylist = [
|
|
1742
1687
|
("force_host_copy", False),
|
|
1743
1688
|
("lock_volume", False),
|
|
1744
1689
|
("host", "host@backend-name#pool"),
|
|
1745
|
-
("volume", self.
|
|
1690
|
+
("volume", self.volume.id),
|
|
1746
1691
|
]
|
|
1747
1692
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1748
1693
|
|
|
1749
1694
|
result = self.cmd.take_action(parsed_args)
|
|
1750
|
-
self.volumes_mock.get.assert_called_once_with(self._volume.id)
|
|
1751
|
-
self.volumes_mock.migrate_volume.assert_called_once_with(
|
|
1752
|
-
self._volume.id, "host@backend-name#pool", False, False
|
|
1753
|
-
)
|
|
1754
1695
|
self.assertIsNone(result)
|
|
1755
1696
|
|
|
1697
|
+
self.volume_sdk_client.find_volume.assert_called_with(
|
|
1698
|
+
self.volume.id, ignore_missing=False
|
|
1699
|
+
)
|
|
1700
|
+
self.volume_sdk_client.migrate_volume.assert_called_once_with(
|
|
1701
|
+
self.volume.id,
|
|
1702
|
+
host="host@backend-name#pool",
|
|
1703
|
+
force_host_copy=False,
|
|
1704
|
+
lock_volume=False,
|
|
1705
|
+
)
|
|
1706
|
+
|
|
1756
1707
|
def test_volume_migrate_with_option(self):
|
|
1757
1708
|
arglist = [
|
|
1758
1709
|
"--force-host-copy",
|
|
1759
1710
|
"--lock-volume",
|
|
1760
1711
|
"--host",
|
|
1761
1712
|
"host@backend-name#pool",
|
|
1762
|
-
self.
|
|
1713
|
+
self.volume.id,
|
|
1763
1714
|
]
|
|
1764
1715
|
verifylist = [
|
|
1765
1716
|
("force_host_copy", True),
|
|
1766
1717
|
("lock_volume", True),
|
|
1767
1718
|
("host", "host@backend-name#pool"),
|
|
1768
|
-
("volume", self.
|
|
1719
|
+
("volume", self.volume.id),
|
|
1769
1720
|
]
|
|
1770
1721
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1771
1722
|
|
|
1772
1723
|
result = self.cmd.take_action(parsed_args)
|
|
1773
|
-
self.volumes_mock.get.assert_called_once_with(self._volume.id)
|
|
1774
|
-
self.volumes_mock.migrate_volume.assert_called_once_with(
|
|
1775
|
-
self._volume.id, "host@backend-name#pool", True, True
|
|
1776
|
-
)
|
|
1777
1724
|
self.assertIsNone(result)
|
|
1778
1725
|
|
|
1726
|
+
self.volume_sdk_client.find_volume.assert_called_with(
|
|
1727
|
+
self.volume.id, ignore_missing=False
|
|
1728
|
+
)
|
|
1729
|
+
self.volume_sdk_client.migrate_volume.assert_called_once_with(
|
|
1730
|
+
self.volume.id,
|
|
1731
|
+
host="host@backend-name#pool",
|
|
1732
|
+
force_host_copy=True,
|
|
1733
|
+
lock_volume=True,
|
|
1734
|
+
)
|
|
1735
|
+
|
|
1779
1736
|
def test_volume_migrate_without_host(self):
|
|
1780
1737
|
arglist = [
|
|
1781
|
-
self.
|
|
1738
|
+
self.volume.id,
|
|
1782
1739
|
]
|
|
1783
1740
|
verifylist = [
|
|
1784
1741
|
("force_host_copy", False),
|
|
1785
1742
|
("lock_volume", False),
|
|
1786
|
-
("volume", self.
|
|
1743
|
+
("volume", self.volume.id),
|
|
1787
1744
|
]
|
|
1788
1745
|
|
|
1789
1746
|
self.assertRaises(
|
|
@@ -1794,6 +1751,9 @@ class TestVolumeMigrate(volume_fakes.TestVolume):
|
|
|
1794
1751
|
verifylist,
|
|
1795
1752
|
)
|
|
1796
1753
|
|
|
1754
|
+
self.volume_sdk_client.find_volume.assert_not_called()
|
|
1755
|
+
self.volume_sdk_client.migrate_volume.assert_not_called()
|
|
1756
|
+
|
|
1797
1757
|
|
|
1798
1758
|
class TestVolumeSet(volume_fakes.TestVolume):
|
|
1799
1759
|
volume_type = volume_fakes.create_one_volume_type()
|
|
@@ -2047,41 +2007,93 @@ class TestVolumeShow(volume_fakes.TestVolume):
|
|
|
2047
2007
|
def setUp(self):
|
|
2048
2008
|
super().setUp()
|
|
2049
2009
|
|
|
2050
|
-
self.
|
|
2051
|
-
self.
|
|
2010
|
+
self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
|
|
2011
|
+
self.volume_sdk_client.find_volume.return_value = self.volume
|
|
2012
|
+
|
|
2013
|
+
self.columns = (
|
|
2014
|
+
'attachments',
|
|
2015
|
+
'availability_zone',
|
|
2016
|
+
'backup_id',
|
|
2017
|
+
'bootable',
|
|
2018
|
+
'cluster_name',
|
|
2019
|
+
'consistencygroup_id',
|
|
2020
|
+
'consumes_quota',
|
|
2021
|
+
'created_at',
|
|
2022
|
+
'description',
|
|
2023
|
+
'encrypted',
|
|
2024
|
+
'encryption_key_id',
|
|
2025
|
+
'group_id',
|
|
2026
|
+
'id',
|
|
2027
|
+
'multiattach',
|
|
2028
|
+
'name',
|
|
2029
|
+
'os-vol-host-attr:host',
|
|
2030
|
+
'os-vol-mig-status-attr:migstat',
|
|
2031
|
+
'os-vol-mig-status-attr:name_id',
|
|
2032
|
+
'os-vol-tenant-attr:tenant_id',
|
|
2033
|
+
'properties',
|
|
2034
|
+
'provider_id',
|
|
2035
|
+
'replication_status',
|
|
2036
|
+
'service_uuid',
|
|
2037
|
+
'shared_targets',
|
|
2038
|
+
'size',
|
|
2039
|
+
'snapshot_id',
|
|
2040
|
+
'source_volid',
|
|
2041
|
+
'status',
|
|
2042
|
+
'type',
|
|
2043
|
+
'updated_at',
|
|
2044
|
+
'user_id',
|
|
2045
|
+
'volume_image_metadata',
|
|
2046
|
+
'volume_type_id',
|
|
2047
|
+
)
|
|
2048
|
+
self.data = (
|
|
2049
|
+
self.volume.attachments,
|
|
2050
|
+
self.volume.availability_zone,
|
|
2051
|
+
self.volume.backup_id,
|
|
2052
|
+
self.volume.is_bootable,
|
|
2053
|
+
self.volume.cluster_name,
|
|
2054
|
+
self.volume.consistency_group_id,
|
|
2055
|
+
self.volume.consumes_quota,
|
|
2056
|
+
self.volume.created_at,
|
|
2057
|
+
self.volume.description,
|
|
2058
|
+
self.volume.is_encrypted,
|
|
2059
|
+
self.volume.encryption_key_id,
|
|
2060
|
+
self.volume.group_id,
|
|
2061
|
+
self.volume.id,
|
|
2062
|
+
self.volume.is_multiattach,
|
|
2063
|
+
self.volume.name,
|
|
2064
|
+
self.volume.host,
|
|
2065
|
+
self.volume.migration_status,
|
|
2066
|
+
self.volume.migration_id,
|
|
2067
|
+
self.volume.project_id,
|
|
2068
|
+
format_columns.DictColumn(self.volume.metadata),
|
|
2069
|
+
self.volume.provider_id,
|
|
2070
|
+
self.volume.replication_status,
|
|
2071
|
+
self.volume.service_uuid,
|
|
2072
|
+
self.volume.shared_targets,
|
|
2073
|
+
self.volume.size,
|
|
2074
|
+
self.volume.snapshot_id,
|
|
2075
|
+
self.volume.source_volume_id,
|
|
2076
|
+
self.volume.status,
|
|
2077
|
+
self.volume.volume_type,
|
|
2078
|
+
self.volume.updated_at,
|
|
2079
|
+
self.volume.user_id,
|
|
2080
|
+
self.volume.volume_image_metadata,
|
|
2081
|
+
self.volume.volume_type_id,
|
|
2082
|
+
)
|
|
2052
2083
|
|
|
2053
|
-
self._volume = volume_fakes.create_one_volume()
|
|
2054
|
-
self.volumes_mock.get.return_value = self._volume
|
|
2055
|
-
# Get the command object to test
|
|
2056
2084
|
self.cmd = volume.ShowVolume(self.app, None)
|
|
2057
2085
|
|
|
2058
2086
|
def test_volume_show(self):
|
|
2059
|
-
arglist = [self.
|
|
2060
|
-
verifylist = [("volume", self.
|
|
2087
|
+
arglist = [self.volume.id]
|
|
2088
|
+
verifylist = [("volume", self.volume.id)]
|
|
2061
2089
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
2062
2090
|
|
|
2063
2091
|
columns, data = self.cmd.take_action(parsed_args)
|
|
2064
|
-
self.volumes_mock.get.assert_called_with(self._volume.id)
|
|
2065
2092
|
|
|
2066
|
-
self.assertEqual(
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
self.assertTupleEqual(
|
|
2071
|
-
(
|
|
2072
|
-
self._volume.attachments,
|
|
2073
|
-
self._volume.availability_zone,
|
|
2074
|
-
self._volume.bootable,
|
|
2075
|
-
self._volume.description,
|
|
2076
|
-
self._volume.id,
|
|
2077
|
-
self._volume.name,
|
|
2078
|
-
format_columns.DictColumn(self._volume.metadata),
|
|
2079
|
-
self._volume.size,
|
|
2080
|
-
self._volume.snapshot_id,
|
|
2081
|
-
self._volume.status,
|
|
2082
|
-
self._volume.volume_type,
|
|
2083
|
-
),
|
|
2084
|
-
data,
|
|
2093
|
+
self.assertEqual(self.columns, columns)
|
|
2094
|
+
self.assertEqual(self.data, data)
|
|
2095
|
+
self.volume_sdk_client.find_volume.assert_called_with(
|
|
2096
|
+
self.volume.id, ignore_missing=False
|
|
2085
2097
|
)
|
|
2086
2098
|
|
|
2087
2099
|
|
|
@@ -2327,29 +2339,45 @@ class TestVolumeRevertToSnapshot(volume_fakes.TestVolume):
|
|
|
2327
2339
|
|
|
2328
2340
|
class TestColumns(volume_fakes.TestVolume):
|
|
2329
2341
|
def test_attachments_column_without_server_cache(self):
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2342
|
+
vol = sdk_fakes.generate_fake_resource(
|
|
2343
|
+
_volume.Volume,
|
|
2344
|
+
attachments=[
|
|
2345
|
+
{
|
|
2346
|
+
'device': '/dev/' + uuid.uuid4().hex,
|
|
2347
|
+
'server_id': uuid.uuid4().hex,
|
|
2348
|
+
},
|
|
2349
|
+
],
|
|
2350
|
+
)
|
|
2351
|
+
server_id = vol.attachments[0]['server_id']
|
|
2352
|
+
device = vol.attachments[0]['device']
|
|
2333
2353
|
|
|
2334
|
-
col = volume.AttachmentsColumn(
|
|
2354
|
+
col = volume.AttachmentsColumn(vol.attachments, {})
|
|
2335
2355
|
self.assertEqual(
|
|
2336
2356
|
f'Attached to {server_id} on {device} ',
|
|
2337
2357
|
col.human_readable(),
|
|
2338
2358
|
)
|
|
2339
|
-
self.assertEqual(
|
|
2359
|
+
self.assertEqual(vol.attachments, col.machine_readable())
|
|
2340
2360
|
|
|
2341
2361
|
def test_attachments_column_with_server_cache(self):
|
|
2342
|
-
|
|
2362
|
+
vol = sdk_fakes.generate_fake_resource(
|
|
2363
|
+
_volume.Volume,
|
|
2364
|
+
attachments=[
|
|
2365
|
+
{
|
|
2366
|
+
'device': '/dev/' + uuid.uuid4().hex,
|
|
2367
|
+
'server_id': uuid.uuid4().hex,
|
|
2368
|
+
},
|
|
2369
|
+
],
|
|
2370
|
+
)
|
|
2343
2371
|
|
|
2344
|
-
server_id =
|
|
2345
|
-
device =
|
|
2372
|
+
server_id = vol.attachments[0]['server_id']
|
|
2373
|
+
device = vol.attachments[0]['device']
|
|
2346
2374
|
fake_server = mock.Mock()
|
|
2347
2375
|
fake_server.name = 'fake-server-name'
|
|
2348
2376
|
server_cache = {server_id: fake_server}
|
|
2349
2377
|
|
|
2350
|
-
col = volume.AttachmentsColumn(
|
|
2378
|
+
col = volume.AttachmentsColumn(vol.attachments, server_cache)
|
|
2351
2379
|
self.assertEqual(
|
|
2352
2380
|
'Attached to {} on {} '.format('fake-server-name', device),
|
|
2353
2381
|
col.human_readable(),
|
|
2354
2382
|
)
|
|
2355
|
-
self.assertEqual(
|
|
2383
|
+
self.assertEqual(vol.attachments, col.machine_readable())
|