python-openstackclient 8.3.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 (292) 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 +126 -114
  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 +251 -171
  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 +103 -41
  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 +26 -12
  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 +71 -50
  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 +115 -92
  64. openstackclient/identity/v3/mapping.py +26 -13
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +211 -122
  67. openstackclient/identity/v3/region.py +36 -16
  68. openstackclient/identity/v3/registered_limit.py +116 -109
  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 -17
  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 +76 -49
  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_limit.py +47 -0
  154. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  155. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  156. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  157. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  158. openstackclient/tests/functional/image/base.py +1 -6
  159. openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
  160. openstackclient/tests/functional/network/v2/common.py +5 -2
  161. openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
  162. openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
  163. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
  164. openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
  165. openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
  166. openstackclient/tests/functional/object/v1/common.py +4 -0
  167. openstackclient/tests/functional/volume/v2/common.py +4 -0
  168. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
  169. openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
  170. openstackclient/tests/functional/volume/v3/common.py +4 -0
  171. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +56 -138
  172. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  173. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  174. openstackclient/tests/unit/common/test_extension.py +2 -2
  175. openstackclient/tests/unit/common/test_module.py +12 -7
  176. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  177. openstackclient/tests/unit/common/test_quota.py +62 -23
  178. openstackclient/tests/unit/compute/v2/fakes.py +25 -0
  179. openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
  180. openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
  181. openstackclient/tests/unit/compute/v2/test_server.py +17 -104
  182. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  183. openstackclient/tests/unit/identity/v3/fakes.py +3 -0
  184. openstackclient/tests/unit/identity/v3/test_group.py +4 -14
  185. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  186. openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
  187. openstackclient/tests/unit/identity/v3/test_project.py +831 -512
  188. openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
  189. openstackclient/tests/unit/identity/v3/test_registered_limit.py +355 -220
  190. openstackclient/tests/unit/identity/v3/test_user.py +4 -4
  191. openstackclient/tests/unit/image/v2/test_image.py +16 -16
  192. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  193. openstackclient/tests/unit/network/test_common.py +0 -155
  194. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  195. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  196. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  197. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  198. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  199. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  200. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  201. openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
  202. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  203. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
  204. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  205. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  206. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  207. openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
  208. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
  209. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
  210. openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
  211. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  212. openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
  213. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
  214. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  215. openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
  216. openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
  217. openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
  218. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  219. openstackclient/tests/unit/network/v2/test_router.py +8 -9
  220. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
  221. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
  222. openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
  223. openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
  224. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  225. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  226. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  227. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  228. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  229. openstackclient/tests/unit/test_hacking.py +108 -0
  230. openstackclient/tests/unit/volume/v2/fakes.py +1 -0
  231. openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
  232. openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
  233. openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
  234. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
  235. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  236. openstackclient/tests/unit/volume/v3/fakes.py +1 -0
  237. openstackclient/tests/unit/volume/v3/test_volume.py +94 -15
  238. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  239. openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
  240. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
  241. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  242. openstackclient/volume/client.py +7 -3
  243. openstackclient/volume/v2/backup_record.py +15 -6
  244. openstackclient/volume/v2/consistency_group.py +37 -25
  245. openstackclient/volume/v2/consistency_group_snapshot.py +27 -12
  246. openstackclient/volume/v2/qos_specs.py +30 -19
  247. openstackclient/volume/v2/service.py +17 -6
  248. openstackclient/volume/v2/volume.py +69 -34
  249. openstackclient/volume/v2/volume_backend.py +19 -6
  250. openstackclient/volume/v2/volume_backup.py +48 -22
  251. openstackclient/volume/v2/volume_host.py +6 -4
  252. openstackclient/volume/v2/volume_snapshot.py +52 -26
  253. openstackclient/volume/v2/volume_transfer_request.py +33 -15
  254. openstackclient/volume/v2/volume_type.py +46 -27
  255. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  256. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  257. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  258. openstackclient/volume/v3/block_storage_manage.py +10 -4
  259. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  260. openstackclient/volume/v3/service.py +16 -6
  261. openstackclient/volume/v3/volume.py +103 -46
  262. openstackclient/volume/v3/volume_attachment.py +43 -21
  263. openstackclient/volume/v3/volume_backup.py +55 -26
  264. openstackclient/volume/v3/volume_group.py +23 -13
  265. openstackclient/volume/v3/volume_group_snapshot.py +32 -13
  266. openstackclient/volume/v3/volume_group_type.py +26 -13
  267. openstackclient/volume/v3/volume_message.py +15 -7
  268. openstackclient/volume/v3/volume_snapshot.py +71 -34
  269. openstackclient/volume/v3/volume_transfer_request.py +33 -15
  270. openstackclient/volume/v3/volume_type.py +45 -27
  271. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
  272. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +279 -267
  273. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
  274. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
  275. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +9 -0
  276. python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
  277. openstackclient/api/image_v1.py +0 -69
  278. openstackclient/api/image_v2.py +0 -79
  279. openstackclient/network/v2/floating_ip_pool.py +0 -38
  280. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  281. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  282. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  283. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  284. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  285. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  286. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  287. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  288. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  289. python_openstackclient-8.3.0.dist-info/pbr.json +0 -1
  290. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  291. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
  292. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
