python-openstackclient 8.2.0__py3-none-any.whl → 9.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. openstackclient/api/object_store_v1.py +4 -1
  2. openstackclient/command.py +27 -0
  3. openstackclient/common/availability_zone.py +1 -1
  4. openstackclient/common/clientmanager.py +59 -21
  5. openstackclient/common/configuration.py +1 -1
  6. openstackclient/common/extension.py +1 -1
  7. openstackclient/common/limits.py +1 -1
  8. openstackclient/common/module.py +5 -3
  9. openstackclient/common/project_cleanup.py +10 -8
  10. openstackclient/common/quota.py +54 -23
  11. openstackclient/common/versions.py +1 -2
  12. openstackclient/compute/v2/agent.py +1 -1
  13. openstackclient/compute/v2/aggregate.py +6 -5
  14. openstackclient/compute/v2/console.py +5 -3
  15. openstackclient/compute/v2/console_connection.py +1 -1
  16. openstackclient/compute/v2/flavor.py +1 -1
  17. openstackclient/compute/v2/host.py +1 -1
  18. openstackclient/compute/v2/hypervisor.py +1 -1
  19. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  20. openstackclient/compute/v2/keypair.py +1 -1
  21. openstackclient/compute/v2/server.py +78 -29
  22. openstackclient/compute/v2/server_backup.py +1 -1
  23. openstackclient/compute/v2/server_event.py +1 -1
  24. openstackclient/compute/v2/server_group.py +4 -2
  25. openstackclient/compute/v2/server_image.py +1 -1
  26. openstackclient/compute/v2/server_migration.py +1 -1
  27. openstackclient/compute/v2/server_volume.py +1 -1
  28. openstackclient/compute/v2/service.py +1 -1
  29. openstackclient/compute/v2/usage.py +6 -4
  30. openstackclient/identity/common.py +33 -1
  31. openstackclient/identity/v2_0/catalog.py +3 -2
  32. openstackclient/identity/v2_0/ec2creds.py +1 -1
  33. openstackclient/identity/v2_0/endpoint.py +1 -1
  34. openstackclient/identity/v2_0/project.py +17 -7
  35. openstackclient/identity/v2_0/role.py +1 -1
  36. openstackclient/identity/v2_0/role_assignment.py +3 -3
  37. openstackclient/identity/v2_0/service.py +4 -2
  38. openstackclient/identity/v2_0/token.py +1 -1
  39. openstackclient/identity/v2_0/user.py +2 -2
  40. openstackclient/identity/v3/access_rule.py +16 -4
  41. openstackclient/identity/v3/application_credential.py +30 -10
  42. openstackclient/identity/v3/catalog.py +3 -3
  43. openstackclient/identity/v3/consumer.py +1 -1
  44. openstackclient/identity/v3/credential.py +1 -1
  45. openstackclient/identity/v3/domain.py +10 -4
  46. openstackclient/identity/v3/ec2creds.py +1 -1
  47. openstackclient/identity/v3/endpoint.py +33 -12
  48. openstackclient/identity/v3/endpoint_group.py +1 -1
  49. openstackclient/identity/v3/federation_protocol.py +40 -41
  50. openstackclient/identity/v3/group.py +11 -5
  51. openstackclient/identity/v3/identity_provider.py +12 -10
  52. openstackclient/identity/v3/implied_role.py +1 -1
  53. openstackclient/identity/v3/limit.py +86 -85
  54. openstackclient/identity/v3/mapping.py +1 -1
  55. openstackclient/identity/v3/policy.py +1 -1
  56. openstackclient/identity/v3/project.py +191 -115
  57. openstackclient/identity/v3/region.py +1 -1
  58. openstackclient/identity/v3/registered_limit.py +97 -109
  59. openstackclient/identity/v3/role.py +20 -39
  60. openstackclient/identity/v3/role_assignment.py +12 -23
  61. openstackclient/identity/v3/service.py +1 -1
  62. openstackclient/identity/v3/service_provider.py +1 -1
  63. openstackclient/identity/v3/tag.py +1 -11
  64. openstackclient/identity/v3/token.py +3 -2
  65. openstackclient/identity/v3/trust.py +4 -2
  66. openstackclient/identity/v3/unscoped_saml.py +1 -1
  67. openstackclient/identity/v3/user.py +22 -13
  68. openstackclient/image/v1/image.py +19 -16
  69. openstackclient/image/v2/cache.py +1 -1
  70. openstackclient/image/v2/image.py +16 -12
  71. openstackclient/image/v2/info.py +1 -1
  72. openstackclient/image/v2/metadef_namespaces.py +1 -1
  73. openstackclient/image/v2/metadef_objects.py +1 -1
  74. openstackclient/image/v2/metadef_properties.py +3 -2
  75. openstackclient/image/v2/metadef_resource_type_association.py +1 -1
  76. openstackclient/image/v2/metadef_resource_types.py +1 -1
  77. openstackclient/image/v2/task.py +1 -1
  78. openstackclient/network/common.py +10 -9
  79. openstackclient/network/v2/address_group.py +4 -3
  80. openstackclient/network/v2/address_scope.py +8 -6
  81. openstackclient/network/v2/default_security_group_rule.py +9 -8
  82. openstackclient/network/v2/floating_ip.py +16 -9
  83. openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
  84. openstackclient/network/v2/ip_availability.py +7 -4
  85. openstackclient/network/v2/l3_conntrack_helper.py +11 -4
  86. openstackclient/network/v2/local_ip.py +13 -7
  87. openstackclient/network/v2/local_ip_association.py +7 -4
  88. openstackclient/network/v2/ndp_proxy.py +13 -6
  89. openstackclient/network/v2/network.py +33 -16
  90. openstackclient/network/v2/network_agent.py +5 -5
  91. openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
  92. openstackclient/network/v2/network_flavor.py +1 -1
  93. openstackclient/network/v2/network_flavor_profile.py +1 -1
  94. openstackclient/network/v2/network_meter.py +1 -1
  95. openstackclient/network/v2/network_meter_rule.py +1 -1
  96. openstackclient/network/v2/network_qos_policy.py +7 -5
  97. openstackclient/network/v2/network_qos_rule.py +1 -1
  98. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  99. openstackclient/network/v2/network_rbac.py +8 -5
  100. openstackclient/network/v2/network_segment.py +2 -2
  101. openstackclient/network/v2/network_segment_range.py +13 -6
  102. openstackclient/network/v2/network_service_provider.py +1 -1
  103. openstackclient/network/v2/network_trunk.py +65 -42
  104. openstackclient/network/v2/port.py +22 -20
  105. openstackclient/network/v2/router.py +19 -8
  106. openstackclient/network/v2/security_group.py +10 -6
  107. openstackclient/network/v2/security_group_rule.py +11 -5
  108. openstackclient/network/v2/subnet.py +17 -18
  109. openstackclient/network/v2/subnet_pool.py +11 -9
  110. openstackclient/network/v2/taas/__init__.py +0 -0
  111. openstackclient/network/v2/taas/tap_flow.py +245 -0
  112. openstackclient/network/v2/taas/tap_mirror.py +237 -0
  113. openstackclient/network/v2/taas/tap_service.py +211 -0
  114. openstackclient/object/v1/account.py +1 -1
  115. openstackclient/object/v1/container.py +1 -1
  116. openstackclient/object/v1/object.py +1 -1
  117. openstackclient/shell.py +18 -8
  118. openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
  119. openstackclient/tests/functional/identity/v3/test_limit.py +47 -0
  120. openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
  121. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  122. openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
  123. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  124. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +46 -132
  125. openstackclient/tests/unit/common/test_command.py +1 -1
  126. openstackclient/tests/unit/common/test_extension.py +2 -3
  127. openstackclient/tests/unit/common/test_module.py +14 -7
  128. openstackclient/tests/unit/common/test_quota.py +79 -0
  129. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  130. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  131. openstackclient/tests/unit/compute/v2/test_flavor.py +1 -3
  132. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  133. openstackclient/tests/unit/compute/v2/test_server.py +370 -38
  134. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  135. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  136. openstackclient/tests/unit/fakes.py +35 -134
  137. openstackclient/tests/unit/identity/test_common.py +100 -0
  138. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  139. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  140. openstackclient/tests/unit/identity/v3/test_application_credential.py +3 -3
  141. openstackclient/tests/unit/identity/v3/test_domain.py +1 -1
  142. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  143. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  144. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  145. openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
  146. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  147. openstackclient/tests/unit/identity/v3/test_project.py +832 -513
  148. openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
  149. openstackclient/tests/unit/identity/v3/test_registered_limit.py +356 -221
  150. openstackclient/tests/unit/identity/v3/test_role.py +1 -82
  151. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  152. openstackclient/tests/unit/image/v2/test_image.py +116 -5
  153. openstackclient/tests/unit/network/test_common.py +9 -13
  154. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  155. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  156. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  157. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  158. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  159. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  160. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  161. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  162. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  163. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  164. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  165. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  166. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  167. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +11 -21
  168. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  169. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  170. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  171. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  172. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  173. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  174. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  175. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  176. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  177. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  178. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  179. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  180. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  181. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  182. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  183. openstackclient/tests/unit/network/v2/test_port.py +75 -86
  184. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  185. openstackclient/tests/unit/network/v2/test_security_group_network.py +19 -26
  186. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +17 -18
  187. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  188. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  189. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  190. openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
  191. openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
  192. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  193. openstackclient/tests/unit/volume/v3/test_volume.py +38 -12
  194. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  195. openstackclient/volume/client.py +7 -17
  196. openstackclient/volume/v2/backup_record.py +1 -1
  197. openstackclient/volume/v2/consistency_group.py +9 -9
  198. openstackclient/volume/v2/consistency_group_snapshot.py +3 -3
  199. openstackclient/volume/v2/qos_specs.py +3 -3
  200. openstackclient/volume/v2/service.py +1 -1
  201. openstackclient/volume/v2/volume.py +14 -7
  202. openstackclient/volume/v2/volume_backend.py +1 -1
  203. openstackclient/volume/v2/volume_backup.py +7 -5
  204. openstackclient/volume/v2/volume_host.py +1 -2
  205. openstackclient/volume/v2/volume_snapshot.py +4 -4
  206. openstackclient/volume/v2/volume_transfer_request.py +3 -3
  207. openstackclient/volume/v2/volume_type.py +16 -11
  208. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  209. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  210. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  211. openstackclient/volume/v3/block_storage_manage.py +1 -1
  212. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  213. openstackclient/volume/v3/service.py +1 -1
  214. openstackclient/volume/v3/volume.py +16 -9
  215. openstackclient/volume/v3/volume_attachment.py +6 -5
  216. openstackclient/volume/v3/volume_backup.py +20 -5
  217. openstackclient/volume/v3/volume_group.py +1 -1
  218. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  219. openstackclient/volume/v3/volume_group_type.py +1 -1
  220. openstackclient/volume/v3/volume_message.py +1 -1
  221. openstackclient/volume/v3/volume_snapshot.py +4 -4
  222. openstackclient/volume/v3/volume_transfer_request.py +3 -3
  223. openstackclient/volume/v3/volume_type.py +20 -14
  224. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/METADATA +15 -13
  225. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/RECORD +231 -219
  226. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/WHEEL +1 -1
  227. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/entry_points.txt +15 -0
  228. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/AUTHORS +15 -0
  229. python_openstackclient-9.0.0.dist-info/pbr.json +1 -0
  230. openstackclient/tests/unit/common/test_logs.py +0 -221
  231. python_openstackclient-8.2.0.dist-info/pbr.json +0 -1
  232. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/LICENSE +0 -0
  233. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/top_level.txt +0 -0
