python-openstackclient 7.4.0__py3-none-any.whl → 8.0.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 (234) hide show
  1. openstackclient/common/availability_zone.py +3 -6
  2. openstackclient/common/clientmanager.py +2 -1
  3. openstackclient/common/envvars.py +57 -0
  4. openstackclient/common/extension.py +3 -11
  5. openstackclient/common/limits.py +1 -1
  6. openstackclient/common/project_cleanup.py +3 -2
  7. openstackclient/common/quota.py +54 -28
  8. openstackclient/compute/client.py +2 -5
  9. openstackclient/compute/v2/agent.py +5 -5
  10. openstackclient/compute/v2/aggregate.py +17 -15
  11. openstackclient/compute/v2/console.py +3 -4
  12. openstackclient/compute/v2/flavor.py +14 -18
  13. openstackclient/compute/v2/host.py +3 -3
  14. openstackclient/compute/v2/hypervisor.py +10 -4
  15. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  16. openstackclient/compute/v2/keypair.py +8 -10
  17. openstackclient/compute/v2/server.py +70 -112
  18. openstackclient/compute/v2/server_backup.py +1 -1
  19. openstackclient/compute/v2/server_event.py +7 -16
  20. openstackclient/compute/v2/server_group.py +6 -6
  21. openstackclient/compute/v2/server_image.py +1 -1
  22. openstackclient/compute/v2/server_migration.py +6 -6
  23. openstackclient/compute/v2/server_volume.py +4 -4
  24. openstackclient/compute/v2/service.py +9 -13
  25. openstackclient/compute/v2/usage.py +4 -6
  26. openstackclient/identity/client.py +2 -4
  27. openstackclient/identity/common.py +16 -17
  28. openstackclient/identity/v2_0/ec2creds.py +4 -3
  29. openstackclient/identity/v2_0/endpoint.py +12 -10
  30. openstackclient/identity/v2_0/project.py +6 -6
  31. openstackclient/identity/v2_0/role.py +1 -1
  32. openstackclient/identity/v2_0/service.py +7 -7
  33. openstackclient/identity/v2_0/user.py +6 -21
  34. openstackclient/identity/v3/access_rule.py +2 -5
  35. openstackclient/identity/v3/consumer.py +4 -3
  36. openstackclient/identity/v3/credential.py +6 -7
  37. openstackclient/identity/v3/domain.py +1 -1
  38. openstackclient/identity/v3/ec2creds.py +4 -3
  39. openstackclient/identity/v3/endpoint.py +104 -88
  40. openstackclient/identity/v3/endpoint_group.py +1 -1
  41. openstackclient/identity/v3/group.py +3 -4
  42. openstackclient/identity/v3/identity_provider.py +1 -2
  43. openstackclient/identity/v3/limit.py +4 -9
  44. openstackclient/identity/v3/mapping.py +4 -3
  45. openstackclient/identity/v3/policy.py +5 -8
  46. openstackclient/identity/v3/project.py +6 -6
  47. openstackclient/identity/v3/region.py +2 -5
  48. openstackclient/identity/v3/registered_limit.py +4 -8
  49. openstackclient/identity/v3/role.py +15 -16
  50. openstackclient/identity/v3/service.py +8 -8
  51. openstackclient/identity/v3/service_provider.py +3 -6
  52. openstackclient/identity/v3/tag.py +2 -2
  53. openstackclient/identity/v3/token.py +1 -2
  54. openstackclient/identity/v3/trust.py +74 -25
  55. openstackclient/identity/v3/user.py +9 -6
  56. openstackclient/image/client.py +2 -5
  57. openstackclient/image/v1/image.py +11 -15
  58. openstackclient/image/v2/cache.py +2 -4
  59. openstackclient/image/v2/image.py +30 -37
  60. openstackclient/image/v2/metadef_namespaces.py +4 -3
  61. openstackclient/image/v2/metadef_resource_type_association.py +1 -2
  62. openstackclient/image/v2/metadef_resource_types.py +1 -2
  63. openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +9 -1370
  64. openstackclient/network/client.py +4 -10
  65. openstackclient/network/common.py +16 -12
  66. openstackclient/network/utils.py +3 -3
  67. openstackclient/network/v2/address_group.py +5 -9
  68. openstackclient/network/v2/address_scope.py +2 -3
  69. openstackclient/network/v2/default_security_group_rule.py +1 -2
  70. openstackclient/network/v2/floating_ip.py +14 -21
  71. openstackclient/network/v2/floating_ip_port_forwarding.py +7 -7
  72. openstackclient/network/v2/ip_availability.py +1 -2
  73. openstackclient/network/v2/l3_conntrack_helper.py +8 -12
  74. openstackclient/network/v2/local_ip.py +24 -26
  75. openstackclient/network/v2/local_ip_association.py +4 -5
  76. openstackclient/network/v2/ndp_proxy.py +9 -10
  77. openstackclient/network/v2/network.py +12 -16
  78. openstackclient/network/v2/network_agent.py +29 -37
  79. openstackclient/network/v2/network_auto_allocated_topology.py +4 -5
  80. openstackclient/network/v2/network_flavor.py +1 -1
  81. openstackclient/network/v2/network_flavor_profile.py +5 -5
  82. openstackclient/network/v2/network_meter.py +3 -3
  83. openstackclient/network/v2/network_meter_rule.py +5 -8
  84. openstackclient/network/v2/network_qos_policy.py +4 -4
  85. openstackclient/network/v2/network_qos_rule.py +4 -5
  86. openstackclient/network/v2/network_rbac.py +4 -4
  87. openstackclient/network/v2/network_segment.py +6 -7
  88. openstackclient/network/v2/network_segment_range.py +16 -20
  89. openstackclient/network/v2/network_trunk.py +24 -16
  90. openstackclient/network/v2/port.py +28 -29
  91. openstackclient/network/v2/router.py +52 -41
  92. openstackclient/network/v2/security_group.py +8 -15
  93. openstackclient/network/v2/security_group_rule.py +9 -10
  94. openstackclient/network/v2/subnet.py +31 -30
  95. openstackclient/network/v2/subnet_pool.py +4 -4
  96. openstackclient/object/client.py +2 -3
  97. openstackclient/object/v1/container.py +2 -3
  98. openstackclient/object/v1/object.py +2 -9
  99. openstackclient/shell.py +22 -5
  100. openstackclient/tests/functional/base.py +2 -2
  101. openstackclient/tests/functional/common/test_quota.py +3 -1
  102. openstackclient/tests/functional/compute/v2/common.py +12 -6
  103. openstackclient/tests/functional/compute/v2/test_server.py +2 -3
  104. openstackclient/tests/functional/compute/v2/test_server_event.py +1 -1
  105. openstackclient/tests/functional/identity/v2/test_user.py +1 -1
  106. openstackclient/tests/functional/identity/v3/common.py +3 -8
  107. openstackclient/tests/functional/identity/v3/test_application_credential.py +10 -10
  108. openstackclient/tests/functional/identity/v3/test_endpoint.py +3 -3
  109. openstackclient/tests/functional/identity/v3/test_group.py +3 -3
  110. openstackclient/tests/functional/identity/v3/test_idp.py +3 -7
  111. openstackclient/tests/functional/identity/v3/test_limit.py +4 -4
  112. openstackclient/tests/functional/identity/v3/test_project.py +5 -14
  113. openstackclient/tests/functional/identity/v3/test_region.py +1 -3
  114. openstackclient/tests/functional/identity/v3/test_registered_limit.py +3 -3
  115. openstackclient/tests/functional/identity/v3/test_role.py +1 -1
  116. openstackclient/tests/functional/identity/v3/test_role_assignment.py +13 -31
  117. openstackclient/tests/functional/identity/v3/test_service_provider.py +3 -7
  118. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  119. openstackclient/tests/functional/network/v2/common.py +7 -3
  120. openstackclient/tests/functional/network/v2/test_address_group.py +4 -0
  121. openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +15 -11
  122. openstackclient/tests/functional/network/v2/test_local_ip.py +4 -0
  123. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +2 -2
  124. openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +2 -3
  125. openstackclient/tests/functional/network/v2/test_network_rbac.py +2 -2
  126. openstackclient/tests/functional/network/v2/test_network_trunk.py +1 -1
  127. openstackclient/tests/functional/network/v2/test_port.py +17 -7
  128. openstackclient/tests/functional/network/v2/test_router.py +42 -0
  129. openstackclient/tests/functional/network/v2/test_subnet_pool.py +4 -0
  130. openstackclient/tests/unit/api/test_compute_v2.py +67 -87
  131. openstackclient/tests/unit/common/test_availability_zone.py +6 -14
  132. openstackclient/tests/unit/common/test_command.py +1 -1
  133. openstackclient/tests/unit/common/test_extension.py +5 -7
  134. openstackclient/tests/unit/common/test_limits.py +1 -1
  135. openstackclient/tests/unit/common/test_project_cleanup.py +5 -6
  136. openstackclient/tests/unit/common/test_quota.py +51 -28
  137. openstackclient/tests/unit/compute/v2/fakes.py +4 -10
  138. openstackclient/tests/unit/compute/v2/test_agent.py +16 -16
  139. openstackclient/tests/unit/compute/v2/test_aggregate.py +56 -60
  140. openstackclient/tests/unit/compute/v2/test_console.py +16 -16
  141. openstackclient/tests/unit/compute/v2/test_flavor.py +71 -71
  142. openstackclient/tests/unit/compute/v2/test_host.py +8 -8
  143. openstackclient/tests/unit/compute/v2/test_hypervisor.py +22 -30
  144. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -2
  145. openstackclient/tests/unit/compute/v2/test_keypair.py +24 -24
  146. openstackclient/tests/unit/compute/v2/test_server.py +524 -560
  147. openstackclient/tests/unit/compute/v2/test_server_backup.py +5 -7
  148. openstackclient/tests/unit/compute/v2/test_server_event.py +16 -18
  149. openstackclient/tests/unit/compute/v2/test_server_group.py +25 -31
  150. openstackclient/tests/unit/compute/v2/test_server_image.py +6 -8
  151. openstackclient/tests/unit/compute/v2/test_server_migration.py +37 -37
  152. openstackclient/tests/unit/compute/v2/test_server_volume.py +12 -12
  153. openstackclient/tests/unit/compute/v2/test_service.py +39 -45
  154. openstackclient/tests/unit/compute/v2/test_usage.py +5 -5
  155. openstackclient/tests/unit/identity/v2_0/fakes.py +1 -1
  156. openstackclient/tests/unit/identity/v3/test_access_rule.py +1 -3
  157. openstackclient/tests/unit/identity/v3/test_application_credential.py +1 -1
  158. openstackclient/tests/unit/identity/v3/test_endpoint.py +167 -172
  159. openstackclient/tests/unit/identity/v3/test_mappings.py +2 -2
  160. openstackclient/tests/unit/identity/v3/test_trust.py +5 -2
  161. openstackclient/tests/unit/identity/v3/test_user.py +16 -0
  162. openstackclient/tests/unit/image/v1/fakes.py +2 -2
  163. openstackclient/tests/unit/image/v2/test_image.py +39 -1
  164. openstackclient/tests/unit/integ/cli/test_shell.py +1 -2
  165. openstackclient/tests/unit/network/test_common.py +2 -2
  166. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +8 -14
  167. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +49 -35
  168. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +1 -1
  169. openstackclient/tests/unit/network/v2/test_network_compute.py +11 -11
  170. openstackclient/tests/unit/network/v2/test_network_trunk.py +2 -2
  171. openstackclient/tests/unit/network/v2/test_port.py +4 -5
  172. openstackclient/tests/unit/network/v2/test_router.py +63 -0
  173. openstackclient/tests/unit/network/v2/test_security_group_compute.py +11 -19
  174. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +14 -14
  175. openstackclient/tests/unit/object/v1/test_object_all.py +4 -3
  176. openstackclient/tests/unit/test_shell.py +16 -13
  177. openstackclient/tests/unit/volume/v2/test_volume.py +1 -1
  178. openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +1 -1
  179. openstackclient/tests/unit/volume/v3/fakes.py +2 -8
  180. openstackclient/tests/unit/volume/v3/test_volume.py +1 -1
  181. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +3 -3
  182. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +1 -2
  183. openstackclient/tests/unit/volume/v3/test_volume_transfer_request.py +1 -1
  184. openstackclient/volume/client.py +1 -3
  185. openstackclient/volume/v2/consistency_group.py +4 -8
  186. openstackclient/volume/v2/consistency_group_snapshot.py +1 -2
  187. openstackclient/volume/v2/qos_specs.py +1 -2
  188. openstackclient/volume/v2/volume.py +8 -16
  189. openstackclient/volume/v2/volume_backup.py +6 -7
  190. openstackclient/volume/v2/volume_snapshot.py +8 -9
  191. openstackclient/volume/v2/volume_transfer_request.py +0 -3
  192. openstackclient/volume/v2/volume_type.py +10 -21
  193. openstackclient/volume/v3/block_storage_cluster.py +3 -3
  194. openstackclient/volume/v3/block_storage_manage.py +1 -3
  195. openstackclient/volume/v3/volume.py +18 -19
  196. openstackclient/volume/v3/volume_attachment.py +3 -2
  197. openstackclient/volume/v3/volume_backup.py +7 -8
  198. openstackclient/volume/v3/volume_group.py +2 -1
  199. openstackclient/volume/v3/volume_group_snapshot.py +2 -1
  200. openstackclient/volume/v3/volume_snapshot.py +4 -3
  201. openstackclient/volume/v3/volume_type.py +10 -21
  202. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.0.0.dist-info}/AUTHORS +3 -0
  203. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.0.0.dist-info}/METADATA +7 -13
  204. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.0.0.dist-info}/RECORD +209 -232
  205. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.0.0.dist-info}/WHEEL +1 -1
  206. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.0.0.dist-info}/entry_points.txt +0 -41
  207. python_openstackclient-8.0.0.dist-info/pbr.json +1 -0
  208. openstackclient/tests/functional/volume/v1/__init__.py +0 -0
  209. openstackclient/tests/functional/volume/v1/common.py +0 -35
  210. openstackclient/tests/functional/volume/v1/test_qos.py +0 -100
  211. openstackclient/tests/functional/volume/v1/test_service.py +0 -76
  212. openstackclient/tests/functional/volume/v1/test_snapshot.py +0 -232
  213. openstackclient/tests/functional/volume/v1/test_transfer_request.py +0 -111
  214. openstackclient/tests/functional/volume/v1/test_volume.py +0 -228
  215. openstackclient/tests/functional/volume/v1/test_volume_type.py +0 -213
  216. openstackclient/tests/unit/volume/v1/__init__.py +0 -0
  217. openstackclient/tests/unit/volume/v1/fakes.py +0 -615
  218. openstackclient/tests/unit/volume/v1/test_qos_specs.py +0 -471
  219. openstackclient/tests/unit/volume/v1/test_service.py +0 -295
  220. openstackclient/tests/unit/volume/v1/test_transfer_request.py +0 -380
  221. openstackclient/tests/unit/volume/v1/test_type.py +0 -633
  222. openstackclient/tests/unit/volume/v1/test_volume.py +0 -1447
  223. openstackclient/tests/unit/volume/v1/test_volume_backup.py +0 -435
  224. openstackclient/volume/v1/__init__.py +0 -0
  225. openstackclient/volume/v1/qos_specs.py +0 -377
  226. openstackclient/volume/v1/service.py +0 -136
  227. openstackclient/volume/v1/volume.py +0 -734
  228. openstackclient/volume/v1/volume_backup.py +0 -302
  229. openstackclient/volume/v1/volume_snapshot.py +0 -433
  230. openstackclient/volume/v1/volume_transfer_request.py +0 -200
  231. openstackclient/volume/v1/volume_type.py +0 -520
  232. python_openstackclient-7.4.0.dist-info/pbr.json +0 -1
  233. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.0.0.dist-info}/LICENSE +0 -0
  234. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.0.0.dist-info}/top_level.txt +0 -0