@@ -100,6 +100,53 @@ class LimitTestCase(common.IdentityTests):
100
100
  self.assert_show_fields(items, self.LIMIT_FIELDS)
101
101
  registered_limit_id = self._create_dummy_registered_limit()
102
102
 
103
+ def test_limit_create_with_project_domain(self):
104
+ registered_limit_id = self._create_dummy_registered_limit()
105
+ raw_output = self.openstack(
106
+ f'registered limit show {registered_limit_id}',
107
+ cloud=SYSTEM_CLOUD,
108
+ )
109
+ items = self.parse_show(raw_output)
110
+ service_id = self._extract_value_from_items('service_id', items)
111
+ resource_name = self._extract_value_from_items('resource_name', items)
112
+
113
+ raw_output = self.openstack(f'service show {service_id}')
114
+ items = self.parse_show(raw_output)
115
+ service_name = self._extract_value_from_items('name', items)
116
+
117
+ project_name = self._create_dummy_project()
118
+ raw_output = self.openstack(
119
+ f'project show {project_name}',
120
+ cloud=SYSTEM_CLOUD,
121
+ )
122
+ items = self.parse_show(raw_output)
123
+ domain_id = self._extract_value_from_items('domain_id', items)
124
+
125
+ params = {
126
+ 'project_name': project_name,
127
+ 'project_domain': domain_id,
128
+ 'service_name': service_name,
129
+ 'resource_name': resource_name,
130
+ 'resource_limit': 15,
131
+ }
132
+ raw_output = self.openstack(
133
+ 'limit create'
134
+ ' --project {project_name}'
135
+ ' --project-domain {project_domain}'
136
+ ' --service {service_name}'
137
+ ' --resource-limit {resource_limit}'
138
+ ' {resource_name}'.format(**params),
139
+ cloud=SYSTEM_CLOUD,
140
+ )
141
+ items = self.parse_show(raw_output)
142
+ limit_id = self._extract_value_from_items('id', items)
143
+ self.addCleanup(
144
+ self.openstack, f'limit delete {limit_id}', cloud=SYSTEM_CLOUD
145
+ )
146
+
147
+ self.assert_show_fields(items, self.LIMIT_FIELDS)
148
+ registered_limit_id = self._create_dummy_registered_limit()
149
+
103
150
  def test_limit_create_with_service_id(self):
104
151
  self._create_dummy_limit()
105
152
 
@@ -21,7 +21,7 @@ class ProjectTests(common.IdentityTests):
21
21
  description = data_utils.rand_name('description')
22
22
  raw_output = self.openstack(
23
23
  'project create '
24
- f'--domain {self.domain_name} '
24
+ f'--domain {self.DOMAIN_NAME} '
25
25
  f'--description {description} '
26
26
  '--enable '
27
27
  '--property k1=v1 '
@@ -30,7 +30,7 @@ class ProjectTests(common.IdentityTests):
30
30
  )
31
31
  self.addCleanup(
32
32
  self.openstack,
33
- f'project delete --domain {self.domain_name} {project_name}',
33
+ f'project delete --domain {self.DOMAIN_NAME} {project_name}',
34
34
  )