@@ -14,12 +14,13 @@
14
14
  # under the License.
15
15
 
16
16
  import logging
17
+ import typing as ty
17
18
 
18
19
  from cliff import columns as cliff_columns
19
- from osc_lib.command import command
20
20
  from osc_lib import exceptions
21
21
  from osc_lib import utils
22
22
 
23
+ from openstackclient import command
23
24
  from openstackclient.i18n import _
24
25
  from openstackclient.identity import common as identity_common
25
26
  from openstackclient.network import common
@@ -27,7 +28,7 @@ from openstackclient.network import common
27
28
  LOG = logging.getLogger(__name__)
28
29
 
29
30
 
30
- class RulesColumn(cliff_columns.FormattableColumn):
31
+ class RulesColumn(cliff_columns.FormattableColumn[ty.Any]):
31
32
  def human_readable(self):
32
33
  return '\n'.join(str(v) for v in self._value)
33
34
 
@@ -190,7 +191,8 @@ class ListNetworkQosPolicy(command.Lister):
190
191
  '--project',
191
192
  metavar='<project>',
192
193
  help=_(
193
- "List QoS policies according to their project (name or ID)"
194
+ "List only QoS policies with the specified project "
195
+ "(name or ID)"
194
196
  ),
195
197
  )
196
198
  identity_common.add_project_domain_option_to_parser(parser)
