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.
Files changed (241) hide show
  1. openstackclient/api/compute_v2.py +2 -2
  2. openstackclient/api/object_store_v1.py +4 -1
  3. openstackclient/api/volume_v2.py +60 -0
  4. openstackclient/api/volume_v3.py +60 -0
  5. openstackclient/command.py +27 -0
  6. openstackclient/common/availability_zone.py +1 -1
  7. openstackclient/common/clientmanager.py +59 -21
  8. openstackclient/common/configuration.py +1 -1
  9. openstackclient/common/extension.py +1 -1
  10. openstackclient/common/limits.py +1 -1
  11. openstackclient/common/module.py +4 -2
  12. openstackclient/common/project_cleanup.py +10 -8
  13. openstackclient/common/quota.py +23 -6
  14. openstackclient/common/versions.py +1 -2
  15. openstackclient/compute/v2/agent.py +1 -1
  16. openstackclient/compute/v2/aggregate.py +6 -5
  17. openstackclient/compute/v2/console.py +5 -3
  18. openstackclient/compute/v2/console_connection.py +1 -1
  19. openstackclient/compute/v2/flavor.py +15 -2
  20. openstackclient/compute/v2/host.py +1 -1
  21. openstackclient/compute/v2/hypervisor.py +1 -1
  22. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  23. openstackclient/compute/v2/keypair.py +1 -1
  24. openstackclient/compute/v2/server.py +77 -30
  25. openstackclient/compute/v2/server_backup.py +1 -1
  26. openstackclient/compute/v2/server_event.py +1 -1
  27. openstackclient/compute/v2/server_group.py +4 -2
  28. openstackclient/compute/v2/server_image.py +1 -1
  29. openstackclient/compute/v2/server_migration.py +1 -1
  30. openstackclient/compute/v2/server_volume.py +1 -1
  31. openstackclient/compute/v2/service.py +1 -1
  32. openstackclient/compute/v2/usage.py +6 -4
  33. openstackclient/identity/common.py +10 -14
  34. openstackclient/identity/v2_0/catalog.py +3 -2
  35. openstackclient/identity/v2_0/ec2creds.py +1 -1
  36. openstackclient/identity/v2_0/endpoint.py +1 -1
  37. openstackclient/identity/v2_0/project.py +17 -7
  38. openstackclient/identity/v2_0/role.py +1 -1
  39. openstackclient/identity/v2_0/role_assignment.py +3 -3
  40. openstackclient/identity/v2_0/service.py +1 -1
  41. openstackclient/identity/v2_0/token.py +1 -1
  42. openstackclient/identity/v2_0/user.py +2 -2
  43. openstackclient/identity/v3/access_rule.py +16 -4
  44. openstackclient/identity/v3/application_credential.py +116 -95
  45. openstackclient/identity/v3/catalog.py +3 -3
  46. openstackclient/identity/v3/consumer.py +1 -1
  47. openstackclient/identity/v3/credential.py +1 -1
  48. openstackclient/identity/v3/domain.py +15 -10
  49. openstackclient/identity/v3/ec2creds.py +1 -1
  50. openstackclient/identity/v3/endpoint.py +33 -12
  51. openstackclient/identity/v3/endpoint_group.py +1 -1
  52. openstackclient/identity/v3/federation_protocol.py +1 -1
  53. openstackclient/identity/v3/group.py +11 -5
  54. openstackclient/identity/v3/identity_provider.py +12 -10
  55. openstackclient/identity/v3/implied_role.py +1 -1
  56. openstackclient/identity/v3/limit.py +1 -1
  57. openstackclient/identity/v3/mapping.py +1 -1
  58. openstackclient/identity/v3/policy.py +1 -1
  59. openstackclient/identity/v3/project.py +34 -22
  60. openstackclient/identity/v3/region.py +1 -1
  61. openstackclient/identity/v3/registered_limit.py +16 -11
  62. openstackclient/identity/v3/role.py +27 -41
  63. openstackclient/identity/v3/role_assignment.py +12 -23
  64. openstackclient/identity/v3/service.py +1 -1
  65. openstackclient/identity/v3/service_provider.py +1 -1
  66. openstackclient/identity/v3/tag.py +3 -2
  67. openstackclient/identity/v3/token.py +3 -2
  68. openstackclient/identity/v3/trust.py +4 -2
  69. openstackclient/identity/v3/unscoped_saml.py +1 -1
  70. openstackclient/identity/v3/user.py +22 -13
  71. openstackclient/image/v1/image.py +35 -17
  72. openstackclient/image/v2/cache.py +11 -7
  73. openstackclient/image/v2/image.py +62 -12
  74. openstackclient/image/v2/info.py +1 -1
  75. openstackclient/image/v2/metadef_namespaces.py +1 -1
  76. openstackclient/image/v2/metadef_objects.py +9 -3
  77. openstackclient/image/v2/metadef_properties.py +11 -3
  78. openstackclient/image/v2/metadef_resource_type_association.py +1 -1
  79. openstackclient/image/v2/metadef_resource_types.py +1 -1
  80. openstackclient/image/v2/task.py +1 -1
  81. openstackclient/network/common.py +10 -9
  82. openstackclient/network/v2/address_group.py +4 -3
  83. openstackclient/network/v2/address_scope.py +8 -6
  84. openstackclient/network/v2/default_security_group_rule.py +9 -8
  85. openstackclient/network/v2/floating_ip.py +16 -9
  86. openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
  87. openstackclient/network/v2/ip_availability.py +7 -4
  88. openstackclient/network/v2/l3_conntrack_helper.py +11 -4
  89. openstackclient/network/v2/local_ip.py +13 -7
  90. openstackclient/network/v2/local_ip_association.py +7 -4
  91. openstackclient/network/v2/ndp_proxy.py +13 -6
  92. openstackclient/network/v2/network.py +33 -16
  93. openstackclient/network/v2/network_agent.py +5 -5
  94. openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
  95. openstackclient/network/v2/network_flavor.py +1 -1
  96. openstackclient/network/v2/network_flavor_profile.py +1 -1
  97. openstackclient/network/v2/network_meter.py +1 -1
  98. openstackclient/network/v2/network_meter_rule.py +1 -1
  99. openstackclient/network/v2/network_qos_policy.py +7 -5
  100. openstackclient/network/v2/network_qos_rule.py +1 -1
  101. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  102. openstackclient/network/v2/network_rbac.py +8 -5
  103. openstackclient/network/v2/network_segment.py +2 -2
  104. openstackclient/network/v2/network_segment_range.py +13 -6
  105. openstackclient/network/v2/network_service_provider.py +1 -1
  106. openstackclient/network/v2/network_trunk.py +65 -42
  107. openstackclient/network/v2/port.py +38 -20
  108. openstackclient/network/v2/router.py +19 -8
  109. openstackclient/network/v2/security_group.py +52 -7
  110. openstackclient/network/v2/security_group_rule.py +27 -4
  111. openstackclient/network/v2/subnet.py +17 -18
  112. openstackclient/network/v2/subnet_pool.py +11 -9
  113. openstackclient/network/v2/taas/__init__.py +0 -0
  114. openstackclient/network/v2/taas/tap_flow.py +245 -0
  115. openstackclient/network/v2/taas/tap_mirror.py +237 -0
  116. openstackclient/network/v2/taas/tap_service.py +211 -0
  117. openstackclient/object/v1/account.py +1 -1
  118. openstackclient/object/v1/container.py +1 -1
  119. openstackclient/object/v1/object.py +1 -1
  120. openstackclient/shell.py +18 -8
  121. openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
  122. openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
  123. openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
  124. openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
  125. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  126. openstackclient/tests/functional/image/v2/test_image.py +36 -14
  127. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  128. openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
  129. openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
  130. openstackclient/tests/unit/api/test_volume_v2.py +124 -0
  131. openstackclient/tests/unit/api/test_volume_v3.py +124 -0
  132. openstackclient/tests/unit/common/test_command.py +1 -1
  133. openstackclient/tests/unit/common/test_extension.py +2 -3
  134. openstackclient/tests/unit/common/test_module.py +14 -7
  135. openstackclient/tests/unit/common/test_quota.py +20 -0
  136. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  137. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  138. openstackclient/tests/unit/compute/v2/test_flavor.py +160 -177
  139. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  140. openstackclient/tests/unit/compute/v2/test_server.py +406 -81
  141. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  142. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  143. openstackclient/tests/unit/fakes.py +35 -134
  144. openstackclient/tests/unit/identity/test_common.py +100 -0
  145. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  146. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  147. openstackclient/tests/unit/identity/v3/test_application_credential.py +50 -44
  148. openstackclient/tests/unit/identity/v3/test_domain.py +3 -3
  149. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  150. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  151. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  152. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  153. openstackclient/tests/unit/identity/v3/test_project.py +31 -54
  154. openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
  155. openstackclient/tests/unit/identity/v3/test_role.py +3 -90
  156. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  157. openstackclient/tests/unit/image/v1/test_image.py +47 -0
  158. openstackclient/tests/unit/image/v2/test_image.py +190 -9
  159. openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
  160. openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
  161. openstackclient/tests/unit/network/test_common.py +9 -13
  162. openstackclient/tests/unit/network/v2/fakes.py +1 -0
  163. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  164. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  165. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  166. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  167. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  168. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  169. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  170. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  171. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  172. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  173. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  174. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  175. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  176. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -23
  177. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  178. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  179. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  180. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  181. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  182. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  183. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  184. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  185. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  186. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  187. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  188. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  189. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  190. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  191. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  192. openstackclient/tests/unit/network/v2/test_port.py +113 -84
  193. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  194. openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -26
  195. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +66 -18
  196. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  197. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  198. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  199. openstackclient/tests/unit/volume/v2/test_volume.py +358 -305
  200. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  201. openstackclient/tests/unit/volume/v3/test_volume.py +443 -415
  202. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  203. openstackclient/volume/client.py +7 -17
  204. openstackclient/volume/v2/backup_record.py +1 -1
  205. openstackclient/volume/v2/consistency_group.py +1 -1
  206. openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
  207. openstackclient/volume/v2/qos_specs.py +1 -1
  208. openstackclient/volume/v2/service.py +2 -2
  209. openstackclient/volume/v2/volume.py +80 -54
  210. openstackclient/volume/v2/volume_backend.py +1 -1
  211. openstackclient/volume/v2/volume_backup.py +5 -3
  212. openstackclient/volume/v2/volume_host.py +1 -2
  213. openstackclient/volume/v2/volume_snapshot.py +2 -2
  214. openstackclient/volume/v2/volume_transfer_request.py +1 -1
  215. openstackclient/volume/v2/volume_type.py +11 -6
  216. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  217. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  218. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  219. openstackclient/volume/v3/block_storage_manage.py +1 -1
  220. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  221. openstackclient/volume/v3/service.py +2 -2
  222. openstackclient/volume/v3/volume.py +104 -77
  223. openstackclient/volume/v3/volume_attachment.py +6 -5
  224. openstackclient/volume/v3/volume_backup.py +18 -3
  225. openstackclient/volume/v3/volume_group.py +2 -2
  226. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  227. openstackclient/volume/v3/volume_group_type.py +1 -1
  228. openstackclient/volume/v3/volume_message.py +1 -1
  229. openstackclient/volume/v3/volume_snapshot.py +2 -2
  230. openstackclient/volume/v3/volume_transfer_request.py +1 -1
  231. openstackclient/volume/v3/volume_type.py +15 -9
  232. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +19 -17
  233. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +239 -224
  234. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
  235. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
  236. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +15 -0
  237. python_openstackclient-8.3.0.dist-info/pbr.json +1 -0
  238. openstackclient/tests/unit/common/test_logs.py +0 -221
  239. python_openstackclient-8.1.0.dist-info/pbr.json +0 -1
  240. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/LICENSE +0 -0
  241. {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
- # TODO(stephenfin): Combine these two test classes
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.volumes_mock = self.volume_client.volumes
56
- self.volumes_mock.reset_mock()
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.new_volume.attachments,
72
- self.new_volume.availability_zone,
73
- self.new_volume.bootable,
74
- self.new_volume.description,
75
- self.new_volume.id,
76
- self.new_volume.name,
77
- format_columns.DictColumn(self.new_volume.metadata),
78
- self.new_volume.size,
79
- self.new_volume.snapshot_id,
80
- self.new_volume.status,
81
- self.new_volume.volume_type,
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.new_volume.size),
121
+ str(self.volume.size),
91
122
  ]