@@ -1,633 +0,0 @@
1
- #
2
- # Licensed under the Apache License, Version 2.0 (the "License"); you may
3
- # not use this file except in compliance with the License. You may obtain
4
- # a copy of the License at
5
- #
6
- # http://www.apache.org/licenses/LICENSE-2.0
7
- #
8
- # Unless required by applicable law or agreed to in writing, software
9
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
10
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
11
- # License for the specific language governing permissions and limitations
12
- # under the License.
13
- #
14
-
15
- from unittest import mock
16
- from unittest.mock import call
17
-
18
- from osc_lib.cli import format_columns
19
- from osc_lib import exceptions
20
- from osc_lib import utils
21
-
22
- from openstackclient.tests.unit import utils as tests_utils
23
- from openstackclient.tests.unit.volume.v1 import fakes as volume_fakes
24
- from openstackclient.volume.v1 import volume_type
25
-
26
-
27
- class TestType(volume_fakes.TestVolumev1):
28
- def setUp(self):
29
- super().setUp()
30
-
31
- self.types_mock = self.volume_client.volume_types
32
- self.types_mock.reset_mock()
33
-
34
- self.encryption_types_mock = self.volume_client.volume_encryption_types
35
- self.encryption_types_mock.reset_mock()
36
-
37
-
38
- class TestTypeCreate(TestType):
39
- columns = (
40
- 'description',
41
- 'id',
42
- 'is_public',
43
- 'name',
44
- )
45
-
46
- def setUp(self):
47
- super().setUp()
48
-
49
- self.new_volume_type = volume_fakes.create_one_volume_type(
50
- methods={'set_keys': {'myprop': 'myvalue'}},
51
- )
52
- self.data = (
53
- self.new_volume_type.description,
54
- self.new_volume_type.id,
55
- True,
56
- self.new_volume_type.name,
57
- )
58
-
59
- self.types_mock.create.return_value = self.new_volume_type
60
- # Get the command object to test
61
- self.cmd = volume_type.CreateVolumeType(self.app, None)
62
-
63
- def test_type_create(self):
64
- arglist = [
65
- self.new_volume_type.name,
66
- ]
67
- verifylist = [
68
- ("name", self.new_volume_type.name),
69
- ]
70
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
71
-
72
- columns, data = self.cmd.take_action(parsed_args)
73
- self.types_mock.create.assert_called_with(
74
- self.new_volume_type.name,
75
- )
76
-
77
- self.assertEqual(self.columns, columns)
78
- self.assertCountEqual(self.data, data)
79
-
80
- def test_type_create_with_encryption(self):
81
- encryption_info = {
82
- 'provider': 'LuksEncryptor',
83
- 'cipher': 'aes-xts-plain64',
84
- 'key_size': '128',
85
- 'control_location': 'front-end',
86
- }
87
- encryption_type = volume_fakes.create_one_encryption_volume_type(
88
- attrs=encryption_info,
89
- )
90
- self.new_volume_type = volume_fakes.create_one_volume_type(
91
- attrs={'encryption': encryption_info},
92
- )
93
- self.types_mock.create.return_value = self.new_volume_type
94
- self.encryption_types_mock.create.return_value = encryption_type
95
- encryption_columns = (
96
- 'description',
97
- 'encryption',
98
- 'id',
99
- 'is_public',
100
- 'name',
101
- )
102
- encryption_data = (
103
- self.new_volume_type.description,
104
- format_columns.DictColumn(encryption_info),
105
- self.new_volume_type.id,
106
- True,
107
- self.new_volume_type.name,
108
- )
109
- arglist = [
110
- '--encryption-provider',
111
- 'LuksEncryptor',
112
- '--encryption-cipher',
113
- 'aes-xts-plain64',
114
- '--encryption-key-size',
115
- '128',
116
- '--encryption-control-location',
117
- 'front-end',
118
- self.new_volume_type.name,
119
- ]
120
- verifylist = [
121
- ('encryption_provider', 'LuksEncryptor'),
122
- ('encryption_cipher', 'aes-xts-plain64'),
123
- ('encryption_key_size', 128),
124
- ('encryption_control_location', 'front-end'),
125
- ('name', self.new_volume_type.name),
126
- ]
127
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
128
-
129
- columns, data = self.cmd.take_action(parsed_args)
130
- self.types_mock.create.assert_called_with(
131
- self.new_volume_type.name,
132
- )
133
- body = {
134
- 'provider': 'LuksEncryptor',
135
- 'cipher': 'aes-xts-plain64',
136
- 'key_size': 128,
137
- 'control_location': 'front-end',
138
- }
139
- self.encryption_types_mock.create.assert_called_with(
140
- self.new_volume_type,
141
- body,
142
- )
143
- self.assertEqual(encryption_columns, columns)
144
- self.assertCountEqual(encryption_data, data)
145
-
146
-
147
- class TestTypeDelete(TestType):
148
- volume_types = volume_fakes.create_volume_types(count=2)
149
-
150
- def setUp(self):
151
- super().setUp()
152
-
153
- self.types_mock.get = volume_fakes.get_volume_types(self.volume_types)
154
- self.types_mock.delete.return_value = None
155
-
156
- # Get the command object to mock
157
- self.cmd = volume_type.DeleteVolumeType(self.app, None)
158
-
159
- def test_type_delete(self):
160
- arglist = [self.volume_types[0].id]
161
- verifylist = [("volume_types", [self.volume_types[0].id])]
162
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
163
-
164
- result = self.cmd.take_action(parsed_args)
165
-
166
- self.types_mock.delete.assert_called_with(self.volume_types[0])
167
- self.assertIsNone(result)
168
-
169
- def test_delete_multiple_types(self):
170
- arglist = []
171
- for t in self.volume_types:
172
- arglist.append(t.id)
173
- verifylist = [
174
- ('volume_types', arglist),
175
- ]
176
-
177
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
178
- result = self.cmd.take_action(parsed_args)
179
-
180
- calls = []
181
- for t in self.volume_types:
182
- calls.append(call(t))
183
- self.types_mock.delete.assert_has_calls(calls)
184
- self.assertIsNone(result)
185
-
186
- def test_delete_multiple_types_with_exception(self):
187
- arglist = [
188
- self.volume_types[0].id,
189
- 'unexist_type',
190
- ]
191
- verifylist = [
192
- ('volume_types', arglist),
193
- ]
194
-
195
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
196
-
197
- find_mock_result = [self.volume_types[0], exceptions.CommandError]
198
- with mock.patch.object(
199
- utils, 'find_resource', side_effect=find_mock_result
200
- ) as find_mock:
201
- try:
202
- self.cmd.take_action(parsed_args)
203
- self.fail('CommandError should be raised.')
204
- except exceptions.CommandError as e:
205
- self.assertEqual(
206
- '1 of 2 volume types failed to delete.', str(e)
207
- )
208
-
209
- find_mock.assert_any_call(self.types_mock, self.volume_types[0].id)
210
- find_mock.assert_any_call(self.types_mock, 'unexist_type')
211
-
212
- self.assertEqual(2, find_mock.call_count)
213
- self.types_mock.delete.assert_called_once_with(
214
- self.volume_types[0]
215
- )
216
-
217
-
218
- class TestTypeList(TestType):
219
- volume_types = volume_fakes.create_volume_types()
220
-
221
- columns = [
222
- "ID",
223
- "Name",
224
- "Is Public",
225
- ]
226
- columns_long = ["ID", "Name", "Is Public", "Properties"]
227
-
228
- data = []
229
- for t in volume_types:
230
- data.append(
231
- (
232
- t.id,
233
- t.name,
234
- t.is_public,
235
- )
236
- )
237
- data_long = []
238
- for t in volume_types:
239
- data_long.append(
240
- (
241
- t.id,
242
- t.name,
243
- t.is_public,
244
- format_columns.DictColumn(t.extra_specs),
245
- )
246
- )
247
-
248
- def setUp(self):
249
- super().setUp()
250
-
251
- self.types_mock.list.return_value = self.volume_types
252
- self.encryption_types_mock.create.return_value = None
253
- self.encryption_types_mock.update.return_value = None
254
- # get the command to test
255
- self.cmd = volume_type.ListVolumeType(self.app, None)
256
-
257
- def test_type_list_without_options(self):
258
- arglist = []
259
- verifylist = [
260
- ("long", False),
261
- ("encryption_type", False),
262
- ]
263
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
264
-
265
- columns, data = self.cmd.take_action(parsed_args)
266
- self.types_mock.list.assert_called_once_with()
267
- self.assertEqual(self.columns, columns)
268
- self.assertCountEqual(self.data, list(data))
269
-
270
- def test_type_list_with_options(self):
271
- arglist = [
272
- "--long",
273
- ]
274
- verifylist = [
275
- ("long", True),
276
- ]
277
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
278
-
279
- columns, data = self.cmd.take_action(parsed_args)
280
- self.types_mock.list.assert_called_once_with()
281
- self.assertEqual(self.columns_long, columns)
282
- self.assertCountEqual(self.data_long, list(data))
283
-
284
- def test_type_list_with_encryption(self):
285
- encryption_type = volume_fakes.create_one_encryption_volume_type(
286
- attrs={'volume_type_id': self.volume_types[0].id},
287
- )
288
- encryption_info = {
289
- 'provider': 'LuksEncryptor',
290
- 'cipher': None,
291
- 'key_size': None,
292
- 'control_location': 'front-end',
293
- }
294
- encryption_columns = self.columns + [
295
- "Encryption",
296
- ]
297
- encryption_data = []
298
- encryption_data.append(
299
- (
300
- self.volume_types[0].id,
301
- self.volume_types[0].name,
302
- self.volume_types[0].is_public,
303
- volume_type.EncryptionInfoColumn(
304
- self.volume_types[0].id,
305
- {self.volume_types[0].id: encryption_info},
306
- ),
307
- )
308
- )
309
- encryption_data.append(
310
- (
311
- self.volume_types[1].id,
312
- self.volume_types[1].name,
313
- self.volume_types[1].is_public,
314
- volume_type.EncryptionInfoColumn(self.volume_types[1].id, {}),
315
- )
316
- )
317
-
318
- self.encryption_types_mock.list.return_value = [encryption_type]
319
- arglist = [
320
- "--encryption-type",
321
- ]
322
- verifylist = [
323
- ("encryption_type", True),
324
- ]
325
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
326
-
327
- columns, data = self.cmd.take_action(parsed_args)
328
- self.encryption_types_mock.list.assert_called_once_with()
329
- self.types_mock.list.assert_called_once_with()
330
- self.assertEqual(encryption_columns, columns)
331
- self.assertCountEqual(encryption_data, list(data))
332
-
333
-
334
- class TestTypeSet(TestType):
335
- volume_type = volume_fakes.create_one_volume_type(
336
- methods={'set_keys': None},
337
- )
338
-
339
- def setUp(self):
340
- super().setUp()
341
-
342
- self.types_mock.get.return_value = self.volume_type
343
-
344
- # Get the command object to test
345
- self.cmd = volume_type.SetVolumeType(self.app, None)
346
-
347
- def test_type_set_nothing(self):
348
- arglist = [
349
- self.volume_type.id,
350
- ]
351
- verifylist = [
352
- ('volume_type', self.volume_type.id),
353
- ]
354
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
355
-
356
- result = self.cmd.take_action(parsed_args)
357
-
358
- self.assertIsNone(result)
359
-
360
- def test_type_set_property(self):
361
- arglist = [
362
- '--property',
363
- 'myprop=myvalue',
364
- self.volume_type.id,
365
- ]
366
- verifylist = [
367
- ('property', {'myprop': 'myvalue'}),
368
- ('volume_type', self.volume_type.id),
369
- ]
370
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
371
-
372
- result = self.cmd.take_action(parsed_args)
373
- self.volume_type.set_keys.assert_called_once_with(
374
- {'myprop': 'myvalue'}
375
- )
376
- self.assertIsNone(result)
377
-
378
- def test_type_set_new_encryption(self):
379
- arglist = [
380
- '--encryption-provider',
381
- 'LuksEncryptor',
382
- '--encryption-cipher',
383
- 'aes-xts-plain64',
384
- '--encryption-key-size',
385
- '128',
386
- '--encryption-control-location',
387
- 'front-end',
388
- self.volume_type.id,
389
- ]
390
- verifylist = [
391
- ('encryption_provider', 'LuksEncryptor'),
392
- ('encryption_cipher', 'aes-xts-plain64'),
393
- ('encryption_key_size', 128),
394
- ('encryption_control_location', 'front-end'),
395
- ('volume_type', self.volume_type.id),
396
- ]
397
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
398
-
399
- result = self.cmd.take_action(parsed_args)
400
- body = {
401
- 'provider': 'LuksEncryptor',
402
- 'cipher': 'aes-xts-plain64',
403
- 'key_size': 128,
404
- 'control_location': 'front-end',
405
- }
406
- self.encryption_types_mock.create.assert_called_with(
407
- self.volume_type,
408
- body,
409
- )
410
- self.assertIsNone(result)
411
-
412
- def test_type_set_new_encryption_without_provider(self):
413
- arglist = [
414
- '--encryption-cipher',
415
- 'aes-xts-plain64',
416
- '--encryption-key-size',
417
- '128',
418
- '--encryption-control-location',
419
- 'front-end',
420
- self.volume_type.id,
421
- ]
422
- verifylist = [
423
- ('encryption_cipher', 'aes-xts-plain64'),
424
- ('encryption_key_size', 128),
425
- ('encryption_control_location', 'front-end'),
426
- ('volume_type', self.volume_type.id),
427
- ]
428
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
429
- try:
430
- self.cmd.take_action(parsed_args)
431
- self.fail('CommandError should be raised.')
432
- except exceptions.CommandError as e:
433
- self.assertEqual(
434
- "Command Failed: One or more of" " the operations failed",
435
- str(e),
436
- )
437
- self.encryption_types_mock.create.assert_not_called()
438
- self.encryption_types_mock.update.assert_not_called()
439
-
440
-
441
- class TestTypeShow(TestType):
442
- columns = (
443
- 'description',
444
- 'id',
445
- 'is_public',
446
- 'name',
447
- 'properties',
448
- )
449
-
450
- def setUp(self):
451
- super().setUp()
452
-
453
- self.volume_type = volume_fakes.create_one_volume_type()
454
- self.data = (
455
- self.volume_type.description,
456
- self.volume_type.id,
457
- True,
458
- self.volume_type.name,
459
- format_columns.DictColumn(self.volume_type.extra_specs),
460
- )
461
-
462
- self.types_mock.get.return_value = self.volume_type
463
-
464
- # Get the command object to test
465
- self.cmd = volume_type.ShowVolumeType(self.app, None)
466
-
467
- def test_type_show(self):
468
- arglist = [self.volume_type.id]
469
- verifylist = [
470
- ("volume_type", self.volume_type.id),
471
- ("encryption_type", False),
472
- ]
473
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
474
-
475
- columns, data = self.cmd.take_action(parsed_args)
476
- self.types_mock.get.assert_called_with(self.volume_type.id)
477
-
478
- self.assertEqual(self.columns, columns)
479
- self.assertCountEqual(self.data, data)
480
-
481
- def test_type_show_with_encryption(self):
482
- encryption_type = volume_fakes.create_one_encryption_volume_type()
483
- encryption_info = {
484
- 'provider': 'LuksEncryptor',
485
- 'cipher': None,
486
- 'key_size': None,
487
- 'control_location': 'front-end',
488
- }
489
- self.volume_type = volume_fakes.create_one_volume_type(
490
- attrs={'encryption': encryption_info},
491
- )
492
- self.types_mock.get.return_value = self.volume_type
493
- self.encryption_types_mock.get.return_value = encryption_type
494
- encryption_columns = (
495
- 'description',
496
- 'encryption',
497
- 'id',
498
- 'is_public',
499
- 'name',
500
- 'properties',
501
- )
502
- encryption_data = (
503
- self.volume_type.description,
504
- format_columns.DictColumn(encryption_info),
505
- self.volume_type.id,
506
- True,
507
- self.volume_type.name,
508
- format_columns.DictColumn(self.volume_type.extra_specs),
509
- )
510
- arglist = ['--encryption-type', self.volume_type.id]
511
- verifylist = [
512
- ('encryption_type', True),
513
- ("volume_type", self.volume_type.id),
514
- ]
515
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
516
-
517
- columns, data = self.cmd.take_action(parsed_args)
518
- self.types_mock.get.assert_called_with(self.volume_type.id)
519
- self.encryption_types_mock.get.assert_called_with(self.volume_type.id)
520
- self.assertEqual(encryption_columns, columns)
521
- self.assertCountEqual(encryption_data, data)
522
-
523
-
524
- class TestTypeUnset(TestType):
525
- volume_type = volume_fakes.create_one_volume_type(
526
- methods={'unset_keys': None},
527
- )
528
-
529
- def setUp(self):
530
- super().setUp()
531
-
532
- self.types_mock.get.return_value = self.volume_type
533
-
534
- # Get the command object to test
535
- self.cmd = volume_type.UnsetVolumeType(self.app, None)
536
-
537
- def test_type_unset_property(self):
538
- arglist = [
539
- '--property',
540
- 'property',
541
- '--property',
542
- 'multi_property',
543
- self.volume_type.id,
544
- ]
545
- verifylist = [
546
- ('encryption_type', False),
547
- ('property', ['property', 'multi_property']),
548
- ('volume_type', self.volume_type.id),
549
- ]
550
-
551
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
552
-
553
- result = self.cmd.take_action(parsed_args)
554
- self.volume_type.unset_keys.assert_called_once_with(
555
- ['property', 'multi_property']
556
- )
557
- self.encryption_types_mock.delete.assert_not_called()
558
- self.assertIsNone(result)
559
-
560
- def test_type_unset_failed_with_missing_volume_type_argument(self):
561
- arglist = [
562
- '--property',
563
- 'property',
564
- '--property',
565
- 'multi_property',
566
- ]
567
- verifylist = [
568
- ('property', ['property', 'multi_property']),
569
- ]
570
-
571
- self.assertRaises(
572
- tests_utils.ParserException,
573
- self.check_parser,
574
- self.cmd,
575
- arglist,
576
- verifylist,
577
- )
578
-
579
- def test_type_unset_nothing(self):
580
- arglist = [
581
- self.volume_type.id,
582
- ]
583
- verifylist = [
584
- ('volume_type', self.volume_type.id),
585
- ]
586
-
587
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
588
-
589
- result = self.cmd.take_action(parsed_args)
590
- self.assertIsNone(result)
591
-
592
- def test_type_unset_encryption_type(self):
593
- arglist = [
594
- '--encryption-type',
595
- self.volume_type.id,
596
- ]
597
- verifylist = [
598
- ('encryption_type', True),
599
- ('volume_type', self.volume_type.id),
600
- ]
601
- parsed_args = self.check_parser(self.cmd, arglist, verifylist)
602
-
603
- result = self.cmd.take_action(parsed_args)
604
- self.encryption_types_mock.delete.assert_called_with(self.volume_type)
605
- self.assertIsNone(result)
606
-
607
-
608
- class TestColumns(TestType):
609
- def test_encryption_info_column_with_info(self):
610
- fake_volume_type = volume_fakes.create_one_volume_type()
611
- type_id = fake_volume_type.id
612
-
613
- encryption_info = {
614
- 'provider': 'LuksEncryptor',
615
- 'cipher': None,
616
- 'key_size': None,
617
- 'control_location': 'front-end',
618
- }
619
- col = volume_type.EncryptionInfoColumn(
620
- type_id, {type_id: encryption_info}
621
- )
622
- self.assertEqual(
623
- utils.format_dict(encryption_info), col.human_readable()
624
- )
625
- self.assertEqual(encryption_info, col.machine_readable())
626
-
627
- def test_encryption_info_column_without_info(self):
628
- fake_volume_type = volume_fakes.create_one_volume_type()
629
- type_id = fake_volume_type.id
630
-
631
- col = volume_type.EncryptionInfoColumn(type_id, {})
632
- self.assertEqual('-', col.human_readable())
633
- self.assertIsNone(col.machine_readable())