35
35
  items = self.parse_show(raw_output)
36
36
  show_fields = list(self.PROJECT_FIELDS)
@@ -43,7 +43,7 @@ class ProjectTests(common.IdentityTests):
43
43
  def test_project_delete(self):
44
44
  project_name = self._create_dummy_project(add_clean_up=False)
45
45
  raw_output = self.openstack(
46
- f'project delete --domain {self.domain_name} {project_name}'
46
+ f'project delete --domain {self.DOMAIN_NAME} {project_name}'
47
47
  )
48
48
  self.assertEqual(0, len(raw_output))
49
49
 
@@ -55,7 +55,7 @@ class ProjectTests(common.IdentityTests):
55
55
  def test_project_list_with_domain(self):
56
56
  project_name = self._create_dummy_project()
57
57
  raw_output = self.openstack(
58
- f'project list --domain {self.domain_name}'
58
+ f'project list --domain {self.DOMAIN_NAME}'
59
59
  )
60
60
  items = self.parse_listing(raw_output)
61
61
  self.assert_table_structure(items, common.BASIC_LIST_HEADERS)
@@ -75,7 +75,7 @@ class ProjectTests(common.IdentityTests):
75
75
  self.assertEqual(0, len(raw_output))
76
76
  # check project details
77
77
  raw_output = self.openstack(
78
- f'project show --domain {self.domain_name} {new_project_name}'
78
+ f'project show --domain {self.DOMAIN_NAME} {new_project_name}'
79
79
  )
80
80
  items = self.parse_show(raw_output)
81
81
  fields = list(self.PROJECT_FIELDS)
@@ -92,7 +92,7 @@ class ProjectTests(common.IdentityTests):
92
92
 
93
93
  def test_project_show(self):
94
94
  raw_output = self.openstack(
95
- f'project show --domain {self.domain_name} {self.project_name}'
95
+ f'project show --domain {self.DOMAIN_NAME} {self.PROJECT_NAME}'
96
96
  )
97
97
  items = self.parse_show(raw_output)
98
98
  self.assert_show_fields(items, self.PROJECT_FIELDS)
@@ -101,10 +101,10 @@ class ProjectTests(common.IdentityTests):
101
101
  output = self.openstack(
102
102
  'project show '
103
103
  '--parents --children '
104
- f'--domain {self.domain_name} '
105
- f'{self.project_name}',
104
+ f'--domain {self.DOMAIN_NAME} '
105
+ f'{self.PROJECT_NAME}',
106
106
  parse_output=True,
107
107
  )
108
- for attr_name in self.PROJECT_FIELDS + ['parents', 'subtree']:
108
+ for attr_name in [*self.PROJECT_FIELDS, 'parents', 'subtree']:
109
109
  self.assertIn(attr_name, output)
110
- self.assertEqual(self.project_name, output.get('name'))
110
+ self.assertEqual(self.PROJECT_NAME, output.get('name'))
@@ -76,19 +76,19 @@ class RoleTests(common.IdentityTests):
76
76
  username = self._create_dummy_user()
77
77
  raw_output = self.openstack(
78
78
  'role add '
79
- f'--project {self.project_name} '
80
- f'--project-domain {self.domain_name} '
79
+ f'--project {self.PROJECT_NAME} '
80
+ f'--project-domain {self.DOMAIN_NAME} '
81
81
  f'--user {username} '
82
- f'--user-domain {self.domain_name} '
82
+ f'--user-domain {self.DOMAIN_NAME} '
83
83
  f'{role_name}'
84
84
  )
85
85
  self.addCleanup(
86
86
  self.openstack,
87
87
  'role remove '
88
- f'--project {self.project_name} '
89
- f'--project-domain {self.domain_name} '
88
+ f'--project {self.PROJECT_NAME} '
89
+ f'--project-domain {self.DOMAIN_NAME} '
90
90
  f'--user {username} '
91
- f'--user-domain {self.domain_name} '
91
+ f'--user-domain {self.DOMAIN_NAME} '
92
92
  f'{role_name}',
93
93
  )
94
94
  self.assertEqual(0, len(raw_output))
