python-openstackclient 8.2.0__py3-none-any.whl → 8.3.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 (226) 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 +4 -2
  9. openstackclient/common/project_cleanup.py +10 -8
  10. openstackclient/common/quota.py +23 -6
  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 +76 -27
  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 +2 -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 +1 -1
  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 +1 -1
  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 +1 -1
  54. openstackclient/identity/v3/mapping.py +1 -1
  55. openstackclient/identity/v3/policy.py +1 -1
  56. openstackclient/identity/v3/project.py +10 -3
  57. openstackclient/identity/v3/region.py +1 -1
  58. openstackclient/identity/v3/registered_limit.py +16 -11
  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 +3 -2
  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 +14 -11
  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_role_assignment.py +174 -0
  120. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  121. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  122. openstackclient/tests/unit/common/test_command.py +1 -1
  123. openstackclient/tests/unit/common/test_extension.py +2 -3
  124. openstackclient/tests/unit/common/test_module.py +14 -7
  125. openstackclient/tests/unit/common/test_quota.py +20 -0
  126. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  127. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  128. openstackclient/tests/unit/compute/v2/test_flavor.py +1 -3
  129. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  130. openstackclient/tests/unit/compute/v2/test_server.py +364 -30
  131. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  132. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  133. openstackclient/tests/unit/fakes.py +35 -134
  134. openstackclient/tests/unit/identity/test_common.py +100 -0
  135. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  136. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  137. openstackclient/tests/unit/identity/v3/test_application_credential.py +3 -3
  138. openstackclient/tests/unit/identity/v3/test_domain.py +1 -1
  139. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  140. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  141. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  142. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  143. openstackclient/tests/unit/identity/v3/test_project.py +1 -1
  144. openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
  145. openstackclient/tests/unit/identity/v3/test_role.py +1 -82
  146. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  147. openstackclient/tests/unit/image/v2/test_image.py +111 -0
  148. openstackclient/tests/unit/network/test_common.py +9 -13
  149. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  150. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  151. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  152. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  153. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  154. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  155. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  156. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  157. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  158. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  159. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  160. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  161. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  162. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +11 -21
  163. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  164. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  165. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  166. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  167. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  168. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  169. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  170. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  171. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  172. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  173. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  174. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  175. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  176. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  177. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  178. openstackclient/tests/unit/network/v2/test_port.py +75 -86
  179. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  180. openstackclient/tests/unit/network/v2/test_security_group_network.py +19 -26
  181. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +17 -18
  182. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  183. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  184. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  185. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  186. openstackclient/tests/unit/volume/v3/test_volume.py +4 -0
  187. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  188. openstackclient/volume/client.py +7 -17
  189. openstackclient/volume/v2/backup_record.py +1 -1
  190. openstackclient/volume/v2/consistency_group.py +1 -1
  191. openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
  192. openstackclient/volume/v2/qos_specs.py +1 -1
  193. openstackclient/volume/v2/service.py +1 -1
  194. openstackclient/volume/v2/volume.py +2 -2
  195. openstackclient/volume/v2/volume_backend.py +1 -1
  196. openstackclient/volume/v2/volume_backup.py +5 -3
  197. openstackclient/volume/v2/volume_host.py +1 -2
  198. openstackclient/volume/v2/volume_snapshot.py +2 -2
  199. openstackclient/volume/v2/volume_transfer_request.py +1 -1
  200. openstackclient/volume/v2/volume_type.py +11 -6
  201. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  202. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  203. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  204. openstackclient/volume/v3/block_storage_manage.py +1 -1
  205. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  206. openstackclient/volume/v3/service.py +1 -1
  207. openstackclient/volume/v3/volume.py +2 -2
  208. openstackclient/volume/v3/volume_attachment.py +6 -5
  209. openstackclient/volume/v3/volume_backup.py +18 -3
  210. openstackclient/volume/v3/volume_group.py +1 -1
  211. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  212. openstackclient/volume/v3/volume_group_type.py +1 -1
  213. openstackclient/volume/v3/volume_message.py +1 -1
  214. openstackclient/volume/v3/volume_snapshot.py +2 -2
  215. openstackclient/volume/v3/volume_transfer_request.py +1 -1
  216. openstackclient/volume/v3/volume_type.py +15 -9
  217. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +15 -13
  218. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +224 -213
  219. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
  220. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
  221. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +10 -0
  222. python_openstackclient-8.3.0.dist-info/pbr.json +1 -0
  223. openstackclient/tests/unit/common/test_logs.py +0 -221
  224. python_openstackclient-8.2.0.dist-info/pbr.json +0 -1
  225. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/LICENSE +0 -0
  226. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
@@ -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
 