@@ -198,12 +200,12 @@ class ListNetworkQosPolicy(command.Lister):
198
200
  shared_group.add_argument(
199
201
  '--share',
200
202
  action='store_true',
201
- help=_("List QoS policies shared between projects"),
203
+ help=_("List only QoS policies shared between projects"),
202
204
  )
203
205
  shared_group.add_argument(
204
206
  '--no-share',
205
207
  action='store_true',
206
- help=_("List QoS policies not shared between projects"),
208
+ help=_("List only QoS policies not shared between projects"),
207
209
  )
208
210
  return parser
209
211
 
@@ -15,10 +15,10 @@
15
15
 
16
16
  import itertools
17
17
 
18
- from osc_lib.command import command
19
18
  from osc_lib import exceptions
20
19
  from osc_lib import utils
21
20
 
21
+ from openstackclient import command
22
22
  from openstackclient.i18n import _
23
23
  from openstackclient.network import common
24
24
 
@@ -13,9 +13,9 @@
13
13
  # License for the specific language governing permissions and limitations
14
14
  # under the License.
15
15
 
16
- from osc_lib.command import command
17
16
  from osc_lib import utils
18
17
 
18
+ from openstackclient import command
19
19
  from openstackclient.i18n import _
20
20
 
21
21
 
@@ -15,10 +15,10 @@
15
15
 
16
16
  import logging
17
17
 
18
- from osc_lib.command import command
19
18
  from osc_lib import exceptions
20
19
  from osc_lib import utils
21
20
 
21
+ from openstackclient import command
22
22
  from openstackclient.i18n import _
23
23
  from openstackclient.identity import common as identity_common
24
24
  from openstackclient.network import common
@@ -234,8 +234,8 @@ class ListNetworkRBAC(command.Lister):
234
234
  'network',
235
235
  ],