@@ -98,20 +98,20 @@ class RoleTests(common.IdentityTests):
98
98
  username = self._create_dummy_user()
99
99
  raw_output = self.openstack(
100
100
  'role add '
101
- f'--project {self.project_name} '
102
- f'--project-domain {self.domain_name} '
101
+ f'--project {self.PROJECT_NAME} '
102
+ f'--project-domain {self.DOMAIN_NAME} '
103
103
  f'--user {username} '
104
- f'--user-domain {self.domain_name} '
104
+ f'--user-domain {self.DOMAIN_NAME} '
105
105
  '--inherited '
106
106
  f'{role_name}'
107
107
  )
108
108
  self.addCleanup(
109
109
  self.openstack,
110
110
  'role remove '
111
- f'--project {self.project_name} '
112
- f'--project-domain {self.domain_name} '
111
+ f'--project {self.PROJECT_NAME} '
112
+ f'--project-domain {self.DOMAIN_NAME} '
113
113
  f'--user {username} '
114
- f'--user-domain {self.domain_name} '
114
+ f'--user-domain {self.DOMAIN_NAME} '
115
115
  '--inherited '
116
116
  f'{role_name}',
117
117
  )
@@ -122,18 +122,18 @@ class RoleTests(common.IdentityTests):
122
122
  username = self._create_dummy_user()
123
123
  add_raw_output = self.openstack(
124
124
  'role add '
125
- f'--project {self.project_name} '
126
- f'--project-domain {self.domain_name} '
125
+ f'--project {self.PROJECT_NAME} '
126
+ f'--project-domain {self.DOMAIN_NAME} '
127
127
  f'--user {username} '
128
- f'--user-domain {self.domain_name} '
128
+ f'--user-domain {self.DOMAIN_NAME} '
129
129
  f'{role_name}'
130
130
  )
131
131
  remove_raw_output = self.openstack(
132
132
  'role remove '
133
- f'--project {self.project_name} '
134
- f'--project-domain {self.domain_name} '
133
+ f'--project {self.PROJECT_NAME} '
134
+ f'--project-domain {self.DOMAIN_NAME} '
135
135
  f'--user {username} '
136
- f'--user-domain {self.domain_name} '
136
+ f'--user-domain {self.DOMAIN_NAME} '
137
137
  f'{role_name}'
138
138
  )
139
139
  self.assertEqual(0, len(add_raw_output))
@@ -79,14 +79,14 @@ class RoleAssignmentTests(common.IdentityTests):
79
79
  )
80
80
  raw_output = self.openstack(
81
81
  'role add '
82
- f'--project {self.project_name} '
82
+ f'--project {self.PROJECT_NAME} '
83
83
  f'--group {group_name} --group-domain {domain_name_A} '
84
84
  f'{role_name}'
85
85
  )
86
86
  self.addCleanup(
87
87
  self.openstack,
88
88
  'role remove '
89
- f'--project {self.project_name} '
89
+ f'--project {self.PROJECT_NAME} '
90
90
  f'--group {group_name} --group-domain {domain_name_A} '
91
91
  f'{role_name}',
92
92
  )
@@ -108,20 +108,20 @@ class RoleAssignmentTests(common.IdentityTests):
108
108
  username = self._create_dummy_user()
109
109
  raw_output = self.openstack(
110
110
  'role add '
111
- f'--domain {self.domain_name} '
111
+ f'--domain {self.DOMAIN_NAME} '
112
112
  f'--user {username} '
113
113
  f'{role_name}'
114
114
  )
115
115
  self.addCleanup(
116
116
  self.openstack,
117
117
  'role remove '
118
- f'--domain {self.domain_name} '
118
+ f'--domain {self.DOMAIN_NAME} '
119
119
  f'--user {username} '
120
120
  f'{role_name}',
121
121
  )
122
122
  self.assertEqual(0, len(raw_output))
123
123
  raw_output = self.openstack(
124
- f'role assignment list --domain {self.domain_name} '
124
+ f'role assignment list --domain {self.DOMAIN_NAME} '
125
125
  )
126
126
  items = self.parse_listing(raw_output)
127
127
  self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
