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
@@ -15,19 +15,25 @@
15
15
 
16
16
  """Common identity code"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Callable
20
+ from typing import Any, cast
21
+
18
22
  from keystoneclient import exceptions as identity_exc
19
23
  from keystoneclient.v3 import domains
20
24
  from keystoneclient.v3 import groups
21
25
  from keystoneclient.v3 import projects
22
26
  from keystoneclient.v3 import users
23
27
  from openstack import exceptions as sdk_exceptions
28
+ from openstack.identity import v3 as identity
29
+ from openstack.identity.v3 import service as _service
24
30
  from osc_lib import exceptions
25
31
  from osc_lib import utils
26
32
 
27
33
  from openstackclient.i18n import _
28
34
 
29
35
 
30
- def find_service_in_list(service_list, service_id):
36
+ def find_service_in_list(service_list: list[Any], service_id: str) -> Any:
31
37
  """Find a service by id in service list."""
32
38
 
33
39
  for service in service_list:
@@ -38,7 +44,7 @@ def find_service_in_list(service_list, service_id):
38
44
  )
39
45
 
40
46
 
41
- def find_service(identity_client, name_type_or_id):
47
+ def find_service(identity_client: Any, name_type_or_id: str) -> Any:
42
48
  """Find a service by id, name or type."""
43
49
 
44
50
  try:
@@ -74,7 +80,9 @@ def find_service(identity_client, name_type_or_id):
74
80
  raise exceptions.CommandError(msg % name_type_or_id)
75
81
 
76
82
 
77
- def find_service_sdk(identity_client, name_type_or_id):
83
+ def find_service_sdk(
84
+ identity_client: identity.Proxy, name_type_or_id: str
85
+ ) -> _service.Service:
78
86
  """Find a service by id, name or type."""
79
87
 
80
88
  try:
@@ -107,7 +115,7 @@ def find_service_sdk(identity_client, name_type_or_id):
107
115
  return service
108
116
 
109
117
 
110
- def get_resource(manager, name_type_or_id):
118
+ def get_resource(manager: Any, name_type_or_id: str) -> Any:
111
119
  # NOTE (vishakha): Due to bug #1799153 and for any another related case
112
120
  # where GET resource API does not support the filter by name,
113
121
  # osc_lib.utils.find_resource() method cannot be used because that method
@@ -126,7 +134,7 @@ def get_resource(manager, name_type_or_id):
126
134
  raise exceptions.CommandError(msg % name_type_or_id)
127
135
 
128
136
 
129
- def get_resource_by_id(manager, resource_id):
137
+ def get_resource_by_id(manager: Any, resource_id: str) -> Any:
130
138
  """Get resource by ID
131
139
 
132
140
  Raises CommandError if the resource is not found
@@ -138,7 +146,12 @@ def get_resource_by_id(manager, resource_id):
138
146
  raise exceptions.CommandError(msg.format(resource_id))
139
147
 
140
148
 