236
236
  help=_(
237
- 'List network RBAC policies according to '
238
- 'given object type ("address_group", "address_scope", '
237
+ 'List only network RBAC policies with the specified '
238
+ 'object type ("address_group", "address_scope", '
239
239
  '"security_group", "subnetpool", "qos_policy" or '
240
240
  '"network")'
241
241
  ),
@@ -245,14 +245,17 @@ class ListNetworkRBAC(command.Lister):
245
245
  metavar='<action>',
246
246
  choices=['access_as_external', 'access_as_shared'],
247
247
  help=_(
248
- 'List network RBAC policies according to given '
248
+ 'List only network RBAC policies with the specified '
249
249
  'action ("access_as_external" or "access_as_shared")'
250
250
  ),
251
251
  )
252
252
  parser.add_argument(
253
253
  '--target-project',
254
254
  metavar='<target-project>',
255
- help=_('List network RBAC policies for a specific target project'),
255
+ help=_(
256
+ 'List only network RBAC policies with the specified '
257
+ 'target project (name or ID)'
258
+ ),
256
259
  )
257
260
  parser.add_argument(
258
261
  '--long',
@@ -15,10 +15,10 @@
15
15
 
16
16
  import logging
17
17
 
18
- from osc_lib.command import command
19
18
  from osc_lib import exceptions
20
19
  from osc_lib import utils
21
20
 
21
+ from openstackclient import command
22
22
  from openstackclient.i18n import _
23
23
  from openstackclient.network import common
24
24
 
@@ -160,7 +160,7 @@ class ListNetworkSegment(command.Lister):
160
160
  '--network',
161
161
  metavar='<network>',
162
162
  help=_(
163
- 'List network segments that belong to this '
163
+ 'List only network segments associated with the specified '
164
164
  'network (name or ID)'
165
165
  ),
166
166
  )
@@ -20,10 +20,10 @@ import itertools
20
20
  import logging
21
21
  import typing as ty
22
22
 
23
- from osc_lib.command import command
24
23
  from osc_lib import exceptions
25
24
  from osc_lib import utils
26
25
 
26
+ from openstackclient import command
27
27
  from openstackclient.i18n import _
28
28
  from openstackclient.identity import common as identity_common
29
29
  from openstackclient.network import common
@@ -315,25 +315,32 @@ class ListNetworkSegmentRange(command.Lister):
315
315
  used_group.add_argument(
316
316
  '--used',
317
317
  action='store_true',
318
- help=_('List network segment ranges that have segments in use'),
318
+ help=_(
319
+ 'List only network segment ranges that have segments in use'
320
+ ),
319
321
  )
320
322
  used_group.add_argument(
321
323
  '--unused',
322
324
  action='store_true',
323
325
  help=_(
324
- 'List network segment ranges that have segments not in use'
326
+ 'List only network segment ranges that have segments '
327
+ 'not in use'
325
328
  ),
326
329
  )
327
330
  available_group = parser.add_mutually_exclusive_group()
328
331
  available_group.add_argument(
329
332
  '--available',
330
333
  action='store_true',
331
- help=_('List network segment ranges that have available segments'),
334
+ help=_(
335
+ 'List only network segment ranges that have available segments'
336
+ ),
332
337
  )
333
338
  available_group.add_argument(
334
339
  '--unavailable',
335
340
  action='store_true',
336
- help=_('List network segment ranges without available segments'),
341
+ help=_(
342
+ 'List only network segment ranges without available segments'
343
+ ),
337
344
  )
338
345
  return parser
339
346
 
@@ -395,7 +402,7 @@ class ListNetworkSegmentRange(command.Lister):
395
402
  'available',
396
403
  )
397
404
 
398
- display_props: tuple[str, ...] = tuple()
405
+ display_props: tuple[ty.Any, ...] = tuple()
399
406
  for s in data:
400
407
  props = utils.get_item_properties(s, columns)