@@ -141,14 +141,14 @@ class RoleAssignmentTests(common.IdentityTests):
141
141
  )
142
142
  raw_output = self.openstack(
143
143
  'role add '
144
- f'--project {self.project_name} '
144
+ f'--project {self.PROJECT_NAME} '
145
145
  f'--user {username} --user-domain {domain_name_A} '
146
146
  f'{role_name}'
147
147
  )
148
148
  self.addCleanup(
149
149
  self.openstack,
150
150
  'role remove '
151
- f'--project {self.project_name} '
151
+ f'--project {self.PROJECT_NAME} '
152
152
  f'--user {username} --user-domain {domain_name_A} '
153
153
  f'{role_name}',
154
154
  )
@@ -214,20 +214,20 @@ class RoleAssignmentTests(common.IdentityTests):
214
214
  username = self._create_dummy_user()
215
215
  raw_output = self.openstack(
216
216
  'role add '
217
- f'--project {self.project_name} '
217
+ f'--project {self.PROJECT_NAME} '
218
218
  f'--user {username} '
219
219
  f'{role_name}'
220
220
  )
221
221
  self.addCleanup(
222
222
  self.openstack,
223
223
  'role remove '
224
- f'--project {self.project_name} '
224
+ f'--project {self.PROJECT_NAME} '
225
225
  f'--user {username} '
226
226
  f'{role_name}',
227
227
  )
228
228
  self.assertEqual(0, len(raw_output))
229
229
  raw_output = self.openstack(
230
- f'role assignment list --project {self.project_name} '
230
+ f'role assignment list --project {self.PROJECT_NAME} '
231
231
  )
232
232
  items = self.parse_listing(raw_output)
233
233
  self.assert_table_structure(items, self.ROLE_ASSIGNMENT_LIST_HEADERS)
@@ -302,7 +302,7 @@ class RoleAssignmentTests(common.IdentityTests):
302
302
  username = self._create_dummy_user()
303
303
  raw_output = self.openstack(
304
304
  'role add '
305
- f'--project {self.project_name} '
305
+ f'--project {self.PROJECT_NAME} '
306
306
  f'--user {username} '
307
307
  '--inherited '
308
308
  f'{role_name}'
@@ -310,7 +310,7 @@ class RoleAssignmentTests(common.IdentityTests):
310
310
  self.addCleanup(
311
311
  self.openstack,
312
312
  'role remove '
313
- f'--project {self.project_name} '
313
+ f'--project {self.PROJECT_NAME} '
314
314
  f'--user {username} '
315
315
  '--inherited '
316
316
  f'{role_name}',
@@ -22,7 +22,7 @@ class UserTests(common.IdentityTests):
22
22
  def test_user_delete(self):
23
23
  username = self._create_dummy_user(add_clean_up=False)
24
24
  raw_output = self.openstack(
25
- f'user delete --domain {self.domain_name} {username}'
25
+ f'user delete --domain {self.DOMAIN_NAME} {username}'
26
26
  )
27
27
  self.assertEqual(0, len(raw_output))
28
28
 
@@ -34,7 +34,7 @@ class UserTests(common.IdentityTests):
34
34
  def test_user_set(self):
35
35
  username = self._create_dummy_user()
36
36
  raw_output = self.openstack(
37
- f'user show --domain {self.domain_name} {username}'
37
+ f'user show --domain {self.DOMAIN_NAME} {username}'
38
38
  )
39
39
  user = self.parse_show_as_object(raw_output)
40
40
  new_username = data_utils.rand_name('NewTestUser')
@@ -46,7 +46,7 @@ class UserTests(common.IdentityTests):
46
46
  )
47
47
  self.assertEqual(0, len(raw_output))
48
48
  raw_output = self.openstack(
49
- f'user show --domain {self.domain_name} {new_username}'
49
+ f'user show --domain {self.DOMAIN_NAME} {new_username}'
50
50
  )
51
51
  updated_user = self.parse_show_as_object(raw_output)
52
52
  self.assertEqual(user['id'], updated_user['id'])
@@ -57,7 +57,7 @@ class UserTests(common.IdentityTests):
57
57
  project_name = self._create_dummy_project()
58
58
  # get original user details
59
59
  raw_output = self.openstack(
60
- f'user show --domain {self.domain_name} {username}'
60
+ f'user show --domain {self.DOMAIN_NAME} {username}'
61
61
  )
62
62
  user = self.parse_show_as_object(raw_output)
63
63
  # update user
@@ -67,19 +67,19 @@ class UserTests(common.IdentityTests):
67
67
  '--project-domain {project_domain} '
68
68
  '{id}'.format(
69
69
  project=project_name,
70
- project_domain=self.domain_name,
70
+ project_domain=self.DOMAIN_NAME,
71
71
  id=user['id'],
72
72
  )
73
73
  )