141
- def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
149
+ def _get_token_resource(
150
+ client: Any,
151
+ resource: str,
152
+ parsed_name: str,
153
+ parsed_domain: str | None = None,
154
+ ) -> str:
142
155
  """Peek into the user's auth token to get resource IDs
143
156
 
144
157
  Look into a user's token to try and find the ID of a domain, project or
@@ -174,25 +187,28 @@ def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
174
187
  if isinstance(obj, list):
175
188
  for item in obj:
176
189
  if item['name'] == parsed_name:
177
- return item['id']
190
+ return cast(str, item['id'])
178
191
  if item['id'] == parsed_name:
179
192
  return parsed_name
180
193
  return parsed_name
181
194
  return obj['id'] if obj['name'] == parsed_name else parsed_name
182
195
  # diaper defense in case parsing the token fails
183
- except Exception: # noqa
196
+ except Exception:
184
197
  return parsed_name
185
198
 
186
199
 
187
- def find_domain(identity_client, name_or_id):
200
+ def find_domain(identity_client: Any, name_or_id: str) -> domains.Domain:
188
201
  return _find_identity_resource(
189
202
  identity_client.domains, name_or_id, domains.Domain
190
203
  )
191
204
 
192
205
 
193
206
  def find_domain_id_sdk(
194
- identity_client, name_or_id, *, validate_actor_existence=True
195
- ):
207
+ identity_client: Any,
208
+ name_or_id: str,
209
+ *,
210
+ validate_actor_existence: bool = True,
211
+ ) -> str:
196
212
  return _find_sdk_id(
197
213
  identity_client.find_domain,
198
214
  name_or_id=name_or_id,
@@ -200,7 +216,11 @@ def find_domain_id_sdk(
200
216
  )
201
217
 
202
218
 
203
- def find_group(identity_client, name_or_id, domain_name_or_id=None):
219
+ def find_group(
220
+ identity_client: Any,
221
+ name_or_id: str,
222
+ domain_name_or_id: str | None = None,
223
+ ) -> groups.Group:
204
224
  if domain_name_or_id is None:
205
225
  return _find_identity_resource(
206
226
  identity_client.groups, name_or_id, groups.Group
@@ -216,12 +236,12 @@ def find_group(identity_client, name_or_id, domain_name_or_id=None):
216
236
 
217
237
 
218
238
  def find_group_id_sdk(
219
- identity_client,
220
- name_or_id,
221
- domain_name_or_id=None,
239
+ identity_client: Any,
240
+ name_or_id: str,
241
+ domain_name_or_id: str | None = None,
222
242
  *,
223
- validate_actor_existence=True,
224
- ):
243
+ validate_actor_existence: bool = True,
244
+ ) -> str:
225
245
  if domain_name_or_id is None:
226
246
  return _find_sdk_id(
227
247
  identity_client.find_group,
@@ -242,7 +262,11 @@ def find_group_id_sdk(
242
262
  )
243
263
 
244
264
 
245
- def find_project(identity_client, name_or_id, domain_name_or_id=None):
265
+ def find_project(
266
+ identity_client: Any,
267
+ name_or_id: str,
268
+ domain_name_or_id: str | None = None,
269
+ ) -> projects.Project:
246
270
  if domain_name_or_id is None:
247
271
  return _find_identity_resource(
248
272
  identity_client.projects, name_or_id, projects.Project
@@ -257,13 +281,13 @@ def find_project(identity_client, name_or_id, domain_name_or_id=None):
257
281
 
258
282
 
259
283
  def find_project_id_sdk(
260
- identity_client,
261
- name_or_id,
262
- domain_name_or_id=None,
284
+ identity_client: Any,
285
+ name_or_id: str,
286
+ domain_name_or_id: str | None = None,
263
287
  *,
264
- validate_actor_existence=True,
265
- validate_domain_actor_existence=None,
266
- ):
288
+ validate_actor_existence: bool = True,
289
+ validate_domain_actor_existence: bool | None = None,
290
+ ) -> str:
267
291
  if domain_name_or_id is None:
268
292
  return _find_sdk_id(
269
293
  identity_client.find_project,
@@ -287,7 +311,11 @@ def find_project_id_sdk(
287
311
  )
288
312
 
289
313
 
290
- def find_user(identity_client, name_or_id, domain_name_or_id=None):
314
+ def find_user(
315
+ identity_client: Any,
316
+ name_or_id: str,
317
+ domain_name_or_id: str | None = None,
318
+ ) -> users.User:
291
319
  if domain_name_or_id is None:
292
320
  return _find_identity_resource(
293
321
  identity_client.users, name_or_id, users.User
@@ -299,12 +327,12 @@ def find_user(identity_client, name_or_id, domain_name_or_id=None):
299
327
 
300
328
 
301
329
  def find_user_id_sdk(
302
- identity_client,
303
- name_or_id,
304
- domain_name_or_id=None,
330
+ identity_client: Any,
331
+ name_or_id: str,
332
+ domain_name_or_id: str | None = None,
305
333
  *,
306
- validate_actor_existence=True,
307
- ):
334
+ validate_actor_existence: bool = True,
335
+ ) -> str:
308
336
  if domain_name_or_id is None:
309
337
  return _find_sdk_id(
310
338
  identity_client.find_user,
@@ -325,8 +353,11 @@ def find_user_id_sdk(
325
353
 
326
354
 
327
355
  def _find_identity_resource(
328
- identity_client_manager, name_or_id, resource_type, **kwargs
329
- ):
356
+ identity_client_manager: Any,
357
+ name_or_id: str,
358
+ resource_type: Any,
359
+ **kwargs: Any,
360
+ ) -> Any:
330
361
  """Find a specific identity resource.
331
362
 
332
363
  Using keystoneclient's manager, attempt to find a specific resource by its
@@ -365,8 +396,12 @@ def _find_identity_resource(
365
396
 
366
397
 
367
398
  def _find_sdk_id(
368
- find_command, name_or_id, *, validate_actor_existence=True, **kwargs
369
- ):
399
+ find_command: Callable[..., Any],
400
+ name_or_id: str,
401
+ *,
402
+ validate_actor_existence: bool = True,
403
+ **kwargs: Any,
404
+ ) -> str:
370
405
  try:
371
406
  resource = find_command(
372
407
  name_or_id=name_or_id, ignore_missing=False, **kwargs
@@ -377,10 +412,10 @@ def _find_sdk_id(
377
412
  if not validate_actor_existence:
378
413
  return name_or_id
379
414
  raise exceptions.CommandError from exc
380
- return resource.id
415
+ return cast(str, resource.id)
381
416
 
382
417
 
383
- def add_user_domain_option_to_parser(parser):
418
+ def add_user_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
384
419
  parser.add_argument(
385
420
  '--user-domain',
386
421
  metavar='<user-domain>',
@@ -392,7 +427,7 @@ def add_user_domain_option_to_parser(parser):
392
427
  )
393
428
 
394
429
 
395
- def add_group_domain_option_to_parser(parser):
430
+ def add_group_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
396
431
  parser.add_argument(
397
432
  '--group-domain',
398
433
  metavar='<group-domain>',
@@ -404,21 +439,21 @@ def add_group_domain_option_to_parser(parser):
404
439
  )
405
440
 
406
441
 
407
- def add_project_domain_option_to_parser(parser, enhance_help=lambda _h: _h):
442
+ def add_project_domain_option_to_parser(
443
+ parser: argparse.ArgumentParser,
444
+ ) -> None:
408
445
  parser.add_argument(
409
446
  '--project-domain',
410
447
  metavar='<project-domain>',
411
- help=enhance_help(
412
- _(
413
- 'Domain the project belongs to (name or ID). This '
414
- 'can be used in case collisions between project '
415
- 'names exist.'
416
- )
448
+ help=_(
449
+ 'Domain the project belongs to (name or ID). This '
450
+ 'can be used in case collisions between project '
451
+ 'names exist.'
417
452
  ),
418
453
  )
419
454
 
420
455
 
421
- def add_role_domain_option_to_parser(parser):
456
+ def add_role_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
422
457
  parser.add_argument(
423
458
  '--role-domain',
424
459
  metavar='<role-domain>',
@@ -430,7 +465,7 @@ def add_role_domain_option_to_parser(parser):
430
465
  )
431
466
 
432
467
 
433
- def add_inherited_option_to_parser(parser):
468
+ def add_inherited_option_to_parser(parser: argparse.ArgumentParser) -> None:
434
469
  parser.add_argument(
435
470
  '--inherited',
436
471
  action='store_true',
@@ -441,7 +476,7 @@ def add_inherited_option_to_parser(parser):
441
476
  )
442
477
 
443
478
 
444
- def add_resource_option_to_parser(parser):
479
+ def add_resource_option_to_parser(parser: argparse.ArgumentParser) -> None:
445
480
  immutable_group = parser.add_mutually_exclusive_group()
446
481
  immutable_group.add_argument(
447
482
  '--immutable',
@@ -13,8 +13,10 @@
13
13
 
14
14
  """Identity v2 Service Catalog action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
16
18
  import logging
17
- import typing as ty
19
+ from typing import Any
18
20
 
19
21
  from cliff import columns as cliff_columns
20
22
  from osc_lib import exceptions
@@ -27,8 +29,8 @@ from openstackclient.i18n import _
27
29
  LOG = logging.getLogger(__name__)
28
30
 
29
31
 
30
- class EndpointsColumn(cliff_columns.FormattableColumn[ty.Any]):
31
- def human_readable(self):
32
+ class EndpointsColumn(cliff_columns.FormattableColumn[Any]):
33
+ def human_readable(self) -> str:
32
34
  if not self._value:
33
35
  return ""
34
36
  ret = ''
@@ -47,7 +49,9 @@ class EndpointsColumn(cliff_columns.FormattableColumn[ty.Any]):
47
49
  class ListCatalog(command.Lister):
48
50
  _description = _("List services in the service catalog")
49
51
 
50
- def take_action(self, parsed_args):
52
+ def take_action(
53
+ self, parsed_args: argparse.Namespace
54
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
51
55
  # Trigger auth if it has not happened yet
52
56
  auth_ref = self.app.client_manager.auth_ref
53
57
  if not auth_ref:
@@ -75,7 +79,7 @@ class ListCatalog(command.Lister):
75
79
  class ShowCatalog(command.ShowOne):
76
80
  _description = _("Display service catalog details")
77
81
 
78
- def get_parser(self, prog_name):
82
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
79
83
  parser = super().get_parser(prog_name)
80
84
  parser.add_argument(
81
85
  'service',
@@ -84,7 +88,9 @@ class ShowCatalog(command.ShowOne):
84
88
  )
85
89
  return parser
86
90
 
87
- def take_action(self, parsed_args):
91
+ def take_action(
92
+ self, parsed_args: argparse.Namespace
93
+ ) -> tuple[Sequence[str], Iterable[Any]]:
88
94
  # Trigger auth if it has not happened yet
89
95
  auth_ref = self.app.client_manager.auth_ref
90
96
  if not auth_ref:
@@ -108,4 +114,5 @@ class ShowCatalog(command.ShowOne):
108
114
  LOG.error(_('service %s not found\n'), parsed_args.service)
109
115
  return ((), ())
110
116
 
111
- return zip(*sorted(data.items()))
117
+ col_headers, col_data = zip(*sorted(data.items()))
118
+ return col_headers, col_data
@@ -16,7 +16,10 @@
16
16
 
17
17
  """Identity v2 EC2 Credentials action implementations"""
18
18
 
19
+ import argparse
20
+ from collections.abc import Iterable, Sequence
19
21
  import logging
22
+ from typing import Any
20
23
 
21
24
  from osc_lib import exceptions
22
25
  from osc_lib import utils
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class CreateEC2Creds(command.ShowOne):
32
35
  _description = _("Create EC2 credentials")
33
36
 
34
- def get_parser(self, prog_name):
37
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
35
38
  parser = super().get_parser(prog_name)
36
39
  parser.add_argument(
37
40
  '--project',
@@ -51,7 +54,9 @@ class CreateEC2Creds(command.ShowOne):
51
54
  )
52
55
  return parser
53
56
 
54
- def take_action(self, parsed_args):
57
+ def take_action(
58
+ self, parsed_args: argparse.Namespace
59
+ ) -> tuple[Sequence[str], Iterable[Any]]:
55
60
  identity_client = self.app.client_manager.identity
56
61
 
57
62
  if parsed_args.project:
@@ -79,13 +84,14 @@ class CreateEC2Creds(command.ShowOne):
79
84
  if 'tenant_id' in info:
80
85
  info.update({'project_id': info.pop('tenant_id')})
81
86
 
82
- return zip(*sorted(info.items()))
87
+ col_headers, col_data = zip(*sorted(info.items()))
88
+ return col_headers, col_data
83
89
 
84
90
 
85
91
  class DeleteEC2Creds(command.Command):
86
92
  _description = _("Delete EC2 credentials")
87
93
 
88
- def get_parser(self, prog_name):
94
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
89
95
  parser = super().get_parser(prog_name)
90
96
  parser.add_argument(
91
97
  'access_keys',
@@ -100,7 +106,7 @@ class DeleteEC2Creds(command.Command):
100
106
  )
101
107
  return parser
102
108
 
103
- def take_action(self, parsed_args):
109
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
104
110
  identity_client = self.app.client_manager.identity
105
111
 
106
112
  if parsed_args.user:
@@ -138,7 +144,7 @@ class DeleteEC2Creds(command.Command):
138
144
  class ListEC2Creds(command.Lister):
139
145
  _description = _("List EC2 credentials")
140
146
 
141
- def get_parser(self, prog_name):
147
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
142
148
  parser = super().get_parser(prog_name)
143
149
  parser.add_argument(
144
150
  '--user',
@@ -147,7 +153,9 @@ class ListEC2Creds(command.Lister):
147
153
  )
148
154
  return parser
149
155
 
150
- def take_action(self, parsed_args):
156
+ def take_action(
157
+ self, parsed_args: argparse.Namespace
158
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
151
159
  identity_client = self.app.client_manager.identity
152
160
 
153
161
  if parsed_args.user:
@@ -179,7 +187,7 @@ class ListEC2Creds(command.Lister):
179
187
  class ShowEC2Creds(command.ShowOne):
180
188
  _description = _("Display EC2 credentials details")
181
189
 
182
- def get_parser(self, prog_name):
190
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
183
191
  parser = super().get_parser(prog_name)
184
192
  parser.add_argument(
185
193
  'access_key',
@@ -193,7 +201,9 @@ class ShowEC2Creds(command.ShowOne):
193
201
  )
194
202
  return parser
195
203
 
196
- def take_action(self, parsed_args):
204
+ def take_action(
205
+ self, parsed_args: argparse.Namespace
206
+ ) -> tuple[Sequence[str], Iterable[Any]]:
197
207
  identity_client = self.app.client_manager.identity
198
208
 
199
209
  if parsed_args.user:
@@ -213,4 +223,5 @@ class ShowEC2Creds(command.ShowOne):
213
223
  if 'tenant_id' in info:
214
224
  info.update({'project_id': info.pop('tenant_id')})
215
225
 
216
- return zip(*sorted(info.items()))
226
+ col_headers, col_data = zip(*sorted(info.items()))
227
+ return col_headers, col_data
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Endpoint action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
21
+ from typing import Any
19
22
 
20
23
  from osc_lib import exceptions
21
24
  from osc_lib import utils
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class CreateEndpoint(command.ShowOne):
32
35
  _description = _("Create new endpoint")
33
36
 
34
- def get_parser(self, prog_name):
37
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
35
38
  parser = super().get_parser(prog_name)
36
39
  parser.add_argument(
37
40
  'service',
@@ -61,7 +64,9 @@ class CreateEndpoint(command.ShowOne):
61
64
  )
62
65
  return parser
63
66
 
64
- def take_action(self, parsed_args):
67
+ def take_action(
68
+ self, parsed_args: argparse.Namespace
69
+ ) -> tuple[Sequence[str], Iterable[Any]]:
65
70
  identity_client = self.app.client_manager.identity
66
71
  service = common.find_service(identity_client, parsed_args.service)
67
72
  endpoint = identity_client.endpoints.create(
@@ -76,13 +81,14 @@ class CreateEndpoint(command.ShowOne):
76
81
  info.update(endpoint._info)
77
82
  info['service_name'] = service.name
78
83
  info['service_type'] = service.type
79
- return zip(*sorted(info.items()))
84
+ col_headers, col_data = zip(*sorted(info.items()))
85
+ return col_headers, col_data
80
86
 
81
87
 
82
88
  class DeleteEndpoint(command.Command):
83
89
  _description = _("Delete endpoint(s)")
84
90
 
85
- def get_parser(self, prog_name):
91
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
86
92
  parser = super().get_parser(prog_name)
87
93
  parser.add_argument(
88
94
  'endpoints',
@@ -92,7 +98,7 @@ class DeleteEndpoint(command.Command):
92
98
  )
93
99
  return parser
94
100
 
95
- def take_action(self, parsed_args):
101
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
96
102
  identity_client = self.app.client_manager.identity
97
103
 
98
104
  result = 0
@@ -121,7 +127,7 @@ class DeleteEndpoint(command.Command):
121
127
  class ListEndpoint(command.Lister):
122
128
  _description = _("List endpoints")
123
129
 
124
- def get_parser(self, prog_name):
130
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
125
131
  parser = super().get_parser(prog_name)
126
132
  parser.add_argument(
127
133
  '--long',
@@ -131,7 +137,9 @@ class ListEndpoint(command.Lister):
131
137
  )
132
138
  return parser
133
139
 
134
- def take_action(self, parsed_args):
140
+ def take_action(
141
+ self, parsed_args: argparse.Namespace
142
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
135
143
  identity_client = self.app.client_manager.identity
136
144
 
137
145
  columns: tuple[str, ...] = (
@@ -168,7 +176,7 @@ class ListEndpoint(command.Lister):
168
176
  class ShowEndpoint(command.ShowOne):
169
177
  _description = _("Display endpoint details")
170
178
 
171
- def get_parser(self, prog_name):
179
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
172
180
  parser = super().get_parser(prog_name)
173
181
  parser.add_argument(
174
182
  'endpoint_or_service',
@@ -180,7 +188,9 @@ class ShowEndpoint(command.ShowOne):
180
188
  )
181
189
  return parser
182
190
 
183
- def take_action(self, parsed_args):
191
+ def take_action(
192
+ self, parsed_args: argparse.Namespace
193
+ ) -> tuple[Sequence[str], Iterable[Any]]:
184
194
  identity_client = self.app.client_manager.identity
185
195
  data = identity_client.endpoints.list()
186
196
  match = None
@@ -196,9 +206,11 @@ class ShowEndpoint(command.ShowOne):
196
206
  if ep.service_id == service.id:
197
207
  match = ep
198
208
  if match is None:
199
- return None
209
+ return ((), ())
210
+
200
211
  info = {}
201
212
  info.update(match._info)
202
213
  info['service_name'] = service.name
203
214
  info['service_type'] = service.type
204
- return zip(*sorted(info.items()))
215
+ col_headers, col_data = zip(*sorted(info.items()))
216
+ return col_headers, col_data