401
408
  if (
@@ -13,9 +13,9 @@
13
13
 
14
14
  """Network Service Providers Implementation"""
15
15
 
16
- from osc_lib.command import command
17
16
  from osc_lib import utils
18
17
 
18
+ from openstackclient import command
19
19
  from openstackclient.i18n import _
20
20
 
21
21
 
@@ -23,10 +23,10 @@ from cliff import columns as cliff_columns
23
23
  from osc_lib.cli import format_columns
24
24
  from osc_lib.cli import identity as identity_utils
25
25
  from osc_lib.cli import parseractions
26
- from osc_lib.command import command
27
26
  from osc_lib import exceptions
28
27
  from osc_lib import utils as osc_utils
29
28
 
29
+ from openstackclient import command
30
30
  from openstackclient.i18n import _
31
31
 
32
32
  LOG = logging.getLogger(__name__)
@@ -36,7 +36,7 @@ TRUNKS = 'trunks'
36
36
  SUB_PORTS = 'sub_ports'
37
37
 
38
38
 
39
- class AdminStateColumn(cliff_columns.FormattableColumn):
39
+ class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
40
40
  def human_readable(self):
41
41
  return 'UP' if self._value else 'DOWN'
42
42
 
@@ -88,9 +88,12 @@ class CreateNetworkTrunk(command.ShowOne):
88
88
  return parser
89
89
 
90
90
  def take_action(self, parsed_args):
91
- client = self.app.client_manager.network
92
- attrs = _get_attrs_for_trunk(self.app.client_manager, parsed_args)
93
- obj = client.create_trunk(**attrs)
91
+ network_client = self.app.client_manager.network
92
+ identity_client = self.app.client_manager.identity
93
+ attrs = _get_attrs_for_trunk(
94
+ network_client, identity_client, parsed_args
95
+ )
96
+ obj = network_client.create_trunk(**attrs)
94
97
  display_columns, columns = _get_columns(obj)
95
98
  data = osc_utils.get_dict_properties(
96
99
  obj, columns, formatters=_formatters
@@ -112,12 +115,15 @@ class DeleteNetworkTrunk(command.Command):
112
115
  return parser
113
116
 
114
117
  def take_action(self, parsed_args):
115
- client = self.app.client_manager.network
118
+ network_client = self.app.client_manager.network
116
119
  result = 0
117
120
  for trunk in parsed_args.trunk:
118
121
  try:
119
- trunk_id = client.find_trunk(trunk).id
120
- client.delete_trunk(trunk_id)
122
+ trunk_id = network_client.find_trunk(
123
+ trunk,
124
+ ignore_missing=False,
125
+ ).id
126
+ network_client.delete_trunk(trunk_id)
121
127
  except Exception as e:
122
128
  result += 1
123
129
  LOG.error(
@@ -150,8 +156,8 @@ class ListNetworkTrunk(command.Lister):
150
156
  return parser
151
157
 
152
158
  def take_action(self, parsed_args):
153
- client = self.app.client_manager.network
154
- data = client.trunks()
159
+ network_client = self.app.client_manager.network
160
+ data = network_client.trunks()
155
161
  headers: tuple[str, ...] = ('ID', 'Name', 'Parent Port', 'Description')
156
162
  columns: tuple[str, ...] = ('id', 'name', 'port_id', 'description')
157
163
  if parsed_args.long:
@@ -215,11 +221,17 @@ class SetNetworkTrunk(command.Command):
215
221
  return parser
216
222
 
217
223
  def take_action(self, parsed_args):
218
- client = self.app.client_manager.network
219
- trunk_id = client.find_trunk(parsed_args.trunk)
220
- attrs = _get_attrs_for_trunk(self.app.client_manager, parsed_args)
224
+ network_client = self.app.client_manager.network
225
+ identity_client = self.app.client_manager.identity
226
+ trunk_id = network_client.find_trunk(
227
+ parsed_args.trunk,
228
+ ignore_missing=False,
229
+ )
230
+ attrs = _get_attrs_for_trunk(
231
+ network_client, identity_client, parsed_args
232
+ )
221
233
  try:
222
- client.update_trunk(trunk_id, **attrs)
234
+ network_client.update_trunk(trunk_id, **attrs)
223
235
  except Exception as e:
224
236
  msg = _("Failed to set trunk '%(t)s': %(e)s") % {
225
237
  't': parsed_args.trunk,
@@ -228,10 +240,10 @@ class SetNetworkTrunk(command.Command):
228
240
  raise exceptions.CommandError(msg)
229
241
  if parsed_args.set_subports:
230
242
  subport_attrs = _get_attrs_for_subports(
231
- self.app.client_manager, parsed_args
243
+ network_client, parsed_args
232
244
  )
233
245
  try:
234
- client.add_trunk_subports(trunk_id, subport_attrs)
246
+ network_client.add_trunk_subports(trunk_id, subport_attrs)
235
247
  except Exception as e:
236
248
  msg = _("Failed to add subports to trunk '%(t)s': %(e)s") % {
237
249
  't': parsed_args.trunk,
@@ -251,9 +263,12 @@ class ShowNetworkTrunk(command.ShowOne):
251
263
  return parser
252
264
 
253
265
  def take_action(self, parsed_args):
254
- client = self.app.client_manager.network
255
- trunk_id = client.find_trunk(parsed_args.trunk).id
256
- obj = client.get_trunk(trunk_id)
266
+ network_client = self.app.client_manager.network
267
+ trunk_id = network_client.find_trunk(
268
+ parsed_args.trunk,
269
+ ignore_missing=False,
270
+ ).id
271
+ obj = network_client.get_trunk(trunk_id)
257
272
  display_columns, columns = _get_columns(obj)
258
273
  data = osc_utils.get_dict_properties(
259
274
  obj, columns, formatters=_formatters
@@ -270,14 +285,17 @@ class ListNetworkSubport(command.Lister):
270
285
  '--trunk',
271
286
  required=True,
272
287
  metavar="<trunk>",
273
- help=_("List subports belonging to this trunk (name or ID)"),
288
+ help=_("List only subports belonging to this trunk (name or ID)"),
274
289
  )
275
290
  return parser
276
291
 
277
292
  def take_action(self, parsed_args):
278
- client = self.app.client_manager.network
279
- trunk_id = client.find_trunk(parsed_args.trunk)
280
- data = client.get_trunk_subports(trunk_id)
293
+ network_client = self.app.client_manager.network
294
+ trunk_id = network_client.find_trunk(
295
+ parsed_args.trunk,
296
+ ignore_missing=False,
297
+ )
298
+ data = network_client.get_trunk_subports(trunk_id)
281
299
  headers: tuple[str, ...] = (
282
300
  'Port',
283
301
  'Segmentation Type',
@@ -324,10 +342,13 @@ class UnsetNetworkTrunk(command.Command):
324
342
  return parser
325
343
 
326
344
  def take_action(self, parsed_args):
327
- client = self.app.client_manager.network
328
- attrs = _get_attrs_for_subports(self.app.client_manager, parsed_args)
329
- trunk_id = client.find_trunk(parsed_args.trunk)
330
- client.delete_trunk_subports(trunk_id, attrs)
345
+ network_client = self.app.client_manager.network
346
+ attrs = _get_attrs_for_subports(network_client, parsed_args)
347
+ trunk_id = network_client.find_trunk(
348
+ parsed_args.trunk,
349
+ ignore_missing=False,
350
+ )
351
+ network_client.delete_trunk_subports(trunk_id, attrs)
331
352
 
332
353
 
333
354
  _formatters = {
@@ -343,7 +364,7 @@ def _get_columns(item):
343
364
  )
344
365
 
345
366
 
346
- def _get_attrs_for_trunk(client_manager, parsed_args):
367
+ def _get_attrs_for_trunk(network_client, identity_client, parsed_args):
347
368
  attrs: dict[str, ty.Any] = {}
348
369
  if parsed_args.name is not None:
349
370
  attrs['name'] = str(parsed_args.name)
@@ -354,18 +375,18 @@ def _get_attrs_for_trunk(client_manager, parsed_args):
354
375
  if parsed_args.disable:
355
376
  attrs['admin_state_up'] = False
356
377
  if 'parent_port' in parsed_args and parsed_args.parent_port is not None:
357
- port_id = client_manager.network.find_port(parsed_args.parent_port)[
358
- 'id'
359
- ]
378
+ port_id = network_client.find_port(
379
+ parsed_args.parent_port,
380
+ ignore_missing=False,
381
+ ).id
360
382
  attrs['port_id'] = port_id
361
383
  if 'add_subports' in parsed_args and parsed_args.add_subports is not None:
362
384
  attrs[SUB_PORTS] = _format_subports(
363
- client_manager, parsed_args.add_subports
385
+ network_client, parsed_args.add_subports
364
386
  )
365
387
 
366
388
  # "trunk set" command doesn't support setting project.
367
389
  if 'project' in parsed_args and parsed_args.project is not None:
368
- identity_client = client_manager.identity
369
390
  project_id = identity_utils.find_project(
370
391
  identity_client,
371
392
  parsed_args.project,
@@ -376,12 +397,15 @@ def _get_attrs_for_trunk(client_manager, parsed_args):
376
397
  return attrs
377
398
 
378
399
 
379
- def _format_subports(client_manager, subports):
400
+ def _format_subports(network_client, subports):
380
401
  attrs = []
381
402
  for subport in subports:
382
403
  subport_attrs = {}
383
404
  if subport.get('port'):
384
- port_id = client_manager.network.find_port(subport['port'])['id']
405
+ port_id = network_client.find_port(
406
+ subport['port'],
407
+ ignore_missing=False,
408
+ ).id
385
409
  subport_attrs['port_id'] = port_id
386
410
  if subport.get('segmentation-id'):
387
411
  try:
@@ -400,21 +424,20 @@ def _format_subports(client_manager, subports):
400
424
  return attrs
401
425
 
402
426
 
403
- def _get_attrs_for_subports(client_manager, parsed_args):
427
+ def _get_attrs_for_subports(network_client, parsed_args):
404
428
  attrs = []
405
429
  if 'set_subports' in parsed_args and parsed_args.set_subports is not None:
406
- attrs = _format_subports(client_manager, parsed_args.set_subports)
430
+ attrs = _format_subports(network_client, parsed_args.set_subports)
407
431
  if (
408
432
  'unset_subports' in parsed_args
409
433
  and parsed_args.unset_subports is not None
410
434
  ):
411
435
  subports_list = []
412
436
  for subport in parsed_args.unset_subports:
413
- port_id = client_manager.network.find_port(subport)['id']
437
+ port_id = network_client.find_port(
438
+ subport,
439
+ ignore_missing=False,
440
+ )['id']
414
441
  subports_list.append({'port_id': port_id})
415
442
  attrs = subports_list
416
443
  return attrs
417
-
418
-
419
- def _get_id(client, id_or_name, resource):
420
- return client.find_resource(resource, str(id_or_name))['id']
@@ -22,11 +22,11 @@ import typing as ty
22
22
  from cliff import columns as cliff_columns
23
23
  from osc_lib.cli import format_columns
24
24
  from osc_lib.cli import parseractions
25
- from osc_lib.command import command
26
25
  from osc_lib import exceptions
27
26
  from osc_lib import utils
28
27
  from osc_lib.utils import tags as _tag
29
28
 
29
+ from openstackclient import command
30
30
  from openstackclient.i18n import _
31
31
  from openstackclient.identity import common as identity_common
32
32
  from openstackclient.network import common
@@ -34,7 +34,7 @@ from openstackclient.network import common
34
34
  LOG = logging.getLogger(__name__)
35
35
 
36
36
 
37
- class AdminStateColumn(cliff_columns.FormattableColumn):
37
+ class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
38
38
  def human_readable(self):
39
39
  return 'UP' if self._value else 'DOWN'
40
40
 
@@ -636,11 +636,11 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
636
636
  return parser
637
637
 
638
638
  def take_action(self, parsed_args):
639
- client = self.app.client_manager.network
640
- _network = client.find_network(
639
+ network_client = self.app.client_manager.network
640
+ network = network_client.find_network(
641
641
  parsed_args.network, ignore_missing=False
642
642
  )
643
- parsed_args.network = _network.id
643
+ parsed_args.network = network.id
644
644
  _prepare_fixed_ips(self.app.client_manager, parsed_args)
645
645
  attrs = _get_attrs(self.app.client_manager, parsed_args)
646
646
 
@@ -654,7 +654,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
654
654
 
655
655
  if parsed_args.security_groups is not None:
656
656
  attrs['security_group_ids'] = [
657
- client.find_security_group(sg, ignore_missing=False).id
657
+ network_client.find_security_group(sg, ignore_missing=False).id
658
658
  for sg in parsed_args.security_groups
659
659
  ]
660
660
 
@@ -667,7 +667,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
667
667
  attrs["extra_dhcp_opts"] = _convert_extra_dhcp_options(parsed_args)
668
668
 
669
669
  if parsed_args.qos_policy:
670
- attrs['qos_policy_id'] = client.find_qos_policy(
670
+ attrs['qos_policy_id'] = network_client.find_qos_policy(
671
671
  parsed_args.qos_policy, ignore_missing=False
672
672
  ).id
673
673
 
@@ -675,7 +675,9 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
675
675
  _validate_port_hints(parsed_args.hint)
676
676
  expanded_hints = _expand_port_hint_aliases(parsed_args.hint)
677
677
  try:
678
- client.find_extension('port-hints', ignore_missing=False)
678
+ network_client.find_extension(
679
+ 'port-hints', ignore_missing=False
680
+ )
679
681
  except Exception as e:
680
682
  msg = _('Not supported by Network API: %(e)s') % {'e': e}
681
683
  raise exceptions.CommandError(msg)
@@ -686,7 +688,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
686
688
  in expanded_hints['openvswitch']['other_config']
687
689
  ):
688
690
  try:
689
- client.find_extension(
691
+ network_client.find_extension(
690
692
  'port-hint-ovs-tx-steering', ignore_missing=False
691
693
  )
692
694
  except Exception as e:
@@ -695,7 +697,9 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
695
697
  attrs['hints'] = expanded_hints
696
698
 
697
699
  set_tags_in_post = bool(
698
- client.find_extension('tag-ports-during-bulk-creation')
700
+ network_client.find_extension(
701
+ 'tag-ports-during-bulk-creation', ignore_missing=True
702
+ )
699
703
  )
700
704
  if set_tags_in_post:
701
705
  if parsed_args.no_tag:
@@ -707,14 +711,12 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
707
711
  self._parse_extra_properties(parsed_args.extra_properties)
708
712
  )
709
713
 
710
- with common.check_missing_extension_if_error(
711
- self.app.client_manager.network, attrs
712
- ):
713
- obj = client.create_port(**attrs)
714
+ with common.check_missing_extension_if_error(network_client, attrs):
715
+ obj = network_client.create_port(**attrs)
714
716
 
715
717
  if not set_tags_in_post:
716
718
  # tags cannot be set when created, so tags need to be set later.
717
- _tag.update_tags_for_set(client, obj, parsed_args)
719
+ _tag.update_tags_for_set(network_client, obj, parsed_args)
718
720
 
719
721
  display_columns, columns = _get_columns(obj)
720
722
  data = utils.get_item_properties(obj, columns, formatters=_formatters)
@@ -808,7 +810,7 @@ class ListPort(command.Lister):
808
810
  parser.add_argument(
809
811
  '--mac-address',
810
812
  metavar='<mac-address>',
811
- help=_("List only ports with this MAC address"),
813
+ help=_("List only ports with the specified MAC address"),
812
814
  )
813
815
  parser.add_argument(
814
816
  '--long',
@@ -819,12 +821,12 @@ class ListPort(command.Lister):
819
821
  parser.add_argument(
820
822
  '--project',
821
823
  metavar='<project>',
822
- help=_("List ports according to their project (name or ID)"),
824
+ help=_("List only ports with the specified project (name or ID)"),
823
825
  )
824
826
  parser.add_argument(
825
827
  '--name',
826
828
  metavar='<name>',
827
- help=_("List ports according to their name"),
829
+ help=_("List only ports with the specified name"),
828
830
  )
829
831
  parser.add_argument(
830
832
  '--security-group',
@@ -842,7 +844,7 @@ class ListPort(command.Lister):
842
844
  metavar='<status>',
843
845
  choices=('ACTIVE', 'BUILD', 'DOWN', 'ERROR'),
844
846
  help=_(
845
- "List ports according to their status "
847
+ "List only ports with the specified status "
846
848
  "('ACTIVE', 'BUILD', 'DOWN', 'ERROR')"
847
849
  ),
848
850
  )
@@ -859,7 +861,7 @@ class ListPort(command.Lister):
859
861
  "Desired IP and/or subnet for filtering ports "
860
862
  "(name or ID): subnet=<subnet>,ip-address=<ip-address>,"
861
863
  "ip-substring=<ip-substring> "
862
- "(repeat option to set multiple fixed IP addresses)"
864
+ "(repeat option to filter multiple fixed IP addresses)"
863
865
  ),
864
866
  )
865
867
  _tag.add_tag_filtering_option_to_parser(parser, _('ports'))
@@ -23,11 +23,11 @@ import typing as ty
23
23
  from cliff import columns as cliff_columns
24
24
  from osc_lib.cli import format_columns
25
25
  from osc_lib.cli import parseractions
26
- from osc_lib.command import command
27
26
  from osc_lib import exceptions
28
27
  from osc_lib import utils
29
28
  from osc_lib.utils import tags as _tag
30
29
 
30
+ from openstackclient import command
31
31
  from openstackclient.i18n import _
32
32
  from openstackclient.identity import common as identity_common
33
33
  from openstackclient.network import common
@@ -35,12 +35,12 @@ from openstackclient.network import common
35
35
  LOG = logging.getLogger(__name__)
36
36
 
37
37
 
38
- class AdminStateColumn(cliff_columns.FormattableColumn):
38
+ class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
39
39
  def human_readable(self):
40
40
  return 'UP' if self._value else 'DOWN'
41
41
 
42
42
 
43
- class RouterInfoColumn(cliff_columns.FormattableColumn):
43
+ class RouterInfoColumn(cliff_columns.FormattableColumn[ty.Any]):
44
44
  def human_readable(self):
45
45
  try:
46
46
  return json.dumps(self._value)
@@ -48,7 +48,7 @@ class RouterInfoColumn(cliff_columns.FormattableColumn):
48
48
  return ''
49
49
 
50
50
 
51
- class RoutesColumn(cliff_columns.FormattableColumn):
51
+ class RoutesColumn(cliff_columns.FormattableColumn[ty.Any]):
52
52
  def human_readable(self):
53
53
  # Map the route keys to match --route option.
54
54
  for route in self._value or []:
@@ -89,7 +89,12 @@ def _get_columns(item):
89
89
 
90
90
 
91
91
  def is_multiple_gateways_supported(n_client):
92
- return n_client.find_extension("external-gateway-multihoming") is not None
92
+ return (
93
+ n_client.find_extension(
94
+ "external-gateway-multihoming", ignore_missing=True
95
+ )
96
+ is not None
97
+ )
93
98
 
94
99
 
95
100
  def _passed_multiple_gateways(extension_supported, external_gateways):
@@ -236,7 +241,9 @@ def _get_attrs(client_manager, parsed_args):
236
241
 
237
242
  # "router set" command doesn't support setting flavor_id.
238
243
  if 'flavor_id' in parsed_args and parsed_args.flavor_id is not None:
239
- flavor = n_client.find_flavor(parsed_args.flavor_id)
244
+ flavor = n_client.find_flavor(
245
+ parsed_args.flavor_id, ignore_missing=False
246
+ )
240
247
  attrs['flavor_id'] = flavor.id
241
248
  elif 'flavor' in parsed_args and parsed_args.flavor is not None:
242
249
  flavor = n_client.find_flavor(parsed_args.flavor, ignore_missing=False)
@@ -719,13 +726,17 @@ class ListRouter(command.Lister):
719
726
  parser.add_argument(
720
727
  '--project',
721
728
  metavar='<project>',
722
- help=_("List routers according to their project (name or ID)"),
729
+ help=_(
730
+ "List only routers with the specified project (name or ID)"
731
+ ),
723
732
  )
724
733
  identity_common.add_project_domain_option_to_parser(parser)
725
734
  parser.add_argument(
726
735
  '--agent',
727
736
  metavar='<agent-id>',
728
- help=_("List routers hosted by an agent (ID only)"),
737
+ help=_(
738
+ "List only routers hosted by the specified agent (ID only)"
739
+ ),
729
740
  )
730
741
  _tag.add_tag_filtering_option_to_parser(parser, _('routers'))
731
742