74
74
  self.assertEqual(0, len(raw_output))
75
75
  # get updated user details
76
76
  raw_output = self.openstack(
77
- f'user show --domain {self.domain_name} {username}'
77
+ f'user show --domain {self.DOMAIN_NAME} {username}'
78
78
  )
79
79
  updated_user = self.parse_show_as_object(raw_output)
80
80
  # get project details
81
81
  raw_output = self.openstack(
82
- f'project show --domain {self.domain_name} {project_name}'
82
+ f'project show --domain {self.DOMAIN_NAME} {project_name}'
83
83
  )
84
84
  project = self.parse_show_as_object(raw_output)
85
85
  # check updated user details
@@ -89,7 +89,7 @@ class UserTests(common.IdentityTests):
89
89
  def test_user_show(self):
90
90
  username = self._create_dummy_user()
91
91
  raw_output = self.openstack(
92
- f'user show --domain {self.domain_name} {username}'
92
+ f'user show --domain {self.DOMAIN_NAME} {username}'
93
93
  )
94
94
  items = self.parse_show(raw_output)
95
95
  self.assert_show_fields(items, self.USER_FIELDS)
@@ -16,9 +16,4 @@ from openstackclient.tests.functional import base
16
16
  class BaseImageTests(base.TestCase):
17
17
  """Functional tests for Image commands"""
18
18
 
19
- @classmethod
20
- def setUpClass(cls):
21
- super().setUpClass()
22
- # TODO(dtroyer): maybe do image API discovery here to determine
23
- # what is available, it isn't in the service catalog
24
- cls.haz_v1_api = False
19
+ ...
@@ -0,0 +1,69 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain 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,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ from openstackclient.tests.functional import base
14
+
15
+
16
+ class MetadefObjectTests(base.TestCase):
17
+ def setUp(self):
18
+ super().setUp()
19
+ self.obj_name = self.getUniqueString('metadef-obj')
20
+ self.ns_name = self.getUniqueString('metadef-ns')
21
+ self.openstack(f"image metadef namespace create {self.ns_name}")
22
+ self.addCleanup(
23
+ lambda: self.openstack(
24
+ f"image metadef namespace delete {self.ns_name}"
25
+ )
26
+ )
27
+
28
+ def test_metadef_objects(self):
29
+ # CREATE
30
+ created = self.openstack(
31
+ (
32
+ "image metadef object create "
33
+ f"--namespace {self.ns_name} "
34
+ f"{self.obj_name}"
35
+ ),
36
+ parse_output=True,
37
+ )
38
+ self.addCleanup(
39
+ lambda: self.openstack(
40
+ f"image metadef object delete {self.ns_name} {self.obj_name}"
41
+ )
42
+ )
43
+ self.assertEqual(self.obj_name, created["name"])
44
+ self.assertEqual(self.ns_name, created["namespace_name"])
45
+
46
+ # UPDATE
47
+ new_name = f"{self.obj_name}-updated"
48
+ self.openstack(
49
+ "image metadef object update "
50
+ f"{self.ns_name} {self.obj_name} "
51
+ f"--name {new_name}"
52
+ )
53
+ self.obj_name = new_name
54
+
55
+ # READ (get)
56
+ shown = self.openstack(
57
+ f"image metadef object show {self.ns_name} {self.obj_name}",
58
+ parse_output=True,
59
+ )
60
+ self.assertEqual(self.obj_name, shown["name"])
61
+ self.assertEqual(self.ns_name, shown["namespace_name"])
62
+
63
+ # READ (list)
64
+ rows = self.openstack(
65
+ f"image metadef object list {self.ns_name}",
66
+ parse_output=True,
67
+ )
68
+ names = {row["name"] for row in rows}
69
+ self.assertIn(self.obj_name, names)
@@ -10,6 +10,7 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
+ from typing import ClassVar
13
14
  import uuid