@@ -14,13 +14,14 @@
14
14
  """Security Group action implementations"""
15
15
 
16
16
  import argparse
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 utils
21
21
  from osc_lib.utils import tags as _tag
22
22
 
23
23
  from openstackclient.api import compute_v2
24
+ from openstackclient import command
24
25
  from openstackclient.i18n import _
25
26
  from openstackclient.identity import common as identity_common
26
27
  from openstackclient.network import common
@@ -65,12 +66,12 @@ def _format_compute_security_group_rules(sg_rules):
65
66
  return utils.format_list(rules, separator='\n')
66
67
 
67
68
 
68
- class NetworkSecurityGroupRulesColumn(cliff_columns.FormattableColumn):
69
+ class NetworkSecurityGroupRulesColumn(cliff_columns.FormattableColumn[ty.Any]):
69
70
  def human_readable(self):
70
71
  return _format_network_security_group_rules(self._value)
71
72
 
72
73
 
73
- class ComputeSecurityGroupRulesColumn(cliff_columns.FormattableColumn):
74
+ class ComputeSecurityGroupRulesColumn(cliff_columns.FormattableColumn[ty.Any]):
74
75
  def human_readable(self):
75
76
  return _format_compute_security_group_rules(self._value)
76
77
 
@@ -246,7 +247,10 @@ class ListSecurityGroup(common.NetworkAndComputeLister):
246
247
  '--project',
247
248
  metavar='<project>',
248
249
  help=self.enhance_help_neutron(
249
- _("List security groups according to the project (name or ID)")
250
+ _(
251
+ "List only security groups with the specified project "
252
+ "(name or ID)"
253
+ )
250
254
  ),
251
255
  )
252
256
  identity_common.add_project_domain_option_to_parser(
@@ -259,14 +263,14 @@ class ListSecurityGroup(common.NetworkAndComputeLister):
259
263
  action='store_true',
260
264
  dest='shared',
261
265
  default=None,
262
- help=_("List security groups shared between projects"),
266
+ help=_("List only security groups shared between projects"),
263
267
  )
264
268
  shared_group.add_argument(
265
269
  '--no-share',
266
270
  action='store_false',
267
271
  dest='shared',
268
272
  default=None,
269
- help=_("List security groups not shared between projects"),
273
+ help=_("List only security groups not shared between projects"),
270
274
  )
271
275
 
272
276
  _tag.add_tag_filtering_option_to_parser(
@@ -387,7 +387,8 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
387
387
  type=network_utils.convert_to_lowercase,
388
388
  help=self.enhance_help_neutron(
389
389
  _(
390
- "List rules by the IP protocol (ah, dhcp, egp, esp, gre, "
390
+ "List only rules with the specified IP protocol "
391
+ "(ah, dhcp, egp, esp, gre, "
391
392
  "icmp, igmp, ipv6-encap, ipv6-frag, ipv6-icmp, "
392
393
  "ipv6-nonxt, ipv6-opts, ipv6-route, ospf, pgm, rsvp, "
393
394
  "sctp, tcp, udp, udplite, vrrp and integer "
@@ -401,7 +402,10 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
401
402
  metavar='<ethertype>',
402
403
  type=network_utils.convert_to_lowercase,
403
404
  help=self.enhance_help_neutron(
404
- _("List rules by the Ethertype (IPv4 or IPv6)")
405
+ _(
406
+ "List only rules with the specified Ethertype "
407
+ "(IPv4 or IPv6)"
408
+ )
405
409
  ),
406
410
  )
407
411
  direction_group = parser.add_mutually_exclusive_group()
@@ -409,14 +413,14 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
409
413
  '--ingress',
410
414
  action='store_true',
411
415
  help=self.enhance_help_neutron(
412
- _("List rules applied to incoming network traffic")
416
+ _("List only rules applied to incoming network traffic")
413
417
  ),
414
418
  )
415
419
  direction_group.add_argument(
416
420
  '--egress',
417
421
  action='store_true',
418
422
  help=self.enhance_help_neutron(
419
- _("List rules applied to outgoing network traffic")
423
+ _("List only rules applied to outgoing network traffic")
420
424
  ),
421
425
  )
422
426
  parser.add_argument(
@@ -430,7 +434,9 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
430
434
  parser.add_argument(
431
435
  '--project',
432
436
  metavar='<project>',
433
- help=self.enhance_help_neutron(_("Owner's project (name or ID)")),
437
+ help=self.enhance_help_neutron(
438
+ _("List only rules with the specified project (name or ID)")
439
+ ),
434
440
  )
435
441
  identity_common.add_project_domain_option_to_parser(
436
442
  parser, enhance_help=self.enhance_help_neutron