92
123
  verifylist = [
93
- ('size', self.new_volume.size),
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.volumes_mock.create.assert_called_with(
103
- size=self.new_volume.size,
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
- imageRef=None,
111
- source_volid=None,
112
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
146
+ self.assertEqual(self.datalist, data)
119
147
 
120
148
  def test_volume_create_options(self):
121
- consistency_group = volume_fakes.create_one_consistency_group()
122
- self.consistencygroups_mock.get.return_value = consistency_group
149
+ consistency_group_id = 'cg123'
123
150
  arglist = [
124
151
  '--size',
125
- str(self.new_volume.size),
152
+ str(self.volume.size),
126
153
  '--description',
127
- self.new_volume.description,
154
+ self.volume.description,
128
155
  '--type',
129
- self.new_volume.volume_type,
156
+ self.volume.volume_type,
130
157
  '--availability-zone',
131
- self.new_volume.availability_zone,
158
+ self.volume.availability_zone,
132
159
  '--consistency-group',
133
- consistency_group.id,
160
+ consistency_group_id,
134
161
  '--hint',
135
162
  'k=v',
136
- self.new_volume.name,
163
+ self.volume.name,
137
164
  ]
138
165
  verifylist = [
139
- ('size', self.new_volume.size),
140
- ('description', self.new_volume.description),
141
- ('type', self.new_volume.volume_type),
142
- ('availability_zone', self.new_volume.availability_zone),
143
- ('consistency_group', consistency_group.id),
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.new_volume.name),
172
+ ('name', self.volume.name),
146
173
  ]
147
174
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
148
175
 
149
- # In base command class ShowOne in cliff, abstract method take_action()
150
- # returns a two-part tuple with a tuple of column names and a tuple of
151
- # data to be shown.
152
- columns, data = self.cmd.take_action(parsed_args)
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.volumes_mock.create.assert_called_with(
155
- size=self.new_volume.size,
183
+ self.volume_sdk_client.create_volume.assert_called_with(
184
+ size=self.volume.size,
156
185
  snapshot_id=None,
157
- name=self.new_volume.name,
158
- description=self.new_volume.description,
159
- volume_type=self.new_volume.volume_type,
160
- availability_zone=self.new_volume.availability_zone,
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
- imageRef=None,
163
- source_volid=None,
164
- consistencygroup_id=consistency_group.id,
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.assertCountEqual(self.datalist, data)
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.new_volume.size),
180
- self.new_volume.name,
211
+ str(self.volume.size),
212
+ self.volume.name,
181
213
  ]
182
214
  verifylist = [
183
215
  ('properties', {'Alpha': 'a', 'Beta': 'b'}),
184
- ('size', self.new_volume.size),
185
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_with(
195
- size=self.new_volume.size,
223
+ self.volume_sdk_client.create_volume.assert_called_with(
224
+ size=self.volume.size,
196
225
  snapshot_id=None,
197
- name=self.new_volume.name,
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
- imageRef=None,
203
- source_volid=None,
204
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
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.new_volume.size),
221
- self.new_volume.name,
249
+ str(self.volume.size),
250
+ self.volume.name,
222
251
  ]
223
252
  verifylist = [
224
253
  ('image', image.id),
225
- ('size', self.new_volume.size),
226
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_with(
236
- size=self.new_volume.size,
261
+ self.volume_sdk_client.create_volume.assert_called_with(
262
+ size=self.volume.size,
237
263
  snapshot_id=None,
238
- name=self.new_volume.name,
264
+ name=self.volume.name,
239
265
  description=None,
240
266
  volume_type=None,
241
267
  availability_zone=None,
242
268
  metadata=None,
243
- imageRef=image.id,
244
- source_volid=None,
245
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
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.new_volume.size),
262
- self.new_volume.name,
287
+ str(self.volume.size),
288
+ self.volume.name,
263
289
  ]
264
290
  verifylist = [
265
291
  ('image', image.name),
266
- ('size', self.new_volume.size),
267
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_with(
277
- size=self.new_volume.size,
299
+ self.volume_sdk_client.create_volume.assert_called_with(
300
+ size=self.volume.size,
278
301
  snapshot_id=None,
279
- name=self.new_volume.name,
302
+ name=self.volume.name,
280
303
  description=None,
281
304
  volume_type=None,
282
305
  availability_zone=None,
283
306
  metadata=None,
284
- imageRef=image.id,
285
- source_volid=None,
286
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
315
+ self.assertEqual(self.datalist, data)
293
316
 
294
317
  def test_volume_create_with_snapshot(self):
295
- snapshot = volume_fakes.create_one_snapshot()
296
- self.new_volume.snapshot_id = snapshot.id
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
- self.new_volume.snapshot_id,
300
- self.new_volume.name,
323
+ snapshot.id,
324
+ self.volume.name,
301
325
  ]
302
326
  verifylist = [
303
- ('snapshot', self.new_volume.snapshot_id),
304
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_once_with(
334
+ self.volume_sdk_client.create_volume.assert_called_with(
316
335
  size=snapshot.size,
317
336
  snapshot_id=snapshot.id,
318
- name=self.new_volume.name,
337
+ name=self.volume.name,
319
338
  description=None,
320
339
  volume_type=None,
321
340
  availability_zone=None,
322
341
  metadata=None,
323
- imageRef=None,
324
- source_volid=None,
325
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
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 = volume_fakes.create_one_backup()
337
- self.new_volume.backup_id = backup.id
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
- self.new_volume.backup_id,
341
- self.new_volume.name,
363
+ backup.id,
364
+ self.volume.name,
342
365
  ]
343
366
  verifylist = [
344
- ('backup', self.new_volume.backup_id),
345
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_once_with(
374
+ self.volume_sdk_client.create_volume.assert_called_with(
357
375
  size=backup.size,
358
376
  snapshot_id=None,
359
- name=self.new_volume.name,
377
+ name=self.volume.name,
360
378
  description=None,
361
379
  volume_type=None,
362
380
  availability_zone=None,
363
381
  metadata=None,
364
- imageRef=None,
365
- source_volid=None,
366
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
393
+ self.assertEqual(self.datalist, data)
373
394
 
374
395
  def test_volume_create_with_backup_pre_v347(self):
375
- backup = volume_fakes.create_one_backup()
376
- self.new_volume.backup_id = backup.id
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
- self.new_volume.backup_id,
380
- self.new_volume.name,
401
+ backup.id,
402
+ self.volume.name,
381
403
  ]
382
404
  verifylist = [
383
- ('backup', self.new_volume.backup_id),
384
- ('name', self.new_volume.name),
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
- source_vol = "source_vol"
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
- self.new_volume.id,
400
- source_vol,
423
+ source_volume.id,
424
+ self.volume.name,
401
425
  ]
402
426
  verifylist = [
403
- ('source', self.new_volume.id),
404
- ('name', source_vol),
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.volumes_mock.create.assert_called_once_with(
416
- size=self.new_volume.size,
434
+ self.volume_sdk_client.create_volume.assert_called_with(
435
+ size=source_volume.size,
417
436
  snapshot_id=None,
418
- name=source_vol,
437
+ name=self.volume.name,
419
438
  description=None,
420
439
  volume_type=None,
421
440
  availability_zone=None,
422
441
  metadata=None,
423
- imageRef=None,
424
- source_volid=self.new_volume.id,
425
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
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.new_volume.size),
440
- self.new_volume.name,
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.new_volume.size),
446
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_with(
454
- size=self.new_volume.size,
475
+ self.volume_sdk_client.create_volume.assert_called_with(
476
+ size=self.volume.size,
455
477
  snapshot_id=None,
456
- name=self.new_volume.name,
478
+ name=self.volume.name,
457
479
  description=None,
458
480
  volume_type=None,
459
481
  availability_zone=None,
460
482
  metadata=None,
461
- imageRef=None,
462
- source_volid=None,
463
- consistencygroup_id=None,
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
- self.assertEqual(self.columns, columns)
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.volumes_mock.update_readonly_flag.assert_called_with(
474
- self.new_volume.id, True
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.new_volume.size),
484
- self.new_volume.name,
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.new_volume.size),
490
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_with(
498
- size=self.new_volume.size,
519
+ self.volume_sdk_client.create_volume.assert_called_with(
520
+ size=self.volume.size,
499
521
  snapshot_id=None,
500
- name=self.new_volume.name,
522
+ name=self.volume.name,
501
523
  description=None,
502
524
  volume_type=None,
503
525
  availability_zone=None,
504
526
  metadata=None,
505
- imageRef=None,
506
- source_volid=None,
507
- consistencygroup_id=None,
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
- self.assertEqual(self.columns, columns)
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.volumes_mock.update_readonly_flag.assert_called_with(
518
- self.new_volume.id, False
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.volumes_mock.set_bootable.side_effect = exceptions.CommandError()
527
-
528
- self.volumes_mock.update_readonly_flag.side_effect = (
529
- exceptions.CommandError()
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.new_volume.size),
537
- self.new_volume.name,
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.new_volume.size),
543
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_with(
551
- size=self.new_volume.size,
573
+ self.volume_sdk_client.create_volume.assert_called_with(
574
+ size=self.volume.size,
552
575
  snapshot_id=None,
553
- name=self.new_volume.name,
576
+ name=self.volume.name,
554
577
  description=None,
555
578
  volume_type=None,
556
579
  availability_zone=None,
557
580
  metadata=None,
558
- imageRef=None,
559
- source_volid=None,
560
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
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.new_volume.size),
587
- self.new_volume.name,
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.new_volume.size),
593
- ('name', self.new_volume.name),
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.volumes_mock.create.assert_called_with(
601
- size=self.new_volume.size,
621
+ self.volume_sdk_client.create_volume.assert_called_with(
622
+ size=self.volume.size,
602
623
  snapshot_id=None,
603
- name=self.new_volume.name,
624
+ name=self.volume.name,
604
625
  description=None,
605
626
  volume_type=None,
606
627
  availability_zone=None,
607
628
  metadata=None,
608
- imageRef=None,
609
- source_volid=None,
610
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
638
+ self.assertEqual(self.datalist, data)
618
639
 
619
640
  def test_volume_create_without_size(self):
620
641
  arglist = [
621
- self.new_volume.name,
642
+ self.volume.name,
622
643
  ]
623
644
  verifylist = [
624
- ('name', self.new_volume.name),
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.new_volume.size),
642
- self.new_volume.name,
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.new_volume.size),
649
- ('name', self.new_volume.name),
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.new_volume.size),
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.new_volume.name,
704
+ self.volume.name,
684
705
  ]
685
706
  verifylist = [
686
- ('size', self.new_volume.size),
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.new_volume.name),
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.volumes_mock.create.assert_called_with(
706
- size=self.new_volume.size,
723
+ self.volume_sdk_client.create_volume.assert_called_with(
724
+ size=self.volume.size,
707
725
  snapshot_id=None,
708
- name=self.new_volume.name,
726
+ name=self.volume.name,
709
727
  description=None,
710
728
  volume_type=None,
711
729
  availability_zone=None,
712
730
  metadata=None,
713
- imageRef=None,
714
- source_volid=None,
715
- consistencygroup_id=None,
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.assertCountEqual(self.datalist, data)
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.new_volume
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.new_volume.name,
754
+ self.volume.name,
817
755
  ]
818
756
  verifylist = [
819
757
  ('remote_source', {'key': 'val'}),
820
758
  ('host', 'fake_host'),
821
- ('name', self.new_volume.name),
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.assertCountEqual(self.datalist, data)
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.new_volume.name,
787
+ self.volume.name,
850
788
  ]
851
789
  verifylist = [
852
790
  ('remote_source', {'key': 'val'}),
853
791
  ('cluster', 'fake_cluster'),
854
- ('name', self.new_volume.name),
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.new_volume.name,
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.new_volume.name),
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.new_volume.name,
833
+ self.volume.name,
896
834
  ]
897
835
  verifylist = [
898
836
  ('remote_source', {'key': 'val'}),
899
- ('name', self.new_volume.name),
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.new_volume.size),
851
+ str(self.volume.size),
914
852
  '--remote-source',
915
853
  'key=val',
916
- self.new_volume.name,
854
+ self.volume.name,
917
855
  ]
918
856
  verifylist = [
919
- ('size', self.new_volume.size),
857
+ ('size', self.volume.size),
920
858
  ('remote_source', {'key': 'val'}),
921
- ('name', self.new_volume.name),
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.new_volume.size),
875
+ str(self.volume.size),
938
876
  '--host',
939
877
  'fake_host',
940
- self.new_volume.name,
878
+ self.volume.name,
941
879
  ]
942
880
  verifylist = [
943
- ('size', self.new_volume.size),
881
+ ('size', self.volume.size),
944
882
  ('host', 'fake_host'),
945
- ('name', self.new_volume.name),
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.volumes_mock = self.volume_client.volumes
1728
- self.volumes_mock.reset_mock()
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._volume.id,
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._volume.id),
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._volume.id,
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._volume.id),
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._volume.id,
1738
+ self.volume.id,
1782
1739
  ]
1783
1740
  verifylist = [
1784
1741
  ("force_host_copy", False),
1785
1742
  ("lock_volume", False),
1786
- ("volume", self._volume.id),
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.volumes_mock = self.volume_client.volumes
2051
- self.volumes_mock.reset_mock()
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._volume.id]
2060
- verifylist = [("volume", self._volume.id)]
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
- tuple(sorted(self._volume.keys())),
2068
- columns,
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
- _volume = volume_fakes.create_one_volume()
2331
- server_id = _volume.attachments[0]['server_id']
2332
- device = _volume.attachments[0]['device']
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(_volume.attachments, {})
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(_volume.attachments, col.machine_readable())
2359
+ self.assertEqual(vol.attachments, col.machine_readable())
2340
2360
 
2341
2361
  def test_attachments_column_with_server_cache(self):
2342
- _volume = volume_fakes.create_one_volume()
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 = _volume.attachments[0]['server_id']
2345
- device = _volume.attachments[0]['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(_volume.attachments, server_cache)
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(_volume.attachments, col.machine_readable())
2383
+ self.assertEqual(vol.attachments, col.machine_readable())