14
15
 
15
16
  from openstackclient.tests.functional import base
@@ -18,6 +19,8 @@ from openstackclient.tests.functional import base
18
19
  class NetworkTests(base.TestCase):
19
20
  """Functional tests for Network commands"""
20
21
 
22
+ haz_network: ClassVar[bool]
23
+
21
24
  @classmethod
22
25
  def setUpClass(cls):
23
26
  super().setUpClass()
@@ -33,7 +36,7 @@ class NetworkTests(base.TestCase):
33
36
  class NetworkTagTests(NetworkTests):
34
37
  """Functional tests with tag operation"""
35
38
 
36
- base_command: str
39
+ base_command: ClassVar[str]
37
40
 
38
41
  def test_tag_operation(self):
39
42
  # Get project IDs
@@ -84,7 +87,7 @@ class NetworkTagTests(NetworkTests):
84
87
  parse_output=True,
85
88
  )
86
89
  for name, tags in expected:
87
- net = [n for n in cmd_output if n['Name'] == name][0]
90
+ net = next(n for n in cmd_output if n['Name'] == name)
88
91
  self.assertEqual(set(tags), set(net['Tags']))
89
92
 
90
93
  def _create_resource_for_tag_test(self, name, args):
@@ -11,6 +11,7 @@
11
11
  # under the License.
12
12
 
13
13
  import random
14
+ from typing import ClassVar
14
15
  import uuid
15
16
 
16
17
  from openstackclient.tests.functional.network.v2 import common
@@ -19,6 +20,11 @@ from openstackclient.tests.functional.network.v2 import common
19
20
  class FloatingIpTests(common.NetworkTests):
20
21
  """Functional tests for floating ip"""
21
22
 
23
+ EXTERNAL_NETWORK_NAME: ClassVar[str]
24
+ EXTERNAL_NETWORK_ID: ClassVar[str]
25
+ PRIVATE_NETWORK_NAME: ClassVar[str]
26
+ PRIVATE_NETWORK_ID: ClassVar[str]
27
+
22
28
  @classmethod
23
29
  def setUpClass(cls):
24
30
  super().setUpClass()
@@ -32,14 +38,14 @@ class FloatingIpTests(common.NetworkTests):
32
38
  'network create ' + '--external ' + cls.EXTERNAL_NETWORK_NAME,
33
39
  parse_output=True,
34
40
  )
35
- cls.external_network_id = json_output["id"]
41
+ cls.EXTERNAL_NETWORK_ID = json_output["id"]
36
42
 
37
43
  # Create a private network for the port
38
44
  json_output = cls.openstack(
39
45
  'network create ' + cls.PRIVATE_NETWORK_NAME,
40
46
  parse_output=True,
41
47
  )
42
- cls.private_network_id = json_output["id"]
48
+ cls.PRIVATE_NETWORK_ID = json_output["id"]
43
49
 
44
50
  @classmethod
45
51
  def tearDownClass(cls):
@@ -59,8 +65,8 @@ class FloatingIpTests(common.NetworkTests):
59
65
  super().setUp()
60
66
 
61
67
  # Verify setup
62
- self.assertIsNotNone(self.external_network_id)
63
- self.assertIsNotNone(self.private_network_id)
68
+ self.assertIsNotNone(self.EXTERNAL_NETWORK_ID)
69
+ self.assertIsNotNone(self.PRIVATE_NETWORK_ID)
64
70
 
65
71
  def _create_subnet(self, network_name, subnet_name):
66
72
  subnet_id = None
@@ -10,6 +10,7 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
+ from typing import ClassVar
13
14
  import uuid
14
15
 
15
16
  from openstackclient.tests.functional.network.v2 import common
@@ -18,6 +19,9 @@ from openstackclient.tests.functional.network.v2 import common
18
19
  class IPAvailabilityTests(common.NetworkTests):
19
20
  """Functional tests for IP availability"""
