python-openstackclient 9.0.0__py3-none-any.whl → 10.1.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 (352) 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 +59 -43
  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 +36 -34
  14. openstackclient/common/pagination.py +50 -6
  15. openstackclient/common/progressbar.py +7 -6
  16. openstackclient/common/project_cleanup.py +11 -6
  17. openstackclient/common/quota.py +105 -103
  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 +42 -22
  25. openstackclient/compute/v2/host.py +14 -6
  26. openstackclient/compute/v2/hypervisor.py +16 -5
  27. openstackclient/compute/v2/hypervisor_stats.py +10 -2
  28. openstackclient/compute/v2/keypair.py +35 -16
  29. openstackclient/compute/v2/server.py +268 -179
  30. openstackclient/compute/v2/server_backup.py +10 -4
  31. openstackclient/compute/v2/server_event.py +28 -12
  32. openstackclient/compute/v2/server_group.py +23 -11
  33. openstackclient/compute/v2/server_image.py +19 -10
  34. openstackclient/compute/v2/server_migration.py +27 -10
  35. openstackclient/compute/v2/server_share.py +274 -0
  36. openstackclient/compute/v2/server_volume.py +13 -5
  37. openstackclient/compute/v2/service.py +17 -8
  38. openstackclient/compute/v2/usage.py +28 -23
  39. openstackclient/identity/client.py +8 -3
  40. openstackclient/identity/common.py +82 -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 +32 -12
  51. openstackclient/identity/v3/application_credential.py +66 -24
  52. openstackclient/identity/v3/catalog.py +14 -7
  53. openstackclient/identity/v3/consumer.py +22 -11
  54. openstackclient/identity/v3/credential.py +39 -17
  55. openstackclient/identity/v3/domain.py +40 -19
  56. openstackclient/identity/v3/ec2creds.py +25 -12
  57. openstackclient/identity/v3/endpoint.py +98 -64
  58. openstackclient/identity/v3/endpoint_group.py +28 -17
  59. openstackclient/identity/v3/federation_protocol.py +44 -20
  60. openstackclient/identity/v3/group.py +64 -40
  61. openstackclient/identity/v3/identity_provider.py +95 -57
  62. openstackclient/identity/v3/implied_role.py +21 -9
  63. openstackclient/identity/v3/limit.py +42 -17
  64. openstackclient/identity/v3/mapping.py +58 -28
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +59 -26
  67. openstackclient/identity/v3/region.py +39 -17
  68. openstackclient/identity/v3/registered_limit.py +41 -16
  69. openstackclient/identity/v3/role.py +62 -31
  70. openstackclient/identity/v3/role_assignment.py +25 -7
  71. openstackclient/identity/v3/service.py +39 -17
  72. openstackclient/identity/v3/service_provider.py +40 -16
  73. openstackclient/identity/v3/tag.py +23 -6
  74. openstackclient/identity/v3/token.py +30 -14
  75. openstackclient/identity/v3/trust.py +39 -18
  76. openstackclient/identity/v3/unscoped_saml.py +10 -2
  77. openstackclient/identity/v3/user.py +86 -36
  78. openstackclient/image/client.py +7 -3
  79. openstackclient/image/v1/image.py +33 -26
  80. openstackclient/image/v2/cache.py +16 -11
  81. openstackclient/image/v2/image.py +88 -56
  82. openstackclient/image/v2/info.py +7 -1
  83. openstackclient/image/v2/metadef_namespaces.py +117 -20
  84. openstackclient/image/v2/metadef_objects.py +32 -19
  85. openstackclient/image/v2/metadef_properties.py +30 -16
  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 +25 -27
  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 +27 -54
  93. openstackclient/network/v2/address_group.py +39 -16
  94. openstackclient/network/v2/address_scope.py +36 -20
  95. openstackclient/network/v2/bgpvpn/bgpvpn.py +477 -0
  96. openstackclient/network/v2/bgpvpn/constants.py +30 -0
  97. openstackclient/network/v2/bgpvpn/network_association.py +226 -0
  98. openstackclient/network/v2/bgpvpn/port_association.py +504 -0
  99. openstackclient/network/v2/bgpvpn/router_association.py +301 -0
  100. openstackclient/network/v2/default_security_group_rule.py +31 -14
  101. openstackclient/network/v2/floating_ip.py +121 -162
  102. openstackclient/network/v2/floating_ip_port_forwarding.py +41 -19
  103. openstackclient/network/v2/fwaas/__init__.py +0 -0
  104. openstackclient/network/v2/fwaas/group.py +499 -0
  105. openstackclient/network/v2/fwaas/policy.py +518 -0
  106. openstackclient/network/v2/fwaas/rule.py +610 -0
  107. openstackclient/network/v2/ip_availability.py +25 -8
  108. openstackclient/network/v2/l3_conntrack_helper.py +35 -13
  109. openstackclient/network/v2/local_ip.py +27 -13
  110. openstackclient/network/v2/local_ip_association.py +17 -7
  111. openstackclient/network/v2/ndp_proxy.py +23 -11
  112. openstackclient/network/v2/network.py +213 -213
  113. openstackclient/network/v2/network_agent.py +77 -34
  114. openstackclient/network/v2/network_auto_allocated_topology.py +27 -15
  115. openstackclient/network/v2/network_flavor.py +45 -21
  116. openstackclient/network/v2/network_flavor_profile.py +42 -17
  117. openstackclient/network/v2/network_meter.py +39 -15
  118. openstackclient/network/v2/network_meter_rule.py +40 -12
  119. openstackclient/network/v2/network_qos_policy.py +39 -21
  120. openstackclient/network/v2/network_qos_rule.py +48 -18
  121. openstackclient/network/v2/network_qos_rule_type.py +28 -9
  122. openstackclient/network/v2/network_rbac.py +34 -16
  123. openstackclient/network/v2/network_segment.py +32 -11
  124. openstackclient/network/v2/network_segment_range.py +70 -31
  125. openstackclient/network/v2/network_service_provider.py +7 -1
  126. openstackclient/network/v2/network_trunk.py +41 -22
  127. openstackclient/network/v2/port.py +141 -40
  128. openstackclient/network/v2/router.py +101 -67
  129. openstackclient/network/v2/security_group.py +97 -198
  130. openstackclient/network/v2/security_group_rule.py +115 -282
  131. openstackclient/network/v2/subnet.py +63 -34
  132. openstackclient/network/v2/subnet_pool.py +42 -24
  133. openstackclient/network/v2/taas/tap_flow.py +35 -14
  134. openstackclient/network/v2/taas/tap_mirror.py +28 -14
  135. openstackclient/network/v2/taas/tap_service.py +26 -12
  136. openstackclient/object/client.py +7 -2
  137. openstackclient/object/v1/account.py +13 -6
  138. openstackclient/object/v1/container.py +28 -16
  139. openstackclient/object/v1/object.py +28 -16
  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 +59 -19
  151. openstackclient/tests/functional/identity/v3/test_application_credential.py +1 -1
  152. openstackclient/tests/functional/identity/v3/test_group.py +20 -20
  153. openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
  154. openstackclient/tests/functional/identity/v3/test_mapping.py +81 -0
  155. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  156. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  157. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  158. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  159. openstackclient/tests/functional/image/base.py +1 -6
  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_group.py +163 -0
  172. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +11 -7
  173. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  174. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  175. openstackclient/tests/unit/common/test_extension.py +2 -2
  176. openstackclient/tests/unit/common/test_limits.py +1 -1
  177. openstackclient/tests/unit/common/test_module.py +82 -44
  178. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  179. openstackclient/tests/unit/common/test_quota.py +15 -26
  180. openstackclient/tests/unit/compute/v2/fakes.py +26 -57
  181. openstackclient/tests/unit/compute/v2/test_agent.py +4 -4
  182. openstackclient/tests/unit/compute/v2/test_aggregate.py +1 -1
  183. openstackclient/tests/unit/compute/v2/test_console.py +2 -2
  184. openstackclient/tests/unit/compute/v2/test_console_connection.py +1 -1
  185. openstackclient/tests/unit/compute/v2/test_flavor.py +29 -3
  186. openstackclient/tests/unit/compute/v2/test_host.py +3 -3
  187. openstackclient/tests/unit/compute/v2/test_hypervisor.py +2 -2
  188. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -1
  189. openstackclient/tests/unit/compute/v2/test_keypair.py +7 -7
  190. openstackclient/tests/unit/compute/v2/test_server.py +26 -111
  191. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -1
  192. openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
  193. openstackclient/tests/unit/compute/v2/test_server_group.py +1 -1
  194. openstackclient/tests/unit/compute/v2/test_server_image.py +1 -1
  195. openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
  196. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  197. openstackclient/tests/unit/compute/v2/test_server_volume.py +2 -2
  198. openstackclient/tests/unit/compute/v2/test_service.py +3 -3
  199. openstackclient/tests/unit/compute/v2/test_usage.py +1 -1
  200. openstackclient/tests/unit/identity/v2_0/fakes.py +3 -7
  201. openstackclient/tests/unit/identity/v2_0/test_endpoint.py +1 -1
  202. openstackclient/tests/unit/identity/v2_0/test_project.py +1 -1
  203. openstackclient/tests/unit/identity/v2_0/test_role.py +1 -1
  204. openstackclient/tests/unit/identity/v2_0/test_role_assignment.py +1 -1
  205. openstackclient/tests/unit/identity/v2_0/test_service.py +1 -1
  206. openstackclient/tests/unit/identity/v2_0/test_token.py +2 -2
  207. openstackclient/tests/unit/identity/v2_0/test_user.py +1 -1
  208. openstackclient/tests/unit/identity/v3/fakes.py +8 -38
  209. openstackclient/tests/unit/identity/v3/test_access_rule.py +3 -3
  210. openstackclient/tests/unit/identity/v3/test_application_credential.py +4 -4
  211. openstackclient/tests/unit/identity/v3/test_credential.py +5 -5
  212. openstackclient/tests/unit/identity/v3/test_domain.py +5 -5
  213. openstackclient/tests/unit/identity/v3/test_endpoint.py +6 -6
  214. openstackclient/tests/unit/identity/v3/test_endpoint_group.py +1 -1
  215. openstackclient/tests/unit/identity/v3/test_group.py +12 -22
  216. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  217. openstackclient/tests/unit/identity/v3/test_implied_role.py +1 -1
  218. openstackclient/tests/unit/identity/v3/test_limit.py +5 -5
  219. openstackclient/tests/unit/identity/v3/test_mappings.py +163 -79
  220. openstackclient/tests/unit/identity/v3/test_project.py +28 -5
  221. openstackclient/tests/unit/identity/v3/test_protocol.py +3 -3
  222. openstackclient/tests/unit/identity/v3/test_region.py +5 -5
  223. openstackclient/tests/unit/identity/v3/test_registered_limit.py +5 -5
  224. openstackclient/tests/unit/identity/v3/test_role.py +8 -8
  225. openstackclient/tests/unit/identity/v3/test_role_assignment.py +1 -1
  226. openstackclient/tests/unit/identity/v3/test_service.py +5 -5
  227. openstackclient/tests/unit/identity/v3/test_token.py +2 -2
  228. openstackclient/tests/unit/identity/v3/test_trust.py +4 -4
  229. openstackclient/tests/unit/identity/v3/test_user.py +77 -10
  230. openstackclient/tests/unit/image/v2/test_image.py +11 -11
  231. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  232. openstackclient/tests/unit/network/test_common.py +0 -155
  233. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  234. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  235. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  236. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  237. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  238. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  239. openstackclient/tests/unit/network/v2/fakes.py +5 -77
  240. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  241. openstackclient/tests/unit/network/v2/fwaas/test_group.py +923 -0
  242. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  243. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +1005 -0
  244. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  245. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  246. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  247. openstackclient/tests/unit/network/v2/test_address_group.py +26 -2
  248. openstackclient/tests/unit/network/v2/test_address_scope.py +24 -0
  249. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +27 -2
  250. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +37 -13
  251. openstackclient/tests/unit/network/v2/test_ip_availability.py +25 -0
  252. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +29 -3
  253. openstackclient/tests/unit/network/v2/test_network.py +74 -12
  254. openstackclient/tests/unit/network/v2/test_network_agent.py +58 -5
  255. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  256. openstackclient/tests/unit/network/v2/test_network_flavor.py +26 -2
  257. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +24 -0
  258. openstackclient/tests/unit/network/v2/test_network_meter.py +24 -0
  259. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +25 -1
  260. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  261. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +24 -0
  262. openstackclient/tests/unit/network/v2/test_network_rbac.py +25 -1
  263. openstackclient/tests/unit/network/v2/test_network_segment.py +25 -1
  264. openstackclient/tests/unit/network/v2/test_network_segment_range.py +31 -10
  265. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  266. openstackclient/tests/unit/network/v2/test_port.py +166 -0
  267. openstackclient/tests/unit/network/v2/test_router.py +36 -16
  268. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +11 -8
  269. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +28 -37
  270. openstackclient/tests/unit/network/v2/test_subnet.py +30 -5
  271. openstackclient/tests/unit/network/v2/test_subnet_pool.py +26 -1
  272. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  273. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  274. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  275. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  276. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  277. openstackclient/tests/unit/test_hacking.py +108 -0
  278. openstackclient/tests/unit/volume/v2/fakes.py +21 -140
  279. openstackclient/tests/unit/volume/v2/test_volume_backup.py +6 -14
  280. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +8 -1
  281. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  282. openstackclient/tests/unit/volume/v3/fakes.py +205 -100
  283. openstackclient/tests/unit/volume/v3/test_backup_record.py +114 -0
  284. openstackclient/tests/unit/volume/v3/test_consistency_group.py +720 -0
  285. openstackclient/tests/unit/volume/v3/test_consistency_group_snapshot.py +354 -0
  286. openstackclient/tests/unit/volume/v3/test_qos_specs.py +455 -0
  287. openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
  288. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +3 -1
  289. openstackclient/tests/unit/volume/v3/test_volume_backend.py +158 -0
  290. openstackclient/tests/unit/volume/v3/test_volume_backup.py +6 -14
  291. openstackclient/tests/unit/volume/v3/test_volume_group_type.py +65 -0
  292. openstackclient/tests/unit/volume/v3/test_volume_host.py +115 -0
  293. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +61 -1
  294. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  295. openstackclient/volume/client.py +7 -3
  296. openstackclient/volume/v2/backup_record.py +15 -6
  297. openstackclient/volume/v2/consistency_group.py +29 -17
  298. openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
  299. openstackclient/volume/v2/qos_specs.py +28 -17
  300. openstackclient/volume/v2/service.py +17 -6
  301. openstackclient/volume/v2/volume.py +60 -30
  302. openstackclient/volume/v2/volume_backend.py +19 -6
  303. openstackclient/volume/v2/volume_backup.py +48 -23
  304. openstackclient/volume/v2/volume_host.py +6 -4
  305. openstackclient/volume/v2/volume_snapshot.py +49 -24
  306. openstackclient/volume/v2/volume_transfer_request.py +31 -13
  307. openstackclient/volume/v2/volume_type.py +43 -24
  308. openstackclient/volume/v3/backup_record.py +94 -0
  309. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  310. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  311. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  312. openstackclient/volume/v3/block_storage_manage.py +10 -4
  313. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  314. openstackclient/volume/v3/consistency_group.py +400 -0
  315. openstackclient/volume/v3/consistency_group_snapshot.py +225 -0
  316. openstackclient/volume/v3/qos_specs.py +389 -0
  317. openstackclient/volume/v3/service.py +16 -6
  318. openstackclient/volume/v3/volume.py +92 -40
  319. openstackclient/volume/v3/volume_attachment.py +47 -21
  320. openstackclient/volume/v3/volume_backend.py +130 -0
  321. openstackclient/volume/v3/volume_backup.py +55 -27
  322. openstackclient/volume/v3/volume_group.py +23 -13
  323. openstackclient/volume/v3/volume_group_snapshot.py +34 -17
  324. openstackclient/volume/v3/volume_group_type.py +27 -14
  325. openstackclient/volume/v3/volume_host.py +74 -0
  326. openstackclient/volume/v3/volume_message.py +18 -8
  327. openstackclient/volume/v3/volume_snapshot.py +70 -32
  328. openstackclient/volume/v3/volume_transfer_request.py +31 -13
  329. openstackclient/volume/v3/volume_type.py +42 -24
  330. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/METADATA +7 -8
  331. python_openstackclient-10.1.0.dist-info/RECORD +524 -0
  332. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/WHEEL +1 -1
  333. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/entry_points.txt +77 -25
  334. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/AUTHORS +9 -0
  335. python_openstackclient-10.1.0.dist-info/pbr.json +1 -0
  336. openstackclient/api/image_v1.py +0 -69
  337. openstackclient/api/image_v2.py +0 -79
  338. openstackclient/network/v2/floating_ip_pool.py +0 -38
  339. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  340. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  341. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  342. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  343. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  344. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  345. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  346. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  347. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  348. python_openstackclient-9.0.0.dist-info/RECORD +0 -499
  349. python_openstackclient-9.0.0.dist-info/pbr.json +0 -1
  350. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  351. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/LICENSE +0 -0
  352. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,610 @@
