python-openstackclient 9.0.0__py3-none-any.whl → 10.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 (284) hide show
  1. openstackclient/__init__.py +2 -6
  2. openstackclient/api/api.py +41 -23
  3. openstackclient/api/compute_v2.py +44 -25
  4. openstackclient/api/object_store_v1.py +75 -97
  5. openstackclient/api/volume_v2.py +2 -1
  6. openstackclient/api/volume_v3.py +2 -1
  7. openstackclient/common/availability_zone.py +58 -42
  8. openstackclient/common/clientmanager.py +56 -29
  9. openstackclient/common/configuration.py +10 -3
  10. openstackclient/common/envvars.py +2 -2
  11. openstackclient/common/extension.py +14 -5
  12. openstackclient/common/limits.py +10 -5
  13. openstackclient/common/module.py +14 -6
  14. openstackclient/common/pagination.py +8 -2
  15. openstackclient/common/progressbar.py +7 -6
  16. openstackclient/common/project_cleanup.py +13 -7
  17. openstackclient/common/quota.py +97 -99
  18. openstackclient/common/versions.py +8 -2
  19. openstackclient/compute/client.py +7 -3
  20. openstackclient/compute/v2/agent.py +17 -10
  21. openstackclient/compute/v2/aggregate.py +36 -22
  22. openstackclient/compute/v2/console.py +14 -8
  23. openstackclient/compute/v2/console_connection.py +11 -3
  24. openstackclient/compute/v2/flavor.py +39 -21
  25. openstackclient/compute/v2/host.py +14 -6
  26. openstackclient/compute/v2/hypervisor.py +14 -5
  27. openstackclient/compute/v2/hypervisor_stats.py +10 -2
  28. openstackclient/compute/v2/keypair.py +29 -14
  29. openstackclient/compute/v2/server.py +249 -169
  30. openstackclient/compute/v2/server_backup.py +10 -4
  31. openstackclient/compute/v2/server_event.py +21 -12
  32. openstackclient/compute/v2/server_group.py +21 -11
  33. openstackclient/compute/v2/server_image.py +19 -10
  34. openstackclient/compute/v2/server_migration.py +24 -10
  35. openstackclient/compute/v2/server_share.py +274 -0
  36. openstackclient/compute/v2/server_volume.py +10 -4
  37. openstackclient/compute/v2/service.py +14 -7
  38. openstackclient/compute/v2/usage.py +26 -21
  39. openstackclient/identity/client.py +8 -3
  40. openstackclient/identity/common.py +78 -47
  41. openstackclient/identity/v2_0/catalog.py +14 -7
  42. openstackclient/identity/v2_0/ec2creds.py +21 -10
  43. openstackclient/identity/v2_0/endpoint.py +23 -11
  44. openstackclient/identity/v2_0/project.py +25 -14
  45. openstackclient/identity/v2_0/role.py +28 -14
  46. openstackclient/identity/v2_0/role_assignment.py +9 -3
  47. openstackclient/identity/v2_0/service.py +23 -11
  48. openstackclient/identity/v2_0/token.py +12 -5
  49. openstackclient/identity/v2_0/user.py +26 -15
  50. openstackclient/identity/v3/access_rule.py +26 -12
  51. openstackclient/identity/v3/application_credential.py +59 -24
  52. openstackclient/identity/v3/catalog.py +14 -7
  53. openstackclient/identity/v3/consumer.py +22 -11
  54. openstackclient/identity/v3/credential.py +36 -16
  55. openstackclient/identity/v3/domain.py +37 -18
  56. openstackclient/identity/v3/ec2creds.py +25 -12
  57. openstackclient/identity/v3/endpoint.py +42 -20
  58. openstackclient/identity/v3/endpoint_group.py +28 -17
  59. openstackclient/identity/v3/federation_protocol.py +38 -16
  60. openstackclient/identity/v3/group.py +55 -32
  61. openstackclient/identity/v3/identity_provider.py +92 -57
  62. openstackclient/identity/v3/implied_role.py +21 -9
  63. openstackclient/identity/v3/limit.py +38 -16
  64. openstackclient/identity/v3/mapping.py +26 -13
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +43 -23
  67. openstackclient/identity/v3/region.py +36 -16
  68. openstackclient/identity/v3/registered_limit.py +40 -16
  69. openstackclient/identity/v3/role.py +61 -31
  70. openstackclient/identity/v3/role_assignment.py +23 -6
  71. openstackclient/identity/v3/service.py +36 -16
  72. openstackclient/identity/v3/service_provider.py +37 -15
  73. openstackclient/identity/v3/tag.py +23 -6
  74. openstackclient/identity/v3/token.py +30 -14
  75. openstackclient/identity/v3/trust.py +32 -14
  76. openstackclient/identity/v3/unscoped_saml.py +10 -2
  77. openstackclient/identity/v3/user.py +49 -26
  78. openstackclient/image/client.py +7 -3
  79. openstackclient/image/v1/image.py +33 -26
  80. openstackclient/image/v2/cache.py +14 -9
  81. openstackclient/image/v2/image.py +74 -48
  82. openstackclient/image/v2/info.py +7 -1
  83. openstackclient/image/v2/metadef_namespaces.py +109 -13
  84. openstackclient/image/v2/metadef_objects.py +28 -15
  85. openstackclient/image/v2/metadef_properties.py +24 -13
  86. openstackclient/image/v2/metadef_resource_type_association.py +14 -7
  87. openstackclient/image/v2/metadef_resource_types.py +7 -1
  88. openstackclient/image/v2/task.py +15 -6
  89. openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +7 -192
  90. openstackclient/network/client.py +7 -2
  91. openstackclient/network/common.py +16 -241
  92. openstackclient/network/utils.py +36 -22
  93. openstackclient/network/v2/address_group.py +27 -16
  94. openstackclient/network/v2/address_scope.py +24 -13
  95. openstackclient/network/v2/bgpvpn/bgpvpn.py +463 -0
  96. openstackclient/network/v2/bgpvpn/constants.py +30 -0
  97. openstackclient/network/v2/bgpvpn/network_association.py +214 -0
  98. openstackclient/network/v2/bgpvpn/port_association.py +490 -0
  99. openstackclient/network/v2/bgpvpn/router_association.py +288 -0
  100. openstackclient/network/v2/default_security_group_rule.py +19 -10
  101. openstackclient/network/v2/floating_ip.py +110 -159
  102. openstackclient/network/v2/floating_ip_port_forwarding.py +30 -18
  103. openstackclient/network/v2/fwaas/__init__.py +0 -0
  104. openstackclient/network/v2/fwaas/group.py +466 -0
  105. openstackclient/network/v2/fwaas/policy.py +518 -0
  106. openstackclient/network/v2/fwaas/rule.py +574 -0
  107. openstackclient/network/v2/ip_availability.py +13 -5
  108. openstackclient/network/v2/l3_conntrack_helper.py +22 -13
  109. openstackclient/network/v2/local_ip.py +24 -13
  110. openstackclient/network/v2/local_ip_association.py +14 -7
  111. openstackclient/network/v2/ndp_proxy.py +20 -11
  112. openstackclient/network/v2/network.py +129 -196
  113. openstackclient/network/v2/network_agent.py +46 -25
  114. openstackclient/network/v2/network_auto_allocated_topology.py +22 -11
  115. openstackclient/network/v2/network_flavor.py +27 -16
  116. openstackclient/network/v2/network_flavor_profile.py +23 -12
  117. openstackclient/network/v2/network_meter.py +21 -10
  118. openstackclient/network/v2/network_meter_rule.py +21 -11
  119. openstackclient/network/v2/network_qos_policy.py +25 -15
  120. openstackclient/network/v2/network_qos_rule.py +32 -17
  121. openstackclient/network/v2/network_qos_rule_type.py +13 -5
  122. openstackclient/network/v2/network_rbac.py +23 -12
  123. openstackclient/network/v2/network_segment.py +20 -11
  124. openstackclient/network/v2/network_segment_range.py +56 -29
  125. openstackclient/network/v2/network_service_provider.py +7 -1
  126. openstackclient/network/v2/network_trunk.py +38 -22
  127. openstackclient/network/v2/port.py +54 -29
  128. openstackclient/network/v2/router.py +75 -52
  129. openstackclient/network/v2/security_group.py +87 -157
  130. openstackclient/network/v2/security_group_rule.py +100 -280
  131. openstackclient/network/v2/subnet.py +49 -28
  132. openstackclient/network/v2/subnet_pool.py +30 -17
  133. openstackclient/network/v2/taas/tap_flow.py +22 -11
  134. openstackclient/network/v2/taas/tap_mirror.py +22 -11
  135. openstackclient/network/v2/taas/tap_service.py +23 -12
  136. openstackclient/object/client.py +7 -2
  137. openstackclient/object/v1/account.py +13 -6
  138. openstackclient/object/v1/container.py +25 -15
  139. openstackclient/object/v1/object.py +25 -15
  140. openstackclient/py.typed +0 -0
  141. openstackclient/shell.py +46 -10
  142. openstackclient/tests/functional/base.py +55 -20
  143. openstackclient/tests/functional/common/test_extension.py +4 -0
  144. openstackclient/tests/functional/common/test_quota.py +3 -1
  145. openstackclient/tests/functional/compute/v2/common.py +14 -13
  146. openstackclient/tests/functional/compute/v2/test_flavor.py +3 -1
  147. openstackclient/tests/functional/compute/v2/test_server.py +3 -0
  148. openstackclient/tests/functional/identity/v2/common.py +10 -6
  149. openstackclient/tests/functional/identity/v2/test_role.py +4 -4
  150. openstackclient/tests/functional/identity/v3/common.py +25 -19
  151. openstackclient/tests/functional/identity/v3/test_group.py +20 -20
  152. openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
  153. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  154. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  155. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  156. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  157. openstackclient/tests/functional/image/base.py +1 -6
  158. openstackclient/tests/functional/network/v2/common.py +5 -2
  159. openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
  160. openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
  161. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
  162. openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
  163. openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
  164. openstackclient/tests/functional/object/v1/common.py +4 -0
  165. openstackclient/tests/functional/volume/v2/common.py +4 -0
  166. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
  167. openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
  168. openstackclient/tests/functional/volume/v3/common.py +4 -0
  169. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +11 -7
  170. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  171. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  172. openstackclient/tests/unit/common/test_extension.py +2 -2
  173. openstackclient/tests/unit/common/test_module.py +12 -7
  174. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  175. openstackclient/tests/unit/common/test_quota.py +6 -26
  176. openstackclient/tests/unit/compute/v2/fakes.py +25 -0
  177. openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
  178. openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
  179. openstackclient/tests/unit/compute/v2/test_server.py +11 -96
  180. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  181. openstackclient/tests/unit/identity/v3/fakes.py +3 -0
  182. openstackclient/tests/unit/identity/v3/test_group.py +4 -14
  183. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  184. openstackclient/tests/unit/identity/v3/test_user.py +4 -4
  185. openstackclient/tests/unit/image/v2/test_image.py +11 -11
  186. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  187. openstackclient/tests/unit/network/test_common.py +0 -155
  188. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  189. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  190. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  191. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  192. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  193. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  194. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  195. openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
  196. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  197. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
  198. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  199. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  200. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  201. openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
  202. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
  203. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
  204. openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
  205. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  206. openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
  207. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
  208. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  209. openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
  210. openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
  211. openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
  212. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  213. openstackclient/tests/unit/network/v2/test_router.py +8 -9
  214. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
  215. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
  216. openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
  217. openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
  218. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  219. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  220. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  221. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  222. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  223. openstackclient/tests/unit/test_hacking.py +108 -0
  224. openstackclient/tests/unit/volume/v2/fakes.py +1 -0
  225. openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
  226. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
  227. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  228. openstackclient/tests/unit/volume/v3/fakes.py +1 -0
  229. openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
  230. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  231. openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
  232. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
  233. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  234. openstackclient/volume/client.py +7 -3
  235. openstackclient/volume/v2/backup_record.py +15 -6
  236. openstackclient/volume/v2/consistency_group.py +29 -17
  237. openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
  238. openstackclient/volume/v2/qos_specs.py +28 -17
  239. openstackclient/volume/v2/service.py +17 -6
  240. openstackclient/volume/v2/volume.py +57 -29
  241. openstackclient/volume/v2/volume_backend.py +19 -6
  242. openstackclient/volume/v2/volume_backup.py +46 -20
  243. openstackclient/volume/v2/volume_host.py +6 -4
  244. openstackclient/volume/v2/volume_snapshot.py +50 -24
  245. openstackclient/volume/v2/volume_transfer_request.py +31 -13
  246. openstackclient/volume/v2/volume_type.py +43 -24
  247. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  248. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  249. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  250. openstackclient/volume/v3/block_storage_manage.py +10 -4
  251. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  252. openstackclient/volume/v3/service.py +16 -6
  253. openstackclient/volume/v3/volume.py +89 -39
  254. openstackclient/volume/v3/volume_attachment.py +43 -21
  255. openstackclient/volume/v3/volume_backup.py +53 -24
  256. openstackclient/volume/v3/volume_group.py +23 -13
  257. openstackclient/volume/v3/volume_group_snapshot.py +32 -13
  258. openstackclient/volume/v3/volume_group_type.py +26 -13
  259. openstackclient/volume/v3/volume_message.py +15 -7
  260. openstackclient/volume/v3/volume_snapshot.py +69 -32
  261. openstackclient/volume/v3/volume_transfer_request.py +31 -13
  262. openstackclient/volume/v3/volume_type.py +42 -24
  263. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
  264. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +271 -260
  265. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
  266. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
  267. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +4 -0
  268. python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
  269. openstackclient/api/image_v1.py +0 -69
  270. openstackclient/api/image_v2.py +0 -79
  271. openstackclient/network/v2/floating_ip_pool.py +0 -38
  272. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  273. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  274. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  275. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  276. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  277. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  278. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  279. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  280. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  281. python_openstackclient-9.0.0.dist-info/pbr.json +0 -1
  282. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  283. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
  284. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