20
21
 
22
+ NAME: ClassVar[str]
23
+ NETWORK_NAME: ClassVar[str]
24
+
21
25
  @classmethod
22
26
  def setUpClass(cls):
23
27
  super().setUpClass()
@@ -13,6 +13,7 @@
13
13
  # License for the specific language governing permissions and limitations
14
14
  # under the License.
15
15
 
16
+ from typing import ClassVar
16
17
  import unittest
17
18
  import uuid
18
19
 
@@ -22,8 +23,8 @@ from openstackclient.tests.functional.network.v2 import common
22
23
  class TestMeterRule(common.NetworkTests):
23
24
  """Functional tests for meter rule"""
24
25
 
25
- METER_ID: str
26
- METER_RULE_ID: str
26
+ METER_ID: ClassVar[str]
27
+ METER_NAME: ClassVar[str]
27
28
 
28
29
  @classmethod
29
30
  def setUpClass(cls):
@@ -10,6 +10,7 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
+ from typing import ClassVar
13
14
  import uuid
14
15
 
15
16
  from openstackclient.tests.functional.network.v2 import common
@@ -18,6 +19,10 @@ from openstackclient.tests.functional.network.v2 import common
18
19
  class NetworkSegmentTests(common.NetworkTests):
19
20
  """Functional tests for network segment"""
20
21
 
22
+ NETWORK_NAME: ClassVar[str]
23
+ NETWORK_ID: ClassVar[str]
24
+ PHYSICAL_NETWORK_NAME: ClassVar[str]
25
+
21
26
  @classmethod
22
27
  def setUpClass(cls):
23
28
  super().setUpClass()
@@ -11,6 +11,7 @@
11
11
  # under the License.
12
12
 
13
13
  import random
14
+ from typing import ClassVar
14
15
  import uuid
15
16
 
16
17
  from openstackclient.tests.functional.network.v2 import common
@@ -21,19 +22,22 @@ class SubnetTests(common.NetworkTagTests):
21
22
 
22
23
  base_command = 'subnet'
23
24
 
25
+ NETWORK_NAME: ClassVar[str]
26
+ NETWORK_ID: ClassVar[str]
27
+
24
28
  @classmethod
25
29
  def setUpClass(cls):
26
30
  super().setUpClass()
27
- if cls.haz_network:
28
- cls.NETWORK_NAME = uuid.uuid4().hex
29
31
 
30
- # Create a network for the all subnet tests
31
- cmd_output = cls.openstack(
32
- 'network create ' + cls.NETWORK_NAME,
33
- parse_output=True,
34
- )
35
- # Get network_id for assertEqual
36
- cls.NETWORK_ID = cmd_output["id"]
32
+ cls.NETWORK_NAME = uuid.uuid4().hex
33
+
34
+ # Create a network for the all subnet tests
35
+ cmd_output = cls.openstack(
36
+ 'network create ' + cls.NETWORK_NAME,
37
+ parse_output=True,
38
+ )
39
+ # Get network_id for assertEqual
40
+ cls.NETWORK_ID = cmd_output["id"]
37
41
 
38
42
  @classmethod
39
43
  def tearDownClass(cls):
@@ -10,12 +10,16 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
+ from typing import ClassVar
14
+
13
15
  from openstackclient.tests.functional import base
14
16
 
15
17
 
16
18
  class ObjectStoreTests(base.TestCase):
17
19
  """Functional tests for Object Store commands"""
18
20
 
21
+ haz_object_store: ClassVar[bool]
22
+
19
23
  @classmethod
20
24
  def setUpClass(cls):
21
25
  super().setUpClass()
@@ -10,6 +10,8 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
+ from typing import ClassVar
14
+
13
15
  import fixtures
14
16
 
15
17
  from openstackclient.tests.functional.volume import base
@@ -18,6 +20,8 @@ from openstackclient.tests.functional.volume import base
18
20
  class BaseVolumeTests(base.BaseVolumeTests):
19
21
  """Base class for Volume functional tests."""
20
22
 
23
+ haz_volume_v2: ClassVar[bool]
24
+
21
25
  @classmethod
22
26
  def setUpClass(cls):
23
27
  super().setUpClass()