1
+ # Copyright 2016-2017 FUJITSU LIMITED
2
+ # All Rights Reserved
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
5
+ # not use this file except in compliance with the License. You may obtain
6
+ # a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations
14
+ # under the License.
15
+
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
18
+ import logging
19
+ from typing import Any
20
+
21
+ from cliff import columns as cliff_columns
22
+ from osc_lib.cli import identity as identity_utils
23
+ from osc_lib import exceptions
24
+ from osc_lib import utils
25
+ from osc_lib.utils import columns as column_util
26
+
27
+ from openstackclient import command
28
+ from openstackclient.i18n import _
29
+ from openstackclient.identity import common as identity_common
30
+
31
+
32
+ LOG = logging.getLogger(__name__)
33
+
34
+
35
+ _attr_map = (
36
+ ('id', 'ID', column_util.LIST_BOTH),
37
+ ('name', 'Name', column_util.LIST_BOTH),
38
+ ('enabled', 'Enabled', column_util.LIST_BOTH),
39
+ ('summary', 'Summary', column_util.LIST_SHORT_ONLY),
40
+ ('description', 'Description', column_util.LIST_LONG_ONLY),
41
+ ('firewall_policy_id', 'Firewall Policy', column_util.LIST_BOTH),
42
+ ('ip_version', 'IP Version', column_util.LIST_LONG_ONLY),
43
+ ('action', 'Action', column_util.LIST_LONG_ONLY),
44
+ ('protocol', 'Protocol', column_util.LIST_LONG_ONLY),
45
+ ('source_ip_address', 'Source IP Address', column_util.LIST_LONG_ONLY),
46
+ ('source_port', 'Source Port', column_util.LIST_LONG_ONLY),
47
+ (
48
+ 'destination_ip_address',
49
+ 'Destination IP Address',
50
+ column_util.LIST_LONG_ONLY,
51
+ ),
52
+ ('destination_port', 'Destination Port', column_util.LIST_LONG_ONLY),
53
+ ('shared', 'Shared', column_util.LIST_LONG_ONLY),
54
+ ('project_id', 'Project', column_util.LIST_LONG_ONLY),
55
+ (
56
+ 'source_firewall_group_id',
57
+ 'Source Firewall Group ID',
58
+ column_util.LIST_LONG_ONLY,
59
+ ),
60
+ (
61
+ 'destination_firewall_group_id',
62
+ 'Destination Firewall Group ID',
63
+ column_util.LIST_LONG_ONLY,
64
+ ),
65
+ )
66
+
67
+ _attr_map_dict = {x[0]: x[1] for x in _attr_map}
68
+
69
+
70
+ def _convert_to_lowercase(string: str) -> str:
71
+ return string.lower()
72
+
73
+
74
+ def _get_common_parser(
75
+ parser: argparse.ArgumentParser,
76
+ ) -> argparse.ArgumentParser:
77
+ parser.add_argument(
78
+ '--description',
79
+ metavar='<description>',
80
+ help=_('Description of the firewall rule'),
81
+ )
82
+ parser.add_argument(
83
+ '--protocol',
84
+ type=_convert_to_lowercase,
85
+ help=_(
86
+ 'IP protocol (ah, dccp, egp, esp, gre, icmp, igmp, '
87
+ 'ipv6-encap, ipv6-frag, ipv6-icmp, ipv6-nonxt, ipv6-opts, '
88
+ 'ipv6-route, ospf, pgm, rsvp, sctp, tcp, udp, udplite, '
89
+ 'vrrp and integer representations [0-255] or any; '
90
+ 'default: any (all protocols))'
91
+ ),
92
+ )
93
+ parser.add_argument(
94
+ '--action',
95
+ choices=['allow', 'deny', 'reject'],
96
+ type=_convert_to_lowercase,
97
+ help=_('Action for the firewall rule'),
98
+ )
99
+ parser.add_argument(
100
+ '--ip-version',
101
+ metavar='<ip-version>',
102
+ choices=['4', '6'],
103
+ help=_('Set IP version 4 or 6 (default is 4)'),
104
+ )
105
+ src_ip_group = parser.add_mutually_exclusive_group()
106
+ src_ip_group.add_argument(
107
+ '--source-ip-address',
108
+ metavar='<source-ip-address>',
109
+ help=_('Source IP address or subnet'),
110
+ )
111
+ src_ip_group.add_argument(
112
+ '--no-source-ip-address',
113
+ action='store_true',
114
+ help=_('Detach source IP address'),
115
+ )
116
+ dst_ip_group = parser.add_mutually_exclusive_group()
117
+ dst_ip_group.add_argument(
118
+ '--destination-ip-address',
119
+ metavar='<destination-ip-address>',
120
+ help=_('Destination IP address or subnet'),
121
+ )
122
+ dst_ip_group.add_argument(
123
+ '--no-destination-ip-address',
124
+ action='store_true',
125
+ help=_('Detach destination IP address'),
126
+ )
127
+ src_port_group = parser.add_mutually_exclusive_group()
128
+ src_port_group.add_argument(
129
+ '--source-port',
130
+ metavar='<source-port>',
131
+ help=_(
132
+ 'Source port number or range '
133
+ '(integer in [1, 65535] or range like 123:456)'
134
+ ),
135
+ )
136
+ src_port_group.add_argument(
137
+ '--no-source-port',
138
+ action='store_true',
139
+ help=_('Detach source port number or range'),
140
+ )
141
+ dst_port_group = parser.add_mutually_exclusive_group()
142
+ dst_port_group.add_argument(
143
+ '--destination-port',
144
+ metavar='<destination-port>',
145
+ help=_(
146
+ 'Destination port number or range'
147
+ '(integer in [1, 65535] or range like 123:456)'
148
+ ),
149
+ )
150
+ dst_port_group.add_argument(
151
+ '--no-destination-port',
152
+ action='store_true',
153
+ help=_('Detach destination port number or range'),
154
+ )
155
+ shared_group = parser.add_mutually_exclusive_group()
156
+ shared_group.add_argument(
157
+ '--share',
158
+ action='store_true',
159
+ default=None,
160
+ dest='shared',
161
+ help=_(
162
+ 'Share the firewall rule to be used in all projects '
163
+ '(by default, it is restricted to be used by the '
164
+ 'current project).'
165
+ ),
166
+ )
167
+ shared_group.add_argument(
168
+ '--no-share',
169
+ action='store_false',
170
+ dest='shared',
171
+ help=_('Restrict use of the firewall rule to the current project'),
172
+ )
173
+ enable_group = parser.add_mutually_exclusive_group()
174
+ enable_group.add_argument(
175
+ '--enable-rule',
176
+ action='store_true',
177
+ default=None,
178
+ dest='enabled',
179
+ help=_('Enable this rule (default is enabled)'),
180
+ )
181
+ enable_group.add_argument(
182
+ '--disable-rule',
183
+ action='store_false',
184
+ dest='enabled',
185
+ help=_('Disable this rule'),
186
+ )
187
+ src_fwg_group = parser.add_mutually_exclusive_group()
188
+ src_fwg_group.add_argument(
189
+ '--source-firewall-group',
190
+ metavar='<source-firewall-group>',
191
+ help=_('Source firewall group (name or ID)'),
192
+ )
193
+ src_fwg_group.add_argument(
194
+ '--no-source-firewall-group',
195
+ action='store_true',
196
+ help=_('No associated source firewall group'),
197
+ )
198
+ dst_fwg_group = parser.add_mutually_exclusive_group()
199
+ dst_fwg_group.add_argument(
200
+ '--destination-firewall-group',
201
+ metavar='<destination-firewall-group>',
202
+ help=_('Destination firewall group (name or ID)'),
203
+ )
204
+ dst_fwg_group.add_argument(
205
+ '--no-destination-firewall-group',
206
+ action='store_true',
207
+ help=_('No associated destination firewall group'),
208
+ )
209
+ return parser
210
+
211
+
212
+ def _get_common_attrs(
213
+ client_manager: Any,
214
+ parsed_args: argparse.Namespace,
215
+ is_create: bool = True,
216
+ ) -> dict[str, Any]:
217
+ attrs: dict[str, Any] = {}
218
+ client = client_manager.network
219
+ if parsed_args.name:
220
+ attrs['name'] = parsed_args.name
221
+ if parsed_args.description:
222
+ attrs['description'] = parsed_args.description
223
+ if parsed_args.protocol:
224
+ protocol = parsed_args.protocol
225
+ attrs['protocol'] = None if protocol == 'any' else protocol
226
+ if parsed_args.action:
227
+ attrs['action'] = parsed_args.action
228
+ if parsed_args.ip_version:
229
+ attrs['ip_version'] = str(parsed_args.ip_version)
230
+
231
+ if parsed_args.source_port:
232
+ attrs['source_port'] = parsed_args.source_port
233
+ if parsed_args.no_source_port:
234
+ attrs['source_port'] = None
235
+
236
+ if parsed_args.source_ip_address:
237
+ attrs['source_ip_address'] = parsed_args.source_ip_address
238
+ if parsed_args.no_source_ip_address:
239
+ attrs['source_ip_address'] = None
240
+
241
+ if parsed_args.destination_port:
242
+ attrs['destination_port'] = parsed_args.destination_port
243
+ if parsed_args.no_destination_port:
244
+ attrs['destination_port'] = None
245
+
246
+ if parsed_args.destination_ip_address:
247
+ attrs['destination_ip_address'] = parsed_args.destination_ip_address
248
+ if parsed_args.no_destination_ip_address:
249
+ attrs['destination_ip_address'] = None
250
+
251
+ if parsed_args.enabled is not None:
252
+ attrs['enabled'] = parsed_args.enabled
253
+
254
+ if parsed_args.shared is not None:
255
+ attrs['shared'] = parsed_args.shared
256
+
257
+ if parsed_args.source_firewall_group:
258
+ attrs['source_firewall_group_id'] = client.find_firewall_group(
259
+ parsed_args.source_firewall_group, ignore_missing=False
260
+ ).id
261
+ if parsed_args.no_source_firewall_group:
262
+ attrs['source_firewall_group_id'] = None
263
+
264
+ if parsed_args.destination_firewall_group:
265
+ attrs['destination_firewall_group_id'] = client.find_firewall_group(
266
+ parsed_args.destination_firewall_group, ignore_missing=False
267
+ ).id
268
+ if parsed_args.no_destination_firewall_group:
269
+ attrs['destination_firewall_group_id'] = None
270
+
271
+ return attrs
272
+
273
+
274
+ class ProtocolColumn(cliff_columns.FormattableColumn[str | None]):
275
+ def human_readable(self) -> str:
276
+ return self._value if self._value else 'any'
277
+
278
+
279
+ _formatters = {'protocol': ProtocolColumn}
280
+
281
+
282
+ class CreateFirewallRule(command.ShowOne):
283
+ _description = _("Create a new firewall rule")
284
+
285
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
286
+ parser = super().get_parser(prog_name)
287
+ _get_common_parser(parser)
288
+ # TODO(slaweq): Remove the deprecated --name option and make the
289
+ # positional name argument required (remove nargs='?') once the
290
+ # deprecation period is over.
291
+ parser.add_argument(
292
+ 'positional_name',
293
+ nargs='?',
294
+ metavar='<name>',
295
+ default=None,
296
+ help=_('Name of the firewall rule'),
297
+ )
298
+ parser.add_argument(
299
+ '--name',
300
+ metavar='<name>',
301
+ help=_(
302
+ '(Deprecated, please pass name as a positional argument) '
303
+ 'Name of the firewall rule'
304
+ ),
305
+ )
306
+ identity_utils.add_project_owner_option_to_parser(parser)
307
+ return parser
308
+
309
+ def take_action(
310
+ self, parsed_args: argparse.Namespace
311
+ ) -> tuple[Sequence[str], Iterable[Any]]:
312
+ client = self.app.client_manager.network
313
+ # TODO(slaweq): Remove this --name deprecation handling once the
314
+ # deprecation period is over.
315
+ if parsed_args.positional_name and parsed_args.name:
316
+ msg = _(
317
+ "Cannot specify name as both a positional argument "
318
+ "and with the --name option."
319
+ )
320
+ raise exceptions.CommandError(msg)
321
+ if parsed_args.name:
322
+ LOG.warning(
323
+ 'The --name option is deprecated for the "firewall group '
324
+ 'rule create" command, please pass the name as a positional '
325
+ 'argument instead.'
326
+ )
327
+ elif parsed_args.positional_name:
328
+ parsed_args.name = parsed_args.positional_name
329
+ attrs = _get_common_attrs(self.app.client_manager, parsed_args)
330
+ if 'project' in parsed_args and parsed_args.project is not None:
331
+ attrs['project_id'] = identity_common.find_project(
332
+ self.app.client_manager.identity,
333
+ parsed_args.project,
334
+ parsed_args.project_domain,
335
+ ).id
336
+ obj = client.create_firewall_rule(**attrs)
337
+ display_columns, columns = utils.get_osc_show_columns_for_sdk_resource(
338
+ obj, _attr_map_dict, ['location', 'tenant_id']
339
+ )
340
+ data = utils.get_dict_properties(obj, columns, formatters=_formatters)
341
+ return display_columns, data
342
+
343
+
344
+ class DeleteFirewallRule(command.Command):
345
+ _description = _("Delete firewall rule(s)")
346
+
347
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
348
+ parser = super().get_parser(prog_name)
349
+ parser.add_argument(
350
+ 'firewall_rule',
351
+ metavar='<firewall-rule>',
352
+ nargs='+',
353
+ help=_('Firewall rule(s) to delete (name or ID)'),
354
+ )
355
+ return parser
356
+
357
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
358
+ client = self.app.client_manager.network
359
+ result = 0
360
+ for fwr in parsed_args.firewall_rule:
361
+ try:
362
+ fwr = client.find_firewall_rule(fwr, ignore_missing=False)
363
+ client.delete_firewall_rule(fwr.id)
364
+ except Exception as e:
365
+ result += 1
366
+ LOG.error(
367
+ _(
368
+ "Failed to delete Firewall rule with "
369
+ "name or ID '%(firewall_rule)s': %(e)s"
370
+ ),
371
+ {'firewall_rule': fwr, 'e': e},
372
+ )
373
+
374
+ if result > 0:
375
+ total = len(parsed_args.firewall_rule)
376
+ msg = _(
377
+ "%(result)s of %(total)s firewall rule(s) failed to delete."
378
+ ) % {'result': result, 'total': total}
379
+ raise exceptions.CommandError(msg)
380
+
381
+
382
+ class ListFirewallRule(command.Lister):
383
+ _description = _("List firewall rules that belong to a given tenant")
384
+
385
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
386
+ parser = super().get_parser(prog_name)
387
+ parser.add_argument(
388
+ '--long',
389
+ action='store_true',
390
+ default=False,
391
+ help=_("List additional fields in output"),
392
+ )
393
+ return parser
394
+
395
+ def extend_list(
396
+ self, data: Iterable[Any], parsed_args: argparse.Namespace
397
+ ) -> list[Any]:
398
+ ext_data = []
399
+ for d in data:
400
+ protocol = d['protocol'].upper() if d['protocol'] else 'ANY'
401
+ src_ip = 'none specified'
402
+ dst_ip = 'none specified'
403
+ src_port = '(none specified)'
404
+ dst_port = '(none specified)'
405
+ if d.get('source_ip_address'):
406
+ src_ip = str(d['source_ip_address']).lower()
407
+ if d.get('source_port'):
408
+ src_port = '(' + str(d['source_port']).lower() + ')'
409
+ if d.get('destination_ip_address'):
410
+ dst_ip = str(d['destination_ip_address']).lower()
411
+ if d.get('destination_port'):
412
+ dst_port = '(' + str(d['destination_port']).lower() + ')'
413
+ action = d['action'] if d.get('action') else 'no-action'
414
+ src = 'source(port): ' + src_ip + src_port
415
+ dst = 'dest(port): ' + dst_ip + dst_port
416
+ d['summary'] = ',\n '.join([protocol, src, dst, action])
417
+ ext_data.append(d)
418
+ return ext_data
419
+
420
+ def take_action(
421
+ self, parsed_args: argparse.Namespace
422
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
423
+ client = self.app.client_manager.network
424
+ obj = client.firewall_rules()
425
+ obj_extend = self.extend_list(obj, parsed_args)
426
+ headers, columns = column_util.get_column_definitions(
427
+ list(_attr_map), long_listing=parsed_args.long
428
+ )
429
+ return (
430
+ headers,
431
+ (
432
+ utils.get_dict_properties(s, columns, formatters=_formatters)
433
+ for s in obj_extend
434
+ ),
435
+ )
436
+
437
+
438
+ class SetFirewallRule(command.Command):
439
+ _description = _("Set firewall rule properties")
440
+
441
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
442
+ parser = super().get_parser(prog_name)
443
+ _get_common_parser(parser)
444
+ parser.add_argument(
445
+ 'firewall_rule',
446
+ metavar='<firewall-rule>',
447
+ help=_('Firewall rule to set (name or ID)'),
448
+ )
449
+ parser.add_argument(
450
+ '--name',
451
+ metavar='<name>',
452
+ help=_('Name of the firewall rule'),
453
+ )
454
+ return parser
455
+
456
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
457
+ client = self.app.client_manager.network
458
+ attrs = _get_common_attrs(
459
+ self.app.client_manager, parsed_args, is_create=False
460
+ )
461
+ fwr_id = client.find_firewall_rule(
462
+ parsed_args.firewall_rule, ignore_missing=False
463
+ ).id
464
+ try:
465
+ client.update_firewall_rule(fwr_id, **attrs)
466
+ except Exception as e:
467
+ msg = _("Failed to set firewall rule '%(rule)s': %(e)s") % {
468
+ 'rule': parsed_args.firewall_rule,
469
+ 'e': e,
470
+ }
471
+ raise exceptions.CommandError(msg)
472
+
473
+
474
+ class ShowFirewallRule(command.ShowOne):
475
+ _description = _("Display firewall rule details")
476
+
477
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
478
+ parser = super().get_parser(prog_name)
479
+ parser.add_argument(
480
+ 'firewall_rule',
481
+ metavar='<firewall-rule>',
482
+ help=_('Firewall rule to display (name or ID)'),
483
+ )
484
+ return parser
485
+
486
+ def take_action(
487
+ self, parsed_args: argparse.Namespace
488
+ ) -> tuple[Sequence[str], Iterable[Any]]:
489
+ client = self.app.client_manager.network
490
+ fwr_id = client.find_firewall_rule(
491
+ parsed_args.firewall_rule, ignore_missing=False
492
+ ).id
493
+ obj = client.get_firewall_rule(fwr_id)
494
+ display_columns, columns = utils.get_osc_show_columns_for_sdk_resource(
495
+ obj, _attr_map_dict, ['location', 'tenant_id']
496
+ )
497
+ data = utils.get_dict_properties(obj, columns, formatters=_formatters)
498
+ return (display_columns, data)
499
+
500
+
501
+ class UnsetFirewallRule(command.Command):
502
+ _description = _("Unset firewall rule properties")
503
+
504
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
505
+ parser = super().get_parser(prog_name)
506
+ parser.add_argument(
507
+ 'firewall_rule',
508
+ metavar='<firewall-rule>',
509
+ help=_('Firewall rule to unset (name or ID)'),
510
+ )
511
+ parser.add_argument(
512
+ '--source-ip-address',
513
+ action='store_true',
514
+ help=_('Source IP address or subnet'),
515
+ )
516
+ parser.add_argument(
517
+ '--destination-ip-address',
518
+ action='store_true',
519
+ help=_('Destination IP address or subnet'),
520
+ )
521
+ parser.add_argument(
522
+ '--source-port',
523
+ action='store_true',
524
+ help=_(
525
+ 'Source port number or range'
526
+ '(integer in [1, 65535] or range like 123:456)'
527
+ ),
528
+ )
529
+ parser.add_argument(
530
+ '--destination-port',
531
+ action='store_true',
532
+ help=_(
533
+ 'Destination port number or range'
534
+ '(integer in [1, 65535] or range like 123:456)'
535
+ ),
536
+ )
537
+ parser.add_argument(
538
+ '--share',
539
+ action='store_true',
540
+ help=_(
541
+ '(Deprecated) Use "firewall rule set --no-share" instead. '
542
+ 'Restrict use of the firewall rule to the current project'
543
+ ),
544
+ )
545
+ parser.add_argument(
546
+ '--enable-rule',
547
+ action='store_true',
548
+ help=_(
549
+ '(Deprecated) Use "firewall rule set --disable-rule" instead. '
550
+ 'Disable this rule'
551
+ ),
552
+ )
553
+
554
+ parser.add_argument(
555
+ '--source-firewall-group',
556
+ action='store_true',
557
+ help=_('Source firewall group (name or ID)'),
558
+ )
559
+
560
+ parser.add_argument(
561
+ '--destination-firewall-group',
562
+ action='store_true',
563
+ help=_('Destination firewall group (name or ID)'),
564
+ )
565
+ return parser
566
+
567
+ def _get_attrs(
568
+ self, client_manager: Any, parsed_args: argparse.Namespace
569
+ ) -> dict[str, Any]:
570
+ attrs: dict[str, Any] = {}
571
+ if parsed_args.source_ip_address:
572
+ attrs['source_ip_address'] = None
573
+ if parsed_args.source_port:
574
+ attrs['source_port'] = None
575
+ if parsed_args.destination_ip_address:
576
+ attrs['destination_ip_address'] = None
577
+ if parsed_args.destination_port:
578
+ attrs['destination_port'] = None
579
+ if parsed_args.share:
580
+ LOG.warning(
581
+ 'The --share option is deprecated, please use '
582
+ '"firewall rule set --no-share" instead.'
583
+ )
584
+ attrs['shared'] = False
585
+ if parsed_args.enable_rule:
586
+ LOG.warning(
587
+ 'The --enable-rule option is deprecated, please use '
588
+ '"firewall rule set --disable-rule" instead.'
589
+ )
590
+ attrs['enabled'] = False
591
+ if parsed_args.source_firewall_group:
592
+ attrs['source_firewall_group_id'] = None
593
+ if parsed_args.destination_firewall_group:
594
+ attrs['destination_firewall_group_id'] = None
595
+ return attrs
596
+
597
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
598
+ client = self.app.client_manager.network
599
+ attrs = self._get_attrs(self.app.client_manager, parsed_args)
600
+ fwr_id = client.find_firewall_rule(
601
+ parsed_args.firewall_rule, ignore_missing=False
602
+ ).id
603
+ try:
604
+ client.update_firewall_rule(fwr_id, **attrs)
605
+ except Exception as e:
606
+ msg = _("Failed to unset firewall rule '%(rule)s': %(e)s") % {
607
+ 'rule': parsed_args.firewall_rule,
608
+ 'e': e,
609
+ }
610
+ raise exceptions.CommandError(msg)
@@ -13,10 +13,16 @@
13
13
 
14
14
  """IP Availability Info implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
18
+ from typing import Any
19
+
20
+ from openstack.network.v2 import network_ip_availability as _ip_availability
16
21
  from osc_lib.cli import format_columns
17
22
  from osc_lib import utils
18
23
 
19
24
  from openstackclient import command
25
+ from openstackclient.common import pagination
20
26
  from openstackclient.i18n import _
21
27
  from openstackclient.identity import common as identity_common
22
28
 
@@ -25,19 +31,19 @@ _formatters = {
25
31
  }
26
32
 
27
33
 
28
- def _get_columns(item):
34
+ def _get_columns(
35
+ item: _ip_availability.NetworkIPAvailability,
36
+ ) -> tuple[tuple[str, ...], tuple[str, ...]]:
29
37
  hidden_columns = ['id', 'name', 'location', 'tenant_id']
30
38
  return utils.get_osc_show_columns_for_sdk_resource(
31
39
  item, {}, hidden_columns
32
40
  )
33
41
 
34
42
 
35
- # TODO(ankur-gupta-f): Use the SDK resource mapped attribute names once
36
- # the OSC minimum requirements include SDK 1.0.
37
43
  class ListIPAvailability(command.Lister):
38
44
  _description = _("List IP availability for network")
39
45
 
40
- def get_parser(self, prog_name):
46
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
41
47
  parser = super().get_parser(prog_name)
42
48
  parser.add_argument(
43
49
  '--ip-version',
@@ -60,9 +66,12 @@ class ListIPAvailability(command.Lister):
60
66
  ),
61
67
  )
62
68
  identity_common.add_project_domain_option_to_parser(parser)
69
+ pagination.add_marker_pagination_option_to_parser(parser)
63
70
  return parser
64
71
 
65
- def take_action(self, parsed_args):
72
+ def take_action(
73
+ self, parsed_args: argparse.Namespace
74
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
66
75
  client = self.app.client_manager.network
67
76
 
68
77
  columns = (
@@ -81,7 +90,6 @@ class ListIPAvailability(command.Lister):
81
90
  filters = {}
82
91
  if parsed_args.ip_version:
83
92
  filters['ip_version'] = parsed_args.ip_version
84
-
85
93
  if parsed_args.project:
86
94
  identity_client = self.app.client_manager.identity
87
95
  project_id = identity_common.find_project(
@@ -90,6 +98,13 @@ class ListIPAvailability(command.Lister):
90
98
  parsed_args.project_domain,
91
99
  ).id
92
100
  filters['project_id'] = project_id
101
+ if parsed_args.marker is not None:
102
+ filters['marker'] = parsed_args.marker
103
+ if parsed_args.limit is not None:
104
+ filters['limit'] = parsed_args.limit
105
+ if parsed_args.max_items is not None:
106
+ filters['max_items'] = parsed_args.max_items
107
+
93
108
  data = client.network_ip_availabilities(**filters)
94
109
  return (
95
110
  column_headers,
@@ -106,7 +121,7 @@ class ListIPAvailability(command.Lister):
106
121
  class ShowIPAvailability(command.ShowOne):
107
122
  _description = _("Show network IP availability details")
108
123
 
109
- def get_parser(self, prog_name):
124
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
110
125
  parser = super().get_parser(prog_name)
111
126
  parser.add_argument(
112
127
  'network',
@@ -115,7 +130,9 @@ class ShowIPAvailability(command.ShowOne):
115
130
  )
116
131
  return parser
117
132
 
118
- def take_action(self, parsed_args):
133
+ def take_action(
134
+ self, parsed_args: argparse.Namespace
135
+ ) -> tuple[Sequence[str], Iterable[Any]]:
119
136
  client = self.app.client_manager.network
120
137
  network_id = client.find_network(
121
138
  parsed_args.network, ignore_missing=False