@@ -14,29 +14,12 @@
14
14
  #
15
15
 
16
16
  import copy
17
- from unittest import mock
18
17
 
19
- from openstackclient.api import object_store_v1 as object_store
20
18
  from openstackclient.object.v1 import object as obj
21
19
  from openstackclient.tests.unit.object.v1 import fakes as object_fakes
22
20
 
23
21
 
24
- AUTH_TOKEN = "foobar"
25
- AUTH_URL = "http://0.0.0.0"
26
-
27
-
28
- class TestObject(object_fakes.TestObjectv1):
29
- def setUp(self):
30
- super().setUp()
31
- self.app.client_manager.object_store = object_store.APIv1(
32
- session=mock.Mock(),
33
- service_type="object-store",
34
- )
35
- self.api = self.app.client_manager.object_store
36
-
37
-
38
- @mock.patch('openstackclient.api.object_store_v1.APIv1.object_list')
39
- class TestObjectList(TestObject):
22
+ class TestObjectList(object_fakes.TestObjectV1):
40
23
  columns = ('Name',)
41
24
  datalist = ((object_fakes.object_name_2,),)
42
25
 
@@ -46,8 +29,8 @@ class TestObjectList(TestObject):
46
29
  # Get the command object to test
47
30
  self.cmd = obj.ListObject(self.app, None)
