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,504 @@
1
+ # Copyright (c) 2017 Juniper networks Inc.
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 openstack.network.v2 import (
22
+ bgpvpn_port_association as _bgpvpn_port_association,
23
+ )
24
+ from osc_lib.cli import format_columns
25
+ from osc_lib.cli import identity as osc_id
26
+ from osc_lib.cli import parseractions
27
+ from osc_lib import exceptions
28
+ from osc_lib import utils as osc_utils
29
+ from osc_lib.utils import columns as column_util
30
+
31
+ from openstackclient import command
32
+ from openstackclient.i18n import _
33
+
34
+ LOG = logging.getLogger(__name__)
35
+
36
+ _attr_map = (
37
+ ('id', 'ID', column_util.LIST_BOTH),
38
+ ('project_id', 'Project', column_util.LIST_LONG_ONLY),
39
+ ('port_id', 'Port ID', column_util.LIST_BOTH),
40
+ (
41
+ 'prefix_routes',
42
+ 'Prefix Routes (BGP LOCAL_PREF)',
43
+ column_util.LIST_LONG_ONLY,
44
+ ),
45
+ (
46
+ 'bgpvpn_routes',
47
+ 'BGP VPN Routes (BGP LOCAL_PREF)',
48
+ column_util.LIST_LONG_ONLY,
49
+ ),
50
+ (
51
+ 'advertise_fixed_ips',
52
+ "Advertise Port's Fixed IPs",
53
+ column_util.LIST_LONG_ONLY,
54
+ ),
55
+ )
56
+ _formatters = {
57
+ 'prefix_routes': format_columns.ListColumn,
58
+ 'bgpvpn_routes': format_columns.ListColumn,
59
+ }
60
+
61
+
62
+ def _get_columns(
63
+ item: _bgpvpn_port_association.BgpVpnPortAssociation,
64
+ ) -> tuple[tuple[str, ...], tuple[str, ...]]:
65
+ column_map: dict[str, str] = {}
66
+ hidden_columns = ['location', 'name', 'tenant_id']
67
+ return osc_utils.get_osc_show_columns_for_sdk_resource(
68
+ item, column_map, hidden_columns
69
+ )
70
+
71
+
72
+ def _transform_resource(data: Any) -> Any:
73
+ """Transforms BGP VPN port association routes property.
74
+
75
+ Separates the two route types and formats them with ListColumn.
76
+
77
+ {'routes':
78
+ [
79
+ {'type': 'prefix', 'local_pref': 100, 'prefix': '8.8.8.0/27'},
80
+ {'type': 'bgpvpn', 'local_pref': 50,
81
+ 'bgpvpn': '157d72a9-9968-48e7-8087-6c9a9bc7a181'},
82
+ ],
83
+ }
84
+
85
+ to
86
+
87
+ {
88
+ 'prefix_routes': ['8.8.8.0/27 (100)'],
89
+ 'bgpvpn_routes': ['157d72a9-9968-48e7-8087-6c9a9bc7a181 (50)'],
90
+ }
91
+ """
92
+ for route in data.get('routes', []):
93
+ local_pref = ''
94
+ if route.get('local_pref'):
95
+ local_pref = ' ({local_pref})'
96
+ if route['type'] == 'prefix':
97
+ data.setdefault('prefix_routes', []).append(
98
+ '{}{}'.format(route['prefix'], local_pref)
99
+ )
100
+ elif route['type'] == 'bgpvpn':
101
+ data.setdefault('bgpvpn_routes', []).append(
102
+ '{}{}'.format(route['bgpvpn_id'], local_pref)
103
+ )
104
+ else:
105
+ LOG.warning("Unknown route type %s (%s).", route['type'], route)
106
+ data.pop('routes', None)
107
+ return data
108
+
109
+
110
+ def _get_common_parser(parser: argparse.ArgumentParser, action: str) -> None:
111
+ """Adds to parser arguments common to create, set and unset commands.
112
+
113
+ :params ArgumentParser parser: argparse object contains all command's
114
+ arguments
115
+ :params string action: 'create', 'set' or 'unset'
116
+ """
117
+ ADVERTISE_ROUTE = _(
118
+ "Fixed IPs of the port will be advertised to the BGP VPN%s"
119
+ ) % (_(' (default)') if action == 'create' else "")
120
+ NOT_ADVERTISE_ROUTE = _(
121
+ "Fixed IPs of the port will not be advertised to the BGP VPN"
122
+ )
123
+
124
+ LOCAL_PREF_VALUE = _(
125
+ ". Optionally, can control the value of the BGP "
126
+ "LOCAL_PREF of the routes that will be "
127
+ "advertised"
128
+ )
129
+
130
+ ADD_PREFIX_ROUTE = (
131
+ _("Add prefix route in CIDR notation%s") % LOCAL_PREF_VALUE
132
+ )
133
+ REMOVE_PREFIX_ROUTE = _("Remove prefix route in CIDR notation")
134
+ REPEAT_PREFIX_ROUTE = _("repeat option for multiple prefix routes")
135
+
136
+ ADD_BGVPVPN_ROUTE = (
137
+ _("Add BGP VPN route for route leaking%s") % LOCAL_PREF_VALUE
138
+ )
139
+ REMOVE_BGPVPN_ROUTE = _("Remove BGP VPN route")
140
+ REPEAT_BGPVPN_ROUTE = _("repeat option for multiple BGP VPN routes")
141
+
142
+ group_advertise_fixed_ips = parser.add_mutually_exclusive_group()
143
+ group_advertise_fixed_ips.add_argument(
144
+ '--advertise-fixed-ips',
145
+ action='store_true',
146
+ help=NOT_ADVERTISE_ROUTE if action == 'unset' else ADVERTISE_ROUTE,
147
+ )
148
+ group_advertise_fixed_ips.add_argument(
149
+ '--no-advertise-fixed-ips',
150
+ action='store_true',
151
+ help=ADVERTISE_ROUTE if action == 'unset' else NOT_ADVERTISE_ROUTE,
152
+ )
153
+
154
+ if action in ['create', 'set']:
155
+ parser.add_argument(
156
+ '--prefix-route',
157
+ metavar="prefix=<cidr>[,local_pref=<integer>]",
158
+ dest='prefix_routes',
159
+ action=parseractions.MultiKeyValueAction,
160
+ required_keys=['prefix'],
161
+ optional_keys=['local_pref'],
162
+ help=f"{ADD_PREFIX_ROUTE} ({REPEAT_PREFIX_ROUTE})",
163
+ )
164
+ parser.add_argument(
165
+ '--bgpvpn-route',
166
+ metavar="bgpvpn=<BGP VPN ID or name>[,local_pref=<integer>]",
167
+ dest='bgpvpn_routes',
168
+ action=parseractions.MultiKeyValueAction,
169
+ required_keys=['bgpvpn'],
170
+ optional_keys=['local_pref'],
171
+ help=f"{ADD_BGVPVPN_ROUTE} ({REPEAT_BGPVPN_ROUTE})",
172
+ )
173
+ else:
174
+ parser.add_argument(
175
+ '--prefix-route',
176
+ metavar="<cidr>",
177
+ dest='prefix_routes',
178
+ action='append',
179
+ help=f"{REMOVE_PREFIX_ROUTE} ({REPEAT_PREFIX_ROUTE})",
180
+ )
181
+ parser.add_argument(
182
+ '--bgpvpn-route',
183
+ metavar="<BGP VPN ID or name>",
184
+ dest='bgpvpn_routes',
185
+ action='append',
186
+ help=f"{REMOVE_BGPVPN_ROUTE} ({REPEAT_BGPVPN_ROUTE})",
187
+ )
188
+ if action != 'create':
189
+ parser.add_argument(
190
+ '--no-prefix-route' if action == 'set' else '--all-prefix-routes',
191
+ dest='purge_prefix_route',
192
+ action='store_true',
193
+ help=_('Empty prefix route list'),
194
+ )
195
+ parser.add_argument(
196
+ '--no-bgpvpn-route' if action == 'set' else '--all-bgpvpn-routes',
197
+ dest='purge_bgpvpn_route',
198
+ action='store_true',
199
+ help=_('Empty BGP VPN route list'),
200
+ )
201
+
202
+
203
+ def _args2body(
204
+ client: Any, action: str, bgpvpn_id: str, args: argparse.Namespace
205
+ ) -> dict[str, Any]:
206
+ attrs: dict[str, Any] = {}
207
+
208
+ if action != 'create':
209
+ assoc = client.find_bgpvpn_port_association(
210
+ args.port_association_id,
211
+ bgpvpn_id=bgpvpn_id,
212
+ ignore_missing=False,
213
+ )
214
+ else:
215
+ assoc = {'routes': []}
216
+
217
+ if args.advertise_fixed_ips:
218
+ attrs['advertise_fixed_ips'] = action != 'unset'
219
+ elif args.no_advertise_fixed_ips:
220
+ attrs['advertise_fixed_ips'] = action == 'unset'
221
+
222
+ prefix_routes: dict[str, Any] | None = None
223
+ if 'purge_prefix_route' in args and args.purge_prefix_route:
224
+ prefix_routes = {}
225
+ else:
226
+ prefix_routes = {
227
+ r['prefix']: r.get('local_pref')
228
+ for r in assoc['routes']
229
+ if r['type'] == 'prefix'
230
+ }
231
+ if args.prefix_routes:
232
+ if action in ['create', 'set']:
233
+ prefix_routes.update(
234
+ {
235
+ r['prefix']: r.get('local_pref')
236
+ for r in args.prefix_routes
237
+ }
238
+ )
239
+ elif action == 'unset':
240
+ for prefix in args.prefix_routes:
241
+ prefix_routes.pop(prefix, None)
242
+
243
+ bgpvpn_routes: dict[str, Any] | None = None
244
+ if 'purge_bgpvpn_route' in args and args.purge_bgpvpn_route:
245
+ bgpvpn_routes = {}
246
+ else:
247
+ bgpvpn_routes = {
248
+ r['bgpvpn_id']: r.get('local_pref')
249
+ for r in assoc['routes']
250
+ if r['type'] == 'bgpvpn'
251
+ }
252
+ if args.bgpvpn_routes:
253
+ if action == 'unset':
254
+ routes = [{'bgpvpn': bgpvpn} for bgpvpn in args.bgpvpn_routes]
255
+ else:
256
+ routes = args.bgpvpn_routes
257
+ args_bgpvpn_routes = {
258
+ client.find_bgpvpn(
259
+ r['bgpvpn'], ignore_missing=False
260
+ ).id: r.get('local_pref')
261
+ for r in routes
262
+ }
263
+ if action in ['create', 'set']:
264
+ bgpvpn_routes.update(args_bgpvpn_routes)
265
+ elif action == 'unset':
266
+ for bgpvpn_id in args_bgpvpn_routes:
267
+ bgpvpn_routes.pop(bgpvpn_id, None)
268
+
269
+ if prefix_routes is not None and not prefix_routes:
270
+ attrs.setdefault('routes', [])
271
+ elif prefix_routes is not None:
272
+ for prefix, local_pref in prefix_routes.items():
273
+ route: dict[str, Any] = {
274
+ 'type': 'prefix',
275
+ 'prefix': prefix,
276
+ }
277
+ if local_pref:
278
+ route['local_pref'] = int(local_pref)
279
+ attrs.setdefault('routes', []).append(route)
280
+ if bgpvpn_routes is not None and not bgpvpn_routes:
281
+ attrs.setdefault('routes', [])
282
+ elif bgpvpn_routes is not None:
283
+ for bgpvpn_id, local_pref in bgpvpn_routes.items():
284
+ route = {
285
+ 'type': 'bgpvpn',
286
+ 'bgpvpn_id': bgpvpn_id,
287
+ }
288
+ if local_pref:
289
+ route['local_pref'] = int(local_pref)
290
+ attrs.setdefault('routes', []).append(route)
291
+
292
+ return attrs
293
+
294
+
295
+ class CreateBgpvpnPortAssoc(command.ShowOne):
296
+ _description = _("Create a BGP VPN port association")
297
+
298
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
299
+ parser = super().get_parser(prog_name)
300
+ osc_id.add_project_owner_option_to_parser(parser)
301
+ parser.add_argument(
302
+ 'bgpvpn',
303
+ metavar="<bgpvpn>",
304
+ help=_("BGP VPN to apply the port association (name or ID)"),
305
+ )
306
+ parser.add_argument(
307
+ 'port',
308
+ metavar="<port>",
309
+ help=_("Port to associate the BGP VPN (name or ID)"),
310
+ )
311
+ _get_common_parser(parser, 'create')
312
+ return parser
313
+
314
+ def take_action(
315
+ self, parsed_args: argparse.Namespace
316
+ ) -> tuple[Sequence[str], Iterable[Any]]:
317
+ client = self.app.client_manager.network
318
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
319
+ port = client.find_port(parsed_args.port, ignore_missing=False)
320
+ body: dict[str, Any] = {'port_id': port['id']}
321
+ if 'project' in parsed_args and parsed_args.project is not None:
322
+ project_id = osc_id.find_project(
323
+ self.app.client_manager.sdk_connection,
324
+ parsed_args.project,
325
+ parsed_args.project_domain,
326
+ ).id
327
+ body['project_id'] = project_id
328
+
329
+ body.update(_args2body(client, 'create', bgpvpn['id'], parsed_args))
330
+
331
+ obj = client.create_bgpvpn_port_association(bgpvpn['id'], **body)
332
+ _transform_resource(obj)
333
+ display_columns, columns = _get_columns(obj)
334
+ data = osc_utils.get_dict_properties(
335
+ obj, columns, formatters=_formatters
336
+ )
337
+ return display_columns, data
338
+
339
+
340
+ class SetBgpvpnPortAssoc(command.Command):
341
+ _description = _("Set BGP VPN port association properties")
342
+ _action = 'set'
343
+
344
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
345
+ parser = super().get_parser(prog_name)
346
+ parser.add_argument(
347
+ 'port_association_id',
348
+ metavar="<port association ID>",
349
+ help=_("Port association ID to update"),
350
+ )
351
+ parser.add_argument(
352
+ 'bgpvpn',
353
+ metavar="<bgpvpn>",
354
+ help=_("BGP VPN the port association belongs to (name or ID)"),
355
+ )
356
+ _get_common_parser(parser, self._action)
357
+ return parser
358
+
359
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
360
+ client = self.app.client_manager.network
361
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
362
+ body = _args2body(client, self._action, bgpvpn['id'], parsed_args)
363
+ client.update_bgpvpn_port_association(
364
+ bgpvpn['id'], parsed_args.port_association_id, **body
365
+ )
366
+
367
+
368
+ class UnsetBgpvpnPortAssoc(SetBgpvpnPortAssoc):
369
+ _description = _("Unset BGP VPN port association properties")
370
+ _action = 'unset'
371
+
372
+
373
+ class DeleteBgpvpnPortAssoc(command.Command):
374
+ _description = _(
375
+ "Delete a BGP VPN port association(s) for a given BGP VPN"
376
+ )
377
+
378
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
379
+ parser = super().get_parser(prog_name)
380
+ parser.add_argument(
381
+ 'port_association_ids',
382
+ metavar="<port association ID>",
383
+ nargs="+",
384
+ help=_("Port association ID(s) to remove"),
385
+ )
386
+ parser.add_argument(
387
+ 'bgpvpn',
388
+ metavar="<bgpvpn>",
389
+ help=_("BGP VPN the port association belongs to (name or ID)"),
390
+ )
391
+ return parser
392
+
393
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
394
+ client = self.app.client_manager.network
395
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
396
+ fails = 0
397
+ for id in parsed_args.port_association_ids:
398
+ try:
399
+ client.delete_bgpvpn_port_association(bgpvpn['id'], id)
400
+ LOG.warning(
401
+ "Port association %(id)s deleted",
402
+ {'id': id},
403
+ )
404
+ except Exception as e:
405
+ fails += 1
406
+ LOG.error(
407
+ "Failed to delete port "
408
+ "association with ID '%(id)s': %(e)s",
409
+ {'id': id, 'e': e},
410
+ )
411
+ if fails > 0:
412
+ msg = _(
413
+ "Failed to delete %(fails)s of %(total)s "
414
+ "port BGP VPN association(s)."
415
+ ) % {
416
+ 'fails': fails,
417
+ 'total': len(parsed_args.port_association_ids),
418
+ }
419
+ raise exceptions.CommandError(msg)
420
+
421
+
422
+ class ListBgpvpnPortAssoc(command.Lister):
423
+ _description = _("List BGP VPN port associations for a given BGP VPN")
424
+
425
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
426
+ parser = super().get_parser(prog_name)
427
+ parser.add_argument(
428
+ 'bgpvpn',
429
+ metavar="<bgpvpn>",
430
+ help=_("BGP VPN listed associations belong to (name or ID)"),
431
+ )
432
+ parser.add_argument(
433
+ '--long',
434
+ action='store_true',
435
+ help=_("List additional fields in output"),
436
+ )
437
+ parser.add_argument(
438
+ '--property',
439
+ metavar="<key=value>",
440
+ help=_(
441
+ "Filter property to apply on returned BGP VPNs (repeat to "
442
+ "filter on multiple properties)"
443
+ ),
444
+ action=parseractions.KeyValueAction,
445
+ )
446
+ return parser
447
+
448
+ def take_action(
449
+ self, parsed_args: argparse.Namespace
450
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
451
+ client = self.app.client_manager.network
452
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
453
+ params = {}
454
+ if parsed_args.property:
455
+ params.update(parsed_args.property)
456
+ objs = client.bgpvpn_port_associations(
457
+ bgpvpn['id'], retrieve_all=True, **params
458
+ )
459
+ transformed_objs = [_transform_resource(obj) for obj in objs]
460
+ headers, columns = column_util.get_column_definitions(
461
+ list(_attr_map), long_listing=parsed_args.long
462
+ )
463
+ return (
464
+ headers,
465
+ (
466
+ osc_utils.get_dict_properties(
467
+ s, columns, formatters=_formatters
468
+ )
469
+ for s in transformed_objs
470
+ ),
471
+ )
472
+
473
+
474
+ class ShowBgpvpnPortAssoc(command.ShowOne):
475
+ _description = _("Show information of a given BGP VPN port association")
476
+
477
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
478
+ parser = super().get_parser(prog_name)
479
+ parser.add_argument(
480
+ 'port_association_id',
481
+ metavar="<port association ID>",
482
+ help=_("Port association ID to look up"),
483
+ )
484
+ parser.add_argument(
485
+ 'bgpvpn',
486
+ metavar="<bgpvpn>",
487
+ help=_("BGP VPN the association belongs to (name or ID)"),
488
+ )
489
+ return parser
490
+
491
+ def take_action(
492
+ self, parsed_args: argparse.Namespace
493
+ ) -> tuple[Sequence[str], Iterable[Any]]:
494
+ client = self.app.client_manager.network
495
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
496
+ obj = client.get_bgpvpn_port_association(
497
+ bgpvpn['id'], parsed_args.port_association_id
498
+ )
499
+ _transform_resource(obj)
500
+ display_columns, columns = _get_columns(obj)
501
+ data = osc_utils.get_dict_properties(
502
+ obj, columns, formatters=_formatters
503
+ )
504
+ return display_columns, data