48
31
 
49
- def test_object_list_objects_no_options(self, o_mock):
50
- o_mock.return_value = [
32
+ def test_object_list_objects_no_options(self):
33
+ self.object_store_client.object_list.return_value = [
51
34
  copy.deepcopy(object_fakes.OBJECT),
52
35
  copy.deepcopy(object_fakes.OBJECT_2),
53
36
  ]
@@ -65,7 +48,7 @@ class TestObjectList(TestObject):
65
48
  # containing the data to be listed.
66
49
  columns, data = self.cmd.take_action(parsed_args)
67
50
 
68
- o_mock.assert_called_with(
51
+ self.object_store_client.object_list.assert_called_with(
69
52
  container=object_fakes.container_name,
70
53
  )
71
54
 
@@ -76,8 +59,8 @@ class TestObjectList(TestObject):
76
59
  )
77
60
  self.assertEqual(datalist, tuple(data))
78
61
 
79
- def test_object_list_objects_prefix(self, o_mock):
80
- o_mock.return_value = [
62
+ def test_object_list_objects_prefix(self):
63
+ self.object_store_client.object_list.return_value = [
81
64
  copy.deepcopy(object_fakes.OBJECT_2),
82
65
  ]
83
66
 
@@ -97,19 +80,16 @@ class TestObjectList(TestObject):
97
80
  # containing the data to be listed.
98
81
  columns, data = self.cmd.take_action(parsed_args)
99
82
 
100
- # Set expected values
101
- kwargs = {
102
- 'prefix': 'floppy',
103
- }
104
- o_mock.assert_called_with(
105
- container=object_fakes.container_name_2, **kwargs
83
+ self.object_store_client.object_list.assert_called_with(
84
+ container=object_fakes.container_name_2,
85
+ prefix='floppy',
106
86
  )
107
87
 
108
88
  self.assertEqual(self.columns, columns)
109
89
  self.assertEqual(self.datalist, tuple(data))
110
90
 
111
- def test_object_list_objects_delimiter(self, o_mock):
112
- o_mock.return_value = [
91
+ def test_object_list_objects_delimiter(self):
92
+ self.object_store_client.object_list.return_value = [
113
93
  copy.deepcopy(object_fakes.OBJECT_2),
114
94
  ]
115
95
 
@@ -129,19 +109,16 @@ class TestObjectList(TestObject):
129
109
  # containing the data to be listed.
130
110
  columns, data = self.cmd.take_action(parsed_args)
131
111
 
132
- # Set expected values
133
- kwargs = {
134
- 'delimiter': '=',
135
- }
136
- o_mock.assert_called_with(
137
- container=object_fakes.container_name_2, **kwargs
112
+ self.object_store_client.object_list.assert_called_with(
113
+ container=object_fakes.container_name_2,
114
+ delimiter='=',
138
115
  )
139
116
 
140
117
  self.assertEqual(self.columns, columns)
141
118
  self.assertEqual(self.datalist, tuple(data))
142
119
 
143
- def test_object_list_objects_marker(self, o_mock):
144
- o_mock.return_value = [
120
+ def test_object_list_objects_marker(self):
121
+ self.object_store_client.object_list.return_value = [
145
122
  copy.deepcopy(object_fakes.OBJECT_2),
146
123
  ]
147
124
 
@@ -161,19 +138,16 @@ class TestObjectList(TestObject):
161
138
  # containing the data to be listed.
162
139
  columns, data = self.cmd.take_action(parsed_args)
163
140
 
164
- # Set expected values
165
- kwargs = {
166
- 'marker': object_fakes.object_name_2,
167
- }
168
- o_mock.assert_called_with(
169
- container=object_fakes.container_name_2, **kwargs
141
+ self.object_store_client.object_list.assert_called_with(
142
+ container=object_fakes.container_name_2,
143
+ marker=object_fakes.object_name_2,
170
144
  )
171
145
 
172
146
  self.assertEqual(self.columns, columns)
173
147
  self.assertEqual(self.datalist, tuple(data))
174
148
 
175
- def test_object_list_objects_end_marker(self, o_mock):
176
- o_mock.return_value = [
149
+ def test_object_list_objects_end_marker(self):
150
+ self.object_store_client.object_list.return_value = [
177
151
  copy.deepcopy(object_fakes.OBJECT_2),
178
152
  ]
179
153
 
@@ -193,19 +167,16 @@ class TestObjectList(TestObject):
193
167
  # containing the data to be listed.
194
168
  columns, data = self.cmd.take_action(parsed_args)
195
169
 
196
- # Set expected values
197
- kwargs = {
198
- 'end_marker': object_fakes.object_name_2,
199
- }
200
- o_mock.assert_called_with(
201
- container=object_fakes.container_name_2, **kwargs
170
+ self.object_store_client.object_list.assert_called_with(
171
+ container=object_fakes.container_name_2,
172
+ end_marker=object_fakes.object_name_2,
202
173
  )
203
174
 
204
175
  self.assertEqual(self.columns, columns)
205
176
  self.assertEqual(self.datalist, tuple(data))
206
177
 
207
- def test_object_list_objects_limit(self, o_mock):
208
- o_mock.return_value = [
178
+ def test_object_list_objects_limit(self):
179
+ self.object_store_client.object_list.return_value = [
209
180
  copy.deepcopy(object_fakes.OBJECT_2),
210
181
  ]
211
182
 
@@ -225,19 +196,16 @@ class TestObjectList(TestObject):
225
196
  # containing the data to be listed.
226
197
  columns, data = self.cmd.take_action(parsed_args)
227
198
 
228
- # Set expected values
229
- kwargs = {
230
- 'limit': 2,
231
- }
232
- o_mock.assert_called_with(
233
- container=object_fakes.container_name_2, **kwargs
199
+ self.object_store_client.object_list.assert_called_with(
200
+ container=object_fakes.container_name_2,
201
+ limit=2,
234
202
  )
235
203
 
236
204
  self.assertEqual(self.columns, columns)
237
205
  self.assertEqual(self.datalist, tuple(data))
238
206
 
239
- def test_object_list_objects_long(self, o_mock):
240
- o_mock.return_value = [
207
+ def test_object_list_objects_long(self):
208
+ self.object_store_client.object_list.return_value = [
241
209
  copy.deepcopy(object_fakes.OBJECT),
242
210
  copy.deepcopy(object_fakes.OBJECT_2),
243
211
  ]
@@ -257,10 +225,8 @@ class TestObjectList(TestObject):
257
225
  # containing the data to be listed.
258
226
  columns, data = self.cmd.take_action(parsed_args)
259
227
 
260
- # Set expected values
261
- kwargs = {}
262
- o_mock.assert_called_with(
263
- container=object_fakes.container_name, **kwargs
228
+ self.object_store_client.object_list.assert_called_with(
229
+ container=object_fakes.container_name,
264
230
  )
265
231
 
266
232
  collist = ('Name', 'Bytes', 'Hash', 'Content Type', 'Last Modified')
@@ -283,8 +249,8 @@ class TestObjectList(TestObject):
283
249
  )
284
250
  self.assertEqual(datalist, tuple(data))
285
251
 
286
- def test_object_list_objects_all(self, o_mock):
287
- o_mock.return_value = [
252
+ def test_object_list_objects_all(self):
253
+ self.object_store_client.object_list.return_value = [
288
254
  copy.deepcopy(object_fakes.OBJECT),
289
255
  copy.deepcopy(object_fakes.OBJECT_2),
290
256
  ]
@@ -304,12 +270,9 @@ class TestObjectList(TestObject):
304
270
  # containing the data to be listed.
305
271
  columns, data = self.cmd.take_action(parsed_args)
306
272
 
307
- # Set expected values
308
- kwargs = {
309
- 'full_listing': True,
310
- }
311
- o_mock.assert_called_with(
312
- container=object_fakes.container_name, **kwargs
273
+ self.object_store_client.object_list.assert_called_with(
274
+ container=object_fakes.container_name,
275
+ full_listing=True,
313
276
  )
314
277
 
315
278
  self.assertEqual(self.columns, columns)
@@ -320,16 +283,17 @@ class TestObjectList(TestObject):
320
283
  self.assertEqual(datalist, tuple(data))
321
284
 
322
285
 
323
- @mock.patch('openstackclient.api.object_store_v1.APIv1.object_show')
324
- class TestObjectShow(TestObject):
286
+ class TestObjectShow(object_fakes.TestObjectV1):
325
287
  def setUp(self):
326
288
  super().setUp()
327
289
 
328
290
  # Get the command object to test
329
291
  self.cmd = obj.ShowObject(self.app, None)
330
292
 
331
- def test_object_show(self, c_mock):
332
- c_mock.return_value = copy.deepcopy(object_fakes.OBJECT)
293
+ def test_object_show(self):
294
+ self.object_store_client.object_show.return_value = copy.deepcopy(
295
+ object_fakes.OBJECT
296
+ )
333
297
 
334
298
  arglist = [
335
299
  object_fakes.container_name,
@@ -346,13 +310,9 @@ class TestObjectShow(TestObject):
346
310
  # data to be shown.
347
311
  columns, data = self.cmd.take_action(parsed_args)
348
312
 
349
- # Set expected values
350
- kwargs = {}
351
- # lib.container.show_container(api, url, container)
352
- c_mock.assert_called_with(
313
+ self.object_store_client.object_show.assert_called_with(
353
314
  container=object_fakes.container_name,
354
315
  object=object_fakes.object_name_1,
355
- **kwargs,
356
316
  )
357
317
 
358
318
  collist = ('bytes', 'content_type', 'hash', 'last_modified', 'name')
@@ -15,18 +15,25 @@ import copy
15
15
  import io
16
16
  from unittest import mock
17
17
 
18
+ from keystoneauth1 import session
18
19
  from osc_lib import exceptions
19
20
  from requests_mock.contrib import fixture
20
21
 
22
+ from openstackclient.api import object_store_v1 as object_store
21
23
  from openstackclient.object.v1 import object as object_cmds
22
24
  from openstackclient.tests.unit.object.v1 import fakes as object_fakes
23
25
 
24
26
 
25
- class TestObjectAll(object_fakes.TestObjectv1):
27
+ class TestObjectAll(object_fakes.TestObjectV1):
26
28
  def setUp(self):
27
29
  super().setUp()
28
30
 
31
+ # these tests require a "real" client since we mock requests
29
32
  self.requests_mock = self.useFixture(fixture.Fixture())
33
+ self.app.client_manager.object_store = object_store.APIv1(
34
+ session=session.Session(),
35
+ endpoint=object_fakes.ENDPOINT,
36
+ )
30
37
 
31
38
 
32
39
  class TestObjectCreate(TestObjectAll):
@@ -0,0 +1,108 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
2
+ # not use this file except in compliance with the License. You may obtain
3
+ # a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
+ # License for the specific language governing permissions and limitations
11
+ # under the License.
12
+
13
+ import importlib.util
14
+ import os
15
+ import re
16
+ import subprocess
17
+ import sys
18
+ import unittest
19
+
20
+ import fixtures
21
+
22
+ ROOT_DIR = os.path.normpath(
23
+ os.path.join(os.path.dirname(__file__), '..', '..', '..')
24
+ )
25
+ SELFTEST_REGEX = re.compile(r'\b(Okay|[HEW]\d{3}|O\d{3}):\s(.*)')
26
+
27
+ # Checks that filter on 'openstackclient/tests/unit' in the filename need the
28
+ # temp file written into that path structure so the check is not skipped.
29
+ _UNIT_TEST_SUBDIRS = {
30
+ 'O401': os.path.join('openstackclient', 'tests', 'unit'),
31
+ 'O402': os.path.join('openstackclient', 'tests', 'unit'),
32
+ }
33
+
34
+
35
+ def _load_checks():
36
+ spec = importlib.util.spec_from_file_location(
37
+ '_osc_hacking_checks',
38
+ os.path.join(ROOT_DIR, 'hacking', 'checks.py'),
39
+ )
40
+ module = importlib.util.module_from_spec(spec)
41
+ spec.loader.exec_module(module)
42
+ return module
43
+
44
+
45
+ def _get_examples(check):
46
+ for line in check.__doc__.splitlines():
47
+ line = line.lstrip()
48
+ match = SELFTEST_REGEX.match(line)
49
+ if match:
50
+ yield match.group(1), match.group(2)
51
+
52
+
53
+ class HackingTestCase(unittest.TestCase):
54
+ def _test_check(self, code, source):
55
+ lines = [
56
+ part.replace(r'\t', '\t') + '\n' for part in source.split(r'\n')
57
+ ]
58
+ subdir = {
59
+ 'O401': os.path.join('openstackclient', 'tests', 'unit'),
60
+ 'O402': os.path.join('openstackclient', 'tests', 'unit'),
61
+ }.get(code, '')
62
+
63
+ with fixtures.TempDir() as tmp:
64
+ dirpath = os.path.join(tmp.path, subdir) if subdir else tmp.path
65
+ if subdir:
66
+ os.makedirs(dirpath)
67
+
68
+ fpath = os.path.join(dirpath, 'test_tmp.py')
69
+ with open(fpath, 'w') as f:
70
+ f.write(''.join(lines))
71
+
72
+ cmd = [
73
+ sys.executable,
74
+ '-mflake8',
75
+ '--config',
76
+ os.path.join(ROOT_DIR, 'tox.ini'),
77
+ f'--select={code}',
78
+ '--format=%(code)s\t%(path)s\t%(row)d',
79
+ fpath,
80
+ ]
81
+ out, _ = subprocess.Popen(
82
+ cmd, stdout=subprocess.PIPE, cwd=ROOT_DIR
83
+ ).communicate()
84
+ out = out.decode('utf-8')
85
+
86
+ if code == 'Okay':
87
+ self.assertEqual('', out)
88
+ else:
89
+ self.assertNotEqual('', out, f"Failed to trigger rule {code}")
90
+ self.assertEqual(code, out.split('\t')[0].rstrip(':'), out)
91
+
92
+ def test_checks(self):
93
+ checks_module = _load_checks()
94
+
95
+ for name in sorted(dir(checks_module)):
96
+ check = getattr(checks_module, name)
97
+ if not callable(check):
98
+ continue
99
+
100
+ if getattr(check, 'skip_on_py3', None) is not False:
101
+ continue
102
+
103
+ if not check.__doc__:
104
+ continue
105
+
106
+ for code, source in _get_examples(check):
107
+ with self.subTest(check=name, example=source):
108
+ self._test_check(code, source)
@@ -88,6 +88,7 @@ class FakeClientMixin:
88
88
  self.app.client_manager.sdk_connection.volume = mock.Mock(
89
89
  spec=block_storage_v2_proxy.Proxy,
90
90
  )
91
+ self.app.client_manager.sdk_connection.volume.api_version = '2'
91
92
  self.volume_sdk_client = self.app.client_manager.sdk_connection.volume
92
93
  self.set_volume_api_version() # default to the lowest
93
94
 
@@ -220,11 +220,7 @@ class TestBackupList(volume_fakes.TestVolume):
220
220
  'Incremental',
221
221
  'Created At',
222
222
  )
223
- columns_long = columns + (
224
- 'Availability Zone',
225
- 'Volume',
226
- 'Container',
227
- )
223
+ columns_long = (*columns, 'Availability Zone', 'Volume', 'Container')
228
224
 
229
225
  def setUp(self):
230
226
  super().setUp()
@@ -297,7 +297,8 @@ class TestVolumeSnapshotList(volume_fakes.TestVolume):
297
297
  self.project_mock.get.return_value = self.project
298
298
 
299
299
  self.columns = ("ID", "Name", "Description", "Status", "Size")
300
- self.columns_long = self.columns + (
300
+ self.columns_long = (
301
+ *self.columns,
301
302
  "Created At",
302
303
  "Volume",
303
304
  "Properties",
@@ -332,7 +332,7 @@ class TestTypeList(TestType):
332
332
  "Name",
333
333
  "Is Public",
334
334
  ]
335
- columns_long = columns + ["Description"]
335
+ columns_long = [*columns, "Description"]
336
336
  data_with_default_type = [(volume_types[0].id, volume_types[0].name, True)]
337
337
  data = []
338
338
  for t in volume_types:
@@ -436,9 +436,7 @@ class TestTypeList(TestType):
436
436
  'key_size': None,
437
437
  'control_location': 'front-end',
438
438
  }
439
- encryption_columns = self.columns + [
440
- "Encryption",
441
- ]
439
+ encryption_columns = [*self.columns, "Encryption"]
442
440
  encryption_data = []
443
441
  encryption_data.append(
444
442
  (
@@ -96,6 +96,7 @@ class FakeClientMixin:
96
96
  self.app.client_manager.sdk_connection.volume = mock.Mock(
97
97
  spec=_proxy.Proxy,
98
98
  )
99
+ self.app.client_manager.sdk_connection.volume.api_version = '3'
99
100
  self.volume_sdk_client = self.app.client_manager.sdk_connection.volume
100
101
  self.set_volume_api_version() # default to the lowest
101
102
 
@@ -1723,9 +1723,10 @@ class TestVolumeMigrate(volume_fakes.TestVolume):
1723
1723
  host="host@backend-name#pool",
1724
1724
  force_host_copy=False,
1725
1725
  lock_volume=False,
1726
+ cluster=None,
1726
1727
  )
1727
1728
 
1728
- def test_volume_migrate_with_option(self):
1729
+ def test_volume_migrate_with_host(self):
1729
1730
  arglist = [
1730
1731
  "--force-host-copy",
1731
1732
  "--lock-volume",
@@ -1752,9 +1753,66 @@ class TestVolumeMigrate(volume_fakes.TestVolume):
1752
1753
  host="host@backend-name#pool",
1753
1754
  force_host_copy=True,
1754
1755
  lock_volume=True,
1756
+ cluster=None,
1755
1757
  )
1756
1758
 
1757
- def test_volume_migrate_without_host(self):
1759
+ def test_volume_migrate_with_cluster(self):
1760
+ self.set_volume_api_version('3.16')
1761
+ arglist = [
1762
+ "--cluster",
1763
+ "cluster@backend-name#pool",
1764
+ self.volume.id,
1765
+ ]
1766
+ verifylist = [
1767
+ (
1768
+ "cluster",
1769
+ "cluster@backend-name#pool",
1770
+ ),
1771
+ ("volume", self.volume.id),
1772
+ ]
1773
+
1774
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1775
+
1776
+ result = self.cmd.take_action(parsed_args)
1777
+ self.assertIsNone(result)
1778
+
1779
+ self.volume_sdk_client.find_volume.assert_called_with(
1780
+ self.volume.id, ignore_missing=False
1781
+ )
1782
+ self.volume_sdk_client.migrate_volume.assert_called_once_with(
1783
+ self.volume.id,
1784
+ host=None,
1785
+ force_host_copy=False,
1786
+ lock_volume=False,
1787
+ cluster="cluster@backend-name#pool",
1788
+ )
1789
+
1790
+ def test_volume_migrate_with_cluster_pre_v316(self):
1791
+ self.set_volume_api_version('3.15')
1792
+ arglist = [
1793
+ "--cluster",
1794
+ "cluster@backend-name#pool",
1795
+ self.volume.id,
1796
+ ]
1797
+ verifylist = [
1798
+ (
1799
+ "cluster",
1800
+ "cluster@backend-name#pool",
1801
+ ),
1802
+ ("volume", self.volume.id),
1803
+ ]
1804
+
1805
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1806
+
1807
+ self.assertRaises(
1808
+ exceptions.CommandError,
1809
+ self.cmd.take_action,
1810
+ parsed_args,
1811
+ )
1812
+
1813
+ self.volume_sdk_client.migrate_volume.assert_not_called()
1814
+
1815
+ def test_volume_migrate_without_host_and_cluster(self):
1758
1816
  arglist = [
1759
1817
  self.volume.id,
1760
1818
  ]
@@ -1771,7 +1829,6 @@ class TestVolumeMigrate(volume_fakes.TestVolume):
1771
1829
  arglist,
1772
1830
  verifylist,
1773
1831
  )
1774
-
1775
1832
  self.volume_sdk_client.find_volume.assert_not_called()
1776
1833
  self.volume_sdk_client.migrate_volume.assert_not_called()
1777
1834
 
@@ -23,7 +23,7 @@ class TestVolumeAttachment(volume_fakes.TestVolume):
23
23
  def setUp(self):
24
24
  super().setUp()
25
25
 
26
- self.projects_mock = self.app.client_manager.identity.projects
26
+ self.projects_mock = self.identity_client.projects
27
27
 
28
28
 
29
29
  class TestVolumeAttachmentCreate(TestVolumeAttachment):
@@ -319,11 +319,7 @@ class TestBackupList(volume_fakes.TestVolume):
319
319
  'Incremental',
320
320
  'Created At',
321
321
  )
322
- columns_long = columns + (
323
- 'Availability Zone',
324
- 'Volume',
325
- 'Container',
326
- )
322
+ columns_long = (*columns, 'Availability Zone', 'Volume', 'Container')
327
323
 
328
324
  def setUp(self):
329
325
  super().setUp()
@@ -180,6 +180,59 @@ class TestVolumeSnapshotCreate(volume_fakes.TestVolume):
180
180
  )
181
181
  self.volume_sdk_client.create_snapshot.assert_not_called()
182
182
 
183
+ def test_snapshot_create_pre_v366(self):
184
+ self.set_volume_api_version('3.65')
185
+
186
+ arglist = ["--force", self.snapshot.name]
187
+ verifylist = [("force", True), ("snapshot_name", self.snapshot.name)]
188
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
189
+
190
+ self.cmd.take_action(parsed_args)
191
+
192
+ # force parameter should be passed
193
+ self.volume_sdk_client.create_snapshot.assert_called_with(
194
+ volume_id=self.snapshot.volume_id,
195
+ force=True,
196
+ name=self.snapshot.name,
197
+ description=None,
198
+ metadata=None,
199
+ )
200
+
201
+ def test_snapshot_create_v366_or_later(self):
202
+ self.set_volume_api_version('3.66')
203
+
204
+ arglist = [self.snapshot.name]
205
+ verifylist = [("force", False), ("snapshot_name", self.snapshot.name)]
206
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
207
+
208
+ self.cmd.take_action(parsed_args)
209
+
210
+ # force parameter should not be passed, for >=3.66
211
+ self.volume_sdk_client.create_snapshot.assert_called_with(
212
+ volume_id=self.snapshot.volume_id,
213
+ name=self.snapshot.name,
214
+ description=None,
215
+ metadata=None,
216
+ )
217
+
218
+ def test_snapshot_create_v366_or_later_with_force(self):
219
+ """--force should be ignored for microversion >= 3.66."""
220
+ self.set_volume_api_version('3.66')
221
+
222
+ arglist = ["--force", self.snapshot.name]
223
+ verifylist = [("force", True), ("snapshot_name", self.snapshot.name)]
224
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
225
+
226
+ self.cmd.take_action(parsed_args)
227
+
228
+ # passed but ignored
229
+ self.volume_sdk_client.create_snapshot.assert_called_with(
230
+ volume_id=self.snapshot.volume_id,
231
+ name=self.snapshot.name,
232
+ description=None,
233
+ metadata=None,
234
+ )
235
+
183
236
 
184
237
  class TestVolumeSnapshotDelete(volume_fakes.TestVolume):
185
238
  def setUp(self):
@@ -340,7 +393,8 @@ class TestVolumeSnapshotList(volume_fakes.TestVolume):
340
393
  self.project_mock.get.return_value = self.project
341
394
 
342
395
  self.columns = ("ID", "Name", "Description", "Status", "Size")
343
- self.columns_long = self.columns + (
396
+ self.columns_long = (
397
+ *self.columns,
344
398
  "Created At",
345
399
  "Volume",
346
400
  "Properties",
@@ -331,7 +331,7 @@ class TestTypeList(TestType):
331
331
  "Name",
332
332
  "Is Public",
333
333
  ]
334
- columns_long = columns + ["Description", "Properties"]
334
+ columns_long = [*columns, "Description", "Properties"]
335
335
  data_with_default_type = [(volume_types[0].id, volume_types[0].name, True)]
336
336
  data = []
337
337
  for t in volume_types:
@@ -509,9 +509,7 @@ class TestTypeList(TestType):
509
509
  'key_size': None,
510
510
  'control_location': 'front-end',
511
511
  }
512
- encryption_columns = self.columns + [
513
- "Encryption",
514
- ]
512
+ encryption_columns = [*self.columns, "Encryption"]
515
513
  encryption_data = []
516
514
  encryption_data.append(
517
515
  (