python-openstackclient 7.4.0__py3-none-any.whl → 8.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 (264) hide show
  1. openstackclient/common/availability_zone.py +3 -6
  2. openstackclient/common/clientmanager.py +2 -1
  3. openstackclient/common/envvars.py +57 -0
  4. openstackclient/common/extension.py +3 -11
  5. openstackclient/common/limits.py +1 -1
  6. openstackclient/common/project_cleanup.py +3 -2
  7. openstackclient/common/quota.py +54 -28
  8. openstackclient/compute/client.py +7 -5
  9. openstackclient/compute/v2/agent.py +5 -5
  10. openstackclient/compute/v2/aggregate.py +17 -15
  11. openstackclient/compute/v2/console.py +10 -4
  12. openstackclient/compute/v2/console_connection.py +48 -0
  13. openstackclient/compute/v2/flavor.py +14 -18
  14. openstackclient/compute/v2/host.py +3 -3
  15. openstackclient/compute/v2/hypervisor.py +10 -4
  16. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  17. openstackclient/compute/v2/keypair.py +18 -13
  18. openstackclient/compute/v2/server.py +144 -121
  19. openstackclient/compute/v2/server_backup.py +1 -1
  20. openstackclient/compute/v2/server_event.py +8 -17
  21. openstackclient/compute/v2/server_group.py +6 -6
  22. openstackclient/compute/v2/server_image.py +1 -1
  23. openstackclient/compute/v2/server_migration.py +6 -6
  24. openstackclient/compute/v2/server_volume.py +4 -4
  25. openstackclient/compute/v2/service.py +9 -13
  26. openstackclient/compute/v2/usage.py +4 -6
  27. openstackclient/identity/client.py +2 -4
  28. openstackclient/identity/common.py +95 -17
  29. openstackclient/identity/v2_0/ec2creds.py +4 -3
  30. openstackclient/identity/v2_0/endpoint.py +12 -10
  31. openstackclient/identity/v2_0/project.py +6 -6
  32. openstackclient/identity/v2_0/role.py +1 -1
  33. openstackclient/identity/v2_0/service.py +7 -7
  34. openstackclient/identity/v2_0/user.py +6 -21
  35. openstackclient/identity/v3/access_rule.py +2 -5
  36. openstackclient/identity/v3/application_credential.py +2 -2
  37. openstackclient/identity/v3/consumer.py +4 -3
  38. openstackclient/identity/v3/credential.py +6 -7
  39. openstackclient/identity/v3/domain.py +63 -44
  40. openstackclient/identity/v3/ec2creds.py +4 -3
  41. openstackclient/identity/v3/endpoint.py +104 -88
  42. openstackclient/identity/v3/endpoint_group.py +1 -1
  43. openstackclient/identity/v3/group.py +116 -72
  44. openstackclient/identity/v3/identity_provider.py +1 -2
  45. openstackclient/identity/v3/limit.py +4 -9
  46. openstackclient/identity/v3/mapping.py +4 -3
  47. openstackclient/identity/v3/policy.py +5 -8
  48. openstackclient/identity/v3/project.py +23 -6
  49. openstackclient/identity/v3/region.py +2 -5
  50. openstackclient/identity/v3/registered_limit.py +4 -8
  51. openstackclient/identity/v3/role.py +15 -16
  52. openstackclient/identity/v3/service.py +8 -8
  53. openstackclient/identity/v3/service_provider.py +3 -6
  54. openstackclient/identity/v3/tag.py +2 -2
  55. openstackclient/identity/v3/token.py +1 -2
  56. openstackclient/identity/v3/trust.py +74 -25
  57. openstackclient/identity/v3/user.py +47 -11
  58. openstackclient/image/client.py +7 -5
  59. openstackclient/image/v1/image.py +11 -15
  60. openstackclient/image/v2/cache.py +2 -4
  61. openstackclient/image/v2/image.py +41 -48
  62. openstackclient/image/v2/metadef_namespaces.py +4 -3
  63. openstackclient/image/v2/metadef_resource_type_association.py +1 -2
  64. openstackclient/image/v2/metadef_resource_types.py +1 -2
  65. openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +9 -1370
  66. openstackclient/network/client.py +4 -16
  67. openstackclient/network/common.py +16 -12
  68. openstackclient/network/utils.py +3 -3
  69. openstackclient/network/v2/address_group.py +5 -9
  70. openstackclient/network/v2/address_scope.py +2 -3
  71. openstackclient/network/v2/default_security_group_rule.py +1 -2
  72. openstackclient/network/v2/floating_ip.py +69 -47
  73. openstackclient/network/v2/floating_ip_port_forwarding.py +7 -7
  74. openstackclient/network/v2/ip_availability.py +1 -2
  75. openstackclient/network/v2/l3_conntrack_helper.py +8 -12
  76. openstackclient/network/v2/local_ip.py +24 -26
  77. openstackclient/network/v2/local_ip_association.py +4 -5
  78. openstackclient/network/v2/ndp_proxy.py +9 -10
  79. openstackclient/network/v2/network.py +12 -16
  80. openstackclient/network/v2/network_agent.py +29 -37
  81. openstackclient/network/v2/network_auto_allocated_topology.py +4 -5
  82. openstackclient/network/v2/network_flavor.py +1 -1
  83. openstackclient/network/v2/network_flavor_profile.py +5 -5
  84. openstackclient/network/v2/network_meter.py +3 -3
  85. openstackclient/network/v2/network_meter_rule.py +5 -8
  86. openstackclient/network/v2/network_qos_policy.py +4 -4
  87. openstackclient/network/v2/network_qos_rule.py +7 -16
  88. openstackclient/network/v2/network_rbac.py +4 -4
  89. openstackclient/network/v2/network_segment.py +6 -7
  90. openstackclient/network/v2/network_segment_range.py +16 -20
  91. openstackclient/network/v2/network_trunk.py +24 -16
  92. openstackclient/network/v2/port.py +28 -29
  93. openstackclient/network/v2/router.py +53 -42
  94. openstackclient/network/v2/security_group.py +13 -19
  95. openstackclient/network/v2/security_group_rule.py +10 -11
  96. openstackclient/network/v2/subnet.py +31 -30
  97. openstackclient/network/v2/subnet_pool.py +4 -4
  98. openstackclient/object/client.py +2 -3
  99. openstackclient/object/v1/container.py +2 -3
  100. openstackclient/object/v1/object.py +2 -9
  101. openstackclient/shell.py +22 -5
  102. openstackclient/tests/functional/base.py +7 -3
  103. openstackclient/tests/functional/common/test_quota.py +3 -1
  104. openstackclient/tests/functional/compute/v2/common.py +12 -6
  105. openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
  106. openstackclient/tests/functional/compute/v2/test_server.py +2 -3
  107. openstackclient/tests/functional/compute/v2/test_server_event.py +1 -1
  108. openstackclient/tests/functional/identity/v2/test_user.py +1 -1
  109. openstackclient/tests/functional/identity/v3/common.py +3 -8
  110. openstackclient/tests/functional/identity/v3/test_application_credential.py +10 -10
  111. openstackclient/tests/functional/identity/v3/test_endpoint.py +3 -3
  112. openstackclient/tests/functional/identity/v3/test_group.py +3 -3
  113. openstackclient/tests/functional/identity/v3/test_idp.py +3 -7
  114. openstackclient/tests/functional/identity/v3/test_limit.py +4 -4
  115. openstackclient/tests/functional/identity/v3/test_project.py +5 -14
  116. openstackclient/tests/functional/identity/v3/test_region.py +1 -3
  117. openstackclient/tests/functional/identity/v3/test_registered_limit.py +3 -3
  118. openstackclient/tests/functional/identity/v3/test_role.py +1 -1
  119. openstackclient/tests/functional/identity/v3/test_role_assignment.py +13 -31
  120. openstackclient/tests/functional/identity/v3/test_service_provider.py +3 -7
  121. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  122. openstackclient/tests/functional/network/v2/common.py +7 -3
  123. openstackclient/tests/functional/network/v2/test_address_group.py +4 -0
  124. openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +15 -11
  125. openstackclient/tests/functional/network/v2/test_local_ip.py +4 -0
  126. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +2 -2
  127. openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +2 -3
  128. openstackclient/tests/functional/network/v2/test_network_rbac.py +2 -2
  129. openstackclient/tests/functional/network/v2/test_network_trunk.py +1 -1
  130. openstackclient/tests/functional/network/v2/test_port.py +17 -7
  131. openstackclient/tests/functional/network/v2/test_router.py +42 -0
  132. openstackclient/tests/functional/network/v2/test_subnet_pool.py +4 -0
  133. openstackclient/tests/unit/api/test_compute_v2.py +67 -87
  134. openstackclient/tests/unit/common/test_availability_zone.py +6 -14
  135. openstackclient/tests/unit/common/test_command.py +1 -1
  136. openstackclient/tests/unit/common/test_extension.py +5 -7
  137. openstackclient/tests/unit/common/test_limits.py +1 -1
  138. openstackclient/tests/unit/common/test_project_cleanup.py +5 -6
  139. openstackclient/tests/unit/common/test_quota.py +51 -28
  140. openstackclient/tests/unit/compute/v2/fakes.py +85 -315
  141. openstackclient/tests/unit/compute/v2/test_agent.py +16 -16
  142. openstackclient/tests/unit/compute/v2/test_aggregate.py +56 -60
  143. openstackclient/tests/unit/compute/v2/test_console.py +34 -17
  144. openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
  145. openstackclient/tests/unit/compute/v2/test_flavor.py +72 -72
  146. openstackclient/tests/unit/compute/v2/test_host.py +8 -8
  147. openstackclient/tests/unit/compute/v2/test_hypervisor.py +22 -30
  148. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -2
  149. openstackclient/tests/unit/compute/v2/test_keypair.py +36 -29
  150. openstackclient/tests/unit/compute/v2/test_server.py +693 -606
  151. openstackclient/tests/unit/compute/v2/test_server_backup.py +36 -77
  152. openstackclient/tests/unit/compute/v2/test_server_event.py +18 -20
  153. openstackclient/tests/unit/compute/v2/test_server_group.py +25 -31
  154. openstackclient/tests/unit/compute/v2/test_server_image.py +37 -78
  155. openstackclient/tests/unit/compute/v2/test_server_migration.py +41 -41
  156. openstackclient/tests/unit/compute/v2/test_server_volume.py +12 -12
  157. openstackclient/tests/unit/compute/v2/test_service.py +39 -45
  158. openstackclient/tests/unit/compute/v2/test_usage.py +5 -5
  159. openstackclient/tests/unit/identity/v2_0/fakes.py +1 -1
  160. openstackclient/tests/unit/identity/v3/test_access_rule.py +1 -3
  161. openstackclient/tests/unit/identity/v3/test_application_credential.py +48 -26
  162. openstackclient/tests/unit/identity/v3/test_domain.py +115 -105
  163. openstackclient/tests/unit/identity/v3/test_endpoint.py +167 -172
  164. openstackclient/tests/unit/identity/v3/test_group.py +353 -202
  165. openstackclient/tests/unit/identity/v3/test_mappings.py +2 -2
  166. openstackclient/tests/unit/identity/v3/test_project.py +16 -0
  167. openstackclient/tests/unit/identity/v3/test_trust.py +5 -2
  168. openstackclient/tests/unit/identity/v3/test_user.py +102 -6
  169. openstackclient/tests/unit/image/v1/fakes.py +2 -2
  170. openstackclient/tests/unit/image/v1/test_image.py +8 -9
  171. openstackclient/tests/unit/image/v2/test_image.py +84 -46
  172. openstackclient/tests/unit/integ/cli/test_shell.py +1 -2
  173. openstackclient/tests/unit/network/test_common.py +2 -2
  174. openstackclient/tests/unit/network/v2/fakes.py +405 -485
  175. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +8 -14
  176. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +62 -54
  177. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +1 -1
  178. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
  179. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +1 -3
  180. openstackclient/tests/unit/network/v2/test_network.py +4 -4
  181. openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
  182. openstackclient/tests/unit/network/v2/test_network_compute.py +11 -11
  183. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
  184. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
  185. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
  186. openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
  187. openstackclient/tests/unit/network/v2/test_network_trunk.py +2 -2
  188. openstackclient/tests/unit/network/v2/test_port.py +21 -22
  189. openstackclient/tests/unit/network/v2/test_router.py +130 -51
  190. openstackclient/tests/unit/network/v2/test_security_group_compute.py +11 -19
  191. openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -27
  192. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +15 -17
  193. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +33 -39
  194. openstackclient/tests/unit/object/v1/test_object_all.py +4 -3
  195. openstackclient/tests/unit/test_shell.py +16 -13
  196. openstackclient/tests/unit/volume/v2/fakes.py +1 -2
  197. openstackclient/tests/unit/volume/v2/test_service.py +57 -91
  198. openstackclient/tests/unit/volume/v2/test_volume.py +109 -106
  199. openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
  200. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
  201. openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +1 -1
  202. openstackclient/tests/unit/volume/v3/fakes.py +2 -8
  203. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
  204. openstackclient/tests/unit/volume/v3/test_service.py +221 -141
  205. openstackclient/tests/unit/volume/v3/test_volume.py +131 -120
  206. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +4 -4
  207. openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
  208. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +683 -49
  209. openstackclient/tests/unit/volume/v3/test_volume_transfer_request.py +1 -1
  210. openstackclient/volume/client.py +1 -3
  211. openstackclient/volume/v2/consistency_group.py +4 -8
  212. openstackclient/volume/v2/consistency_group_snapshot.py +1 -2
  213. openstackclient/volume/v2/qos_specs.py +1 -2
  214. openstackclient/volume/v2/service.py +41 -38
  215. openstackclient/volume/v2/volume.py +71 -53
  216. openstackclient/volume/v2/volume_backup.py +15 -10
  217. openstackclient/volume/v2/volume_snapshot.py +129 -93
  218. openstackclient/volume/v2/volume_transfer_request.py +0 -3
  219. openstackclient/volume/v2/volume_type.py +10 -21
  220. openstackclient/volume/v3/block_storage_cluster.py +3 -3
  221. openstackclient/volume/v3/block_storage_log_level.py +22 -28
  222. openstackclient/volume/v3/block_storage_manage.py +1 -3
  223. openstackclient/volume/v3/service.py +105 -14
  224. openstackclient/volume/v3/volume.py +218 -58
  225. openstackclient/volume/v3/volume_attachment.py +3 -2
  226. openstackclient/volume/v3/volume_backup.py +31 -27
  227. openstackclient/volume/v3/volume_group.py +2 -1
  228. openstackclient/volume/v3/volume_group_snapshot.py +2 -1
  229. openstackclient/volume/v3/volume_snapshot.py +489 -13
  230. openstackclient/volume/v3/volume_type.py +10 -21
  231. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/AUTHORS +11 -0
  232. python_openstackclient-8.1.0.dist-info/METADATA +264 -0
  233. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/RECORD +238 -259
  234. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/WHEEL +1 -1
  235. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/entry_points.txt +7 -47
  236. python_openstackclient-8.1.0.dist-info/pbr.json +1 -0
  237. openstackclient/tests/functional/volume/v1/__init__.py +0 -0
  238. openstackclient/tests/functional/volume/v1/common.py +0 -35
  239. openstackclient/tests/functional/volume/v1/test_qos.py +0 -100
  240. openstackclient/tests/functional/volume/v1/test_service.py +0 -76
  241. openstackclient/tests/functional/volume/v1/test_snapshot.py +0 -232
  242. openstackclient/tests/functional/volume/v1/test_transfer_request.py +0 -111
  243. openstackclient/tests/functional/volume/v1/test_volume.py +0 -228
  244. openstackclient/tests/functional/volume/v1/test_volume_type.py +0 -213
  245. openstackclient/tests/unit/volume/v1/__init__.py +0 -0
  246. openstackclient/tests/unit/volume/v1/fakes.py +0 -615
  247. openstackclient/tests/unit/volume/v1/test_qos_specs.py +0 -471
  248. openstackclient/tests/unit/volume/v1/test_service.py +0 -295
  249. openstackclient/tests/unit/volume/v1/test_transfer_request.py +0 -380
  250. openstackclient/tests/unit/volume/v1/test_type.py +0 -633
  251. openstackclient/tests/unit/volume/v1/test_volume.py +0 -1447
  252. openstackclient/tests/unit/volume/v1/test_volume_backup.py +0 -435
  253. openstackclient/volume/v1/__init__.py +0 -0
  254. openstackclient/volume/v1/qos_specs.py +0 -377
  255. openstackclient/volume/v1/service.py +0 -136
  256. openstackclient/volume/v1/volume.py +0 -734
  257. openstackclient/volume/v1/volume_backup.py +0 -302
  258. openstackclient/volume/v1/volume_snapshot.py +0 -433
  259. openstackclient/volume/v1/volume_transfer_request.py +0 -200
  260. openstackclient/volume/v1/volume_type.py +0 -520
  261. python_openstackclient-7.4.0.dist-info/METADATA +0 -172
  262. python_openstackclient-7.4.0.dist-info/pbr.json +0 -1
  263. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/LICENSE +0 -0
  264. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/top_level.txt +0 -0
@@ -194,7 +194,7 @@ class DeleteUser(command.Command):
194
194
 
195
195
  if errors > 0:
196
196
  total = len(parsed_args.users)
197
- msg = _("%(errors)s of %(total)s users failed " "to delete.") % {
197
+ msg = _("%(errors)s of %(total)s users failed to delete.") % {
198
198
  'errors': errors,
199
199
  'total': total,
200
200
  }
@@ -230,21 +230,11 @@ class ListUser(command.Lister):
230
230
  )
231
231
  project = project.id
232
232
 
233
+ columns: tuple[str, ...] = ('id', 'name')
234
+ column_headers: tuple[str, ...] = ('ID', 'Name')
233
235
  if parsed_args.long:
234
- columns = (
235
- 'ID',
236
- 'Name',
237
- 'tenantId',
238
- 'Email',
239
- 'Enabled',
240
- )
241
- column_headers = (
242
- 'ID',
243
- 'Name',
244
- 'Project',
245
- 'Email',
246
- 'Enabled',
247
- )
236
+ columns += ('tenantId', 'email', 'enabled')
237
+ column_headers += ('Project', 'Email', 'Enabled')
248
238
  # Cache the project list
249
239
  project_cache = {}
250
240
  try:
@@ -256,15 +246,10 @@ class ListUser(command.Lister):
256
246
  formatters['tenantId'] = functools.partial(
257
247
  ProjectColumn, project_cache=project_cache
258
248
  )
259
- else:
260
- columns = column_headers = ('ID', 'Name')
261
249
  data = identity_client.users.list(tenant_id=project)
262
250
 
263
251
  if parsed_args.project:
264
- d = {}
265
- for s in data:
266
- d[s.id] = s
267
- data = d.values()
252
+ data = {s.id: s for s in data}.values()
268
253
 
269
254
  if parsed_args.long:
270
255
  # FIXME(dtroyer): Sometimes user objects have 'tenant_id' instead
@@ -54,17 +54,14 @@ class DeleteAccessRule(command.Command):
54
54
  except Exception as e:
55
55
  errors += 1
56
56
  LOG.error(
57
- _(
58
- "Failed to delete access rule with "
59
- "ID '%(ac)s': %(e)s"
60
- ),
57
+ _("Failed to delete access rule with ID '%(ac)s': %(e)s"),
61
58
  {'ac': ac, 'e': e},
62
59
  )
63
60
 
64
61
  if errors > 0:
65
62
  total = len(parsed_args.access_rule)
66
63
  msg = _(
67
- "%(errors)s of %(total)s access rules failed " "to delete."
64
+ "%(errors)s of %(total)s access rules failed to delete."
68
65
  ) % {'errors': errors, 'total': total}
69
66
  raise exceptions.CommandError(msg)
70
67
 
@@ -269,9 +269,9 @@ class ListApplicationCredential(command.Lister):
269
269
  def take_action(self, parsed_args):
270
270
  identity_client = self.app.client_manager.sdk_connection.identity
271
271
  if parsed_args.user:
272
- user_id = common.find_user(
272
+ user_id = common.find_user_id_sdk(
273
273
  identity_client, parsed_args.user, parsed_args.user_domain
274
- ).id
274
+ )
275
275
  else:
276
276
  conn = self.app.client_manager.sdk_connection
277
277
  user_id = conn.config.get_auth().get_user_id(conn.identity)
@@ -82,9 +82,10 @@ class DeleteConsumer(command.Command):
82
82
 
83
83
  if result > 0:
84
84
  total = len(parsed_args.consumer)
85
- msg = _(
86
- "%(result)s of %(total)s consumers failed " "to delete."
87
- ) % {'result': result, 'total': total}
85
+ msg = _("%(result)s of %(total)s consumers failed to delete.") % {
86
+ 'result': result,
87
+ 'total': total,
88
+ }
88
89
  raise exceptions.CommandError(msg)
89
90
 
90
91
 
@@ -70,8 +70,7 @@ class CreateCredential(command.ShowOne):
70
70
  '--project',
71
71
  metavar='<project>',
72
72
  help=_(
73
- 'Project which limits the scope of '
74
- 'the credential (name or ID)'
73
+ 'Project which limits the scope of the credential (name or ID)'
75
74
  ),
76
75
  )
77
76
  return parser
@@ -128,9 +127,10 @@ class DeleteCredential(command.Command):
128
127
 
129
128
  if result > 0:
130
129
  total = len(parsed_args.credential)
131
- msg = _(
132
- "%(result)s of %(total)s credential failed " "to delete."
133
- ) % {'result': result, 'total': total}
130
+ msg = _("%(result)s of %(total)s credential failed to delete.") % {
131
+ 'result': result,
132
+ 'total': total,
133
+ }
134
134
  raise exceptions.CommandError(msg)
135
135
 
136
136
 
@@ -219,8 +219,7 @@ class SetCredential(command.Command):
219
219
  '--project',
220
220
  metavar='<project>',
221
221
  help=_(
222
- 'Project which limits the scope of '
223
- 'the credential (name or ID)'
222
+ 'Project which limits the scope of the credential (name or ID)'
224
223
  ),
225
224
  )
226
225
  return parser
@@ -17,7 +17,7 @@
17
17
 
18
18
  import logging
19
19
 
20
- from keystoneauth1 import exceptions as ks_exc
20
+ from openstack import exceptions as sdk_exceptions
21
21
  from osc_lib.command import command
22
22
  from osc_lib import exceptions
23
23
  from osc_lib import utils
@@ -29,6 +29,31 @@ from openstackclient.identity import common
29
29
  LOG = logging.getLogger(__name__)
30
30
 
31
31
 
32
+ def _format_domain(domain):
33
+ columns = (
34
+ 'id',
35
+ 'name',
36
+ 'is_enabled',
37
+ 'description',
38
+ 'options',
39
+ )
40
+ column_headers = (
41
+ 'id',
42
+ 'name',
43
+ 'enabled',
44
+ 'description',
45
+ 'options',
46
+ )
47
+
48
+ return (
49
+ column_headers,
50
+ utils.get_item_properties(
51
+ domain,
52
+ columns,
53
+ ),
54
+ )
55
+
56
+
32
57
  class CreateDomain(command.ShowOne):
33
58
  _description = _("Create new domain")
34
59
 
@@ -47,12 +72,15 @@ class CreateDomain(command.ShowOne):
47
72
  enable_group = parser.add_mutually_exclusive_group()
48
73
  enable_group.add_argument(
49
74
  '--enable',
75
+ dest='is_enabled',
50
76
  action='store_true',
77
+ default=True,
51
78
  help=_('Enable domain (default)'),
52
79
  )
53
80
  enable_group.add_argument(
54
81
  '--disable',
55
- action='store_true',
82
+ dest='is_enabled',
83
+ action='store_false',
56
84
  help=_('Disable domain'),
57
85
  )
58
86
  parser.add_argument(
@@ -64,32 +92,25 @@ class CreateDomain(command.ShowOne):
64
92
  return parser
65
93
 
66
94
  def take_action(self, parsed_args):
67
- identity_client = self.app.client_manager.identity
68
-
69
- enabled = True
70
- if parsed_args.disable:
71
- enabled = False
95
+ identity_client = self.app.client_manager.sdk_connection.identity
72
96
 
73
97
  options = common.get_immutable_options(parsed_args)
74
98
 
75
99
  try:
76
- domain = identity_client.domains.create(
100
+ domain = identity_client.create_domain(
77
101
  name=parsed_args.name,
78
102
  description=parsed_args.description,
79
103
  options=options,
80
- enabled=enabled,
104
+ is_enabled=parsed_args.is_enabled,
81
105
  )
82
- except ks_exc.Conflict:
106
+ except sdk_exceptions.ConflictException:
83
107
  if parsed_args.or_show:
84
- domain = utils.find_resource(
85
- identity_client.domains, parsed_args.name
86
- )
108
+ domain = identity_client.find_domain(parsed_args.name)
87
109
  LOG.info(_('Returning existing domain %s'), domain.name)
88
110
  else:
89
111
  raise
90
112
 
91
- domain._info.pop('links')
92
- return zip(*sorted(domain._info.items()))
113
+ return _format_domain(domain)
93
114
 
94
115
 
95
116
  class DeleteDomain(command.Command):
@@ -106,12 +127,12 @@ class DeleteDomain(command.Command):
106
127
  return parser
107
128
 
108
129
  def take_action(self, parsed_args):
109
- identity_client = self.app.client_manager.identity
130
+ identity_client = self.app.client_manager.sdk_connection.identity
110
131
  result = 0
111
132
  for i in parsed_args.domain:
112
133
  try:
113
- domain = utils.find_resource(identity_client.domains, i)
114
- identity_client.domains.delete(domain.id)
134
+ domain = identity_client.find_domain(i, ignore_missing=False)
135
+ identity_client.delete_domain(domain.id)
115
136
  except Exception as e:
116
137
  result += 1
117
138
  LOG.error(
@@ -124,7 +145,7 @@ class DeleteDomain(command.Command):
124
145
 
125
146
  if result > 0:
126
147
  total = len(parsed_args.domain)
127
- msg = _("%(result)s of %(total)s domains failed " "to delete.") % {
148
+ msg = _("%(result)s of %(total)s domains failed to delete.") % {
128
149
  'result': result,
129
150
  'total': total,
130
151
  }
@@ -143,7 +164,7 @@ class ListDomain(command.Lister):
143
164
  )
144
165
  parser.add_argument(
145
166
  '--enabled',
146
- dest='enabled',
167
+ dest='is_enabled',
147
168
  action='store_true',
148
169
  help=_('The domains that are enabled will be returned'),
149
170
  )
@@ -153,13 +174,17 @@ class ListDomain(command.Lister):
153
174
  kwargs = {}
154
175
  if parsed_args.name:
155
176
  kwargs['name'] = parsed_args.name
156
- if parsed_args.enabled:
157
- kwargs['enabled'] = True
177
+ if parsed_args.is_enabled:
178
+ kwargs['is_enabled'] = True
179
+
180
+ columns = ('id', 'name', 'is_enabled', 'description')
181
+ column_headers = ('ID', 'Name', 'Enabled', 'Description')
182
+ data = self.app.client_manager.sdk_connection.identity.domains(
183
+ **kwargs
184
+ )
158
185
 
159
- columns = ('ID', 'Name', 'Enabled', 'Description')
160
- data = self.app.client_manager.identity.domains.list(**kwargs)
161
186
  return (
162
- columns,
187
+ column_headers,
163
188
  (
164
189
  utils.get_item_properties(
165
190
  s,
@@ -194,38 +219,38 @@ class SetDomain(command.Command):
194
219
  enable_group = parser.add_mutually_exclusive_group()
195
220
  enable_group.add_argument(
196
221
  '--enable',
222
+ dest='is_enabled',
197
223
  action='store_true',
224
+ default=None,
198
225
  help=_('Enable domain'),
199
226
  )
200
227
  enable_group.add_argument(
201
228
  '--disable',
202
- action='store_true',
229
+ dest='is_enabled',
230
+ action='store_false',
231
+ default=None,
203
232
  help=_('Disable domain'),
204
233
  )
205
234
  common.add_resource_option_to_parser(parser)
206
235
  return parser
207
236
 
208
237
  def take_action(self, parsed_args):
209
- identity_client = self.app.client_manager.identity
210
- domain = utils.find_resource(
211
- identity_client.domains, parsed_args.domain
212
- )
238
+ identity_client = self.app.client_manager.sdk_connection.identity
239
+ domain = identity_client.find_domain(parsed_args.domain)
213
240
  kwargs = {}
214
241
  if parsed_args.name:
215
242
  kwargs['name'] = parsed_args.name
216
243
  if parsed_args.description:
217
244
  kwargs['description'] = parsed_args.description
218
245
 
219
- if parsed_args.enable:
220
- kwargs['enabled'] = True
221
- if parsed_args.disable:
222
- kwargs['enabled'] = False
246
+ if parsed_args.is_enabled is not None:
247
+ kwargs['is_enabled'] = parsed_args.is_enabled
223
248
 
224
249
  options = common.get_immutable_options(parsed_args)
225
250
  if options:
226
251
  kwargs['options'] = options
227
252
 
228
- identity_client.domains.update(domain.id, **kwargs)
253
+ identity_client.update_domain(domain.id, **kwargs)
229
254
 
230
255
 
231
256
  class ShowDomain(command.ShowOne):
@@ -241,13 +266,7 @@ class ShowDomain(command.ShowOne):
241
266
  return parser
242
267
 
243
268
  def take_action(self, parsed_args):
244
- identity_client = self.app.client_manager.identity
245
-
246
- domain_str = common._get_token_resource(
247
- identity_client, 'domain', parsed_args.domain
248
- )
249
-
250
- domain = utils.find_resource(identity_client.domains, domain_str)
269
+ identity_client = self.app.client_manager.sdk_connection.identity
270
+ domain = identity_client.find_domain(parsed_args.domain)
251
271
 
252
- domain._info.pop('links')
253
- return zip(*sorted(domain._info.items()))
272
+ return _format_domain(domain)
@@ -156,9 +156,10 @@ class DeleteEC2Creds(command.Command):
156
156
 
157
157
  if result > 0:
158
158
  total = len(parsed_args.access_key)
159
- msg = _(
160
- "%(result)s of %(total)s EC2 keys failed " "to delete."
161
- ) % {'result': result, 'total': total}
159
+ msg = _("%(result)s of %(total)s EC2 keys failed to delete.") % {
160
+ 'result': result,
161
+ 'total': total,
162
+ }
162
163
  raise exceptions.CommandError(msg)
163
164
 
164
165
 
@@ -28,11 +28,31 @@ from openstackclient.identity import common
28
28
  LOG = logging.getLogger(__name__)
29
29
 
30
30
 
31
- def get_service_name(service):
32
- if hasattr(service, 'name'):
33
- return service.name
34
- else:
35
- return ''
31
+ def _format_endpoint(endpoint, service):
32
+ columns = (
33
+ 'is_enabled',
34
+ 'id',
35
+ 'interface',
36
+ 'region_id',
37
+ 'region_id',
38
+ 'service_id',
39
+ 'url',
40
+ )
41
+ column_headers = (
42
+ 'enabled',
43
+ 'id',
44
+ 'interface',
45
+ 'region',
46
+ 'region_id',
47
+ 'service_id',
48
+ 'url',
49
+ 'service_name',
50
+ 'service_type',
51
+ )
52
+
53
+ data = utils.get_item_properties(endpoint, columns)
54
+ data += (getattr(service, 'name', ''), service.type)
55
+ return column_headers, data
36
56
 
37
57
 
38
58
  class AddProjectToEndpoint(command.Command):
@@ -44,15 +64,13 @@ class AddProjectToEndpoint(command.Command):
44
64
  'endpoint',
45
65
  metavar='<endpoint>',
46
66
  help=_(
47
- 'Endpoint to associate with ' 'specified project (name or ID)'
67
+ 'Endpoint to associate with specified project (name or ID)'
48
68
  ),
49
69
  )
50
70
  parser.add_argument(
51
71
  'project',
52
72
  metavar='<project>',
53
- help=_(
54
- 'Project to associate with ' 'specified endpoint name or ID)'
55
- ),
73
+ help=_('Project to associate with specified endpoint name or ID)'),
56
74
  )
57
75
  common.add_project_domain_option_to_parser(parser)
58
76
  return parser
@@ -114,23 +132,23 @@ class CreateEndpoint(command.ShowOne):
114
132
  return parser
115
133
 
116
134
  def take_action(self, parsed_args):
117
- identity_client = self.app.client_manager.identity
118
- service = common.find_service(identity_client, parsed_args.service)
119
-
120
- endpoint = identity_client.endpoints.create(
121
- service=service.id,
122
- url=parsed_args.url,
123
- interface=parsed_args.interface,
124
- region=parsed_args.region,
125
- enabled=parsed_args.enabled,
126
- )
135
+ identity_client = self.app.client_manager.sdk_connection.identity
136
+ service = common.find_service_sdk(identity_client, parsed_args.service)
137
+
138
+ kwargs = {}
139
+
140
+ kwargs['service_id'] = service.id
141
+ kwargs['url'] = parsed_args.url
142
+ kwargs['interface'] = parsed_args.interface
143
+ kwargs['is_enabled'] = parsed_args.enabled
144
+
145
+ if parsed_args.region:
146
+ region = identity_client.get_region(parsed_args.region)
147
+ kwargs['region_id'] = region.id
127
148
 
128
- info = {}
129
- endpoint._info.pop('links')
130
- info.update(endpoint._info)
131
- info['service_name'] = get_service_name(service)
132
- info['service_type'] = service.type
133
- return zip(*sorted(info.items()))
149
+ endpoint = identity_client.create_endpoint(**kwargs)
150
+
151
+ return _format_endpoint(endpoint, service=service)
134
152
 
135
153
 
136
154
  class DeleteEndpoint(command.Command):
@@ -147,14 +165,12 @@ class DeleteEndpoint(command.Command):
147
165
  return parser
148
166
 
149
167
  def take_action(self, parsed_args):
150
- identity_client = self.app.client_manager.identity
168
+ identity_client = self.app.client_manager.sdk_connection.identity
151
169
  result = 0
152
170
  for i in parsed_args.endpoint:
153
171
  try:
154
- endpoint_id = utils.find_resource(
155
- identity_client.endpoints, i
156
- ).id
157
- identity_client.endpoints.delete(endpoint_id)
172
+ endpoint_id = identity_client.find_endpoint(i).id
173
+ identity_client.delete_endpoint(endpoint_id)
158
174
  except Exception as e:
159
175
  result += 1
160
176
  LOG.error(
@@ -167,9 +183,10 @@ class DeleteEndpoint(command.Command):
167
183
 
168
184
  if result > 0:
169
185
  total = len(parsed_args.endpoint)
170
- msg = _(
171
- "%(result)s of %(total)s endpoints failed " "to delete."
172
- ) % {'result': result, 'total': total}
186
+ msg = _("%(result)s of %(total)s endpoints failed to delete.") % {
187
+ 'result': result,
188
+ 'total': total,
189
+ }
173
190
  raise exceptions.CommandError(msg)
174
191
 
175
192
 
@@ -209,28 +226,24 @@ class ListEndpoint(command.Lister):
209
226
  return parser
210
227
 
211
228
  def take_action(self, parsed_args):
212
- identity_client = self.app.client_manager.identity
229
+ identity_client = self.app.client_manager.sdk_connection.identity
213
230
 
214
231
  endpoint = None
215
232
  if parsed_args.endpoint:
216
- endpoint = utils.find_resource(
217
- identity_client.endpoints, parsed_args.endpoint
218
- )
233
+ endpoint = identity_client.find_endpoint(parsed_args.endpoint)
219
234
  project = None
220
235
  if parsed_args.project:
221
- project = common.find_project(
222
- identity_client,
236
+ project = identity_client.find_project(
223
237
  parsed_args.project,
224
238
  parsed_args.project_domain,
225
239
  )
226
240
 
227
241
  if endpoint:
228
- columns = ('ID', 'Name')
229
- data = identity_client.endpoint_filter.list_projects_for_endpoint(
230
- endpoint=endpoint.id
231
- )
242
+ column_headers: tuple[str, ...] = ('ID', 'Name')
243
+ columns: tuple[str, ...] = ('id', 'name')
244
+ data = identity_client.endpoint_projects(endpoint=endpoint.id)
232
245
  else:
233
- columns = (
246
+ column_headers = (
234
247
  'ID',
235
248
  'Region',
236
249
  'Service Name',
@@ -239,37 +252,41 @@ class ListEndpoint(command.Lister):
239
252
  'Interface',
240
253
  'URL',
241
254
  )
255
+ columns = (
256
+ 'id',
257
+ 'region_id',
258
+ 'service_name',
259
+ 'service_type',
260
+ 'is_enabled',
261
+ 'interface',
262
+ 'url',
263
+ )
242
264
  kwargs = {}
243
265
  if parsed_args.service:
244
- service = common.find_service(
266
+ service = common.find_service_sdk(
245
267
  identity_client, parsed_args.service
246
268
  )
247
- kwargs['service'] = service.id
269
+ kwargs['service_id'] = service.id
248
270
  if parsed_args.interface:
249
271
  kwargs['interface'] = parsed_args.interface
250
272
  if parsed_args.region:
251
- kwargs['region'] = parsed_args.region
273
+ region = identity_client.get_region(parsed_args.region)
274
+ kwargs['region_id'] = region.id
252
275
 
253
276
  if project:
254
- data = (
255
- identity_client.endpoint_filter.list_endpoints_for_project(
256
- project=project.id
257
- )
277
+ data = list(
278
+ identity_client.project_endpoints(project=project.id)
258
279
  )
259
280
  else:
260
- data = identity_client.endpoints.list(**kwargs)
261
-
262
- service_list = identity_client.services.list()
281
+ data = list(identity_client.endpoints(**kwargs))
263
282
 
264
283
  for ep in data:
265
- service = common.find_service_in_list(
266
- service_list, ep.service_id
267
- )
268
- ep.service_name = get_service_name(service)
284
+ service = identity_client.find_service(ep.service_id)
285
+ ep.service_name = getattr(service, 'name', '')
269
286
  ep.service_type = service.type
270
287
 
271
288
  return (
272
- columns,
289
+ column_headers,
273
290
  (
274
291
  utils.get_item_properties(
275
292
  s,
@@ -290,14 +307,14 @@ class RemoveProjectFromEndpoint(command.Command):
290
307
  'endpoint',
291
308
  metavar='<endpoint>',
292
309
  help=_(
293
- 'Endpoint to dissociate from ' 'specified project (name or ID)'
310
+ 'Endpoint to dissociate from specified project (name or ID)'
294
311
  ),
295
312
  )
296
313
  parser.add_argument(
297
314
  'project',
298
315
  metavar='<project>',
299
316
  help=_(
300
- 'Project to dissociate from ' 'specified endpoint name or ID)'
317
+ 'Project to dissociate from specified endpoint name or ID)'
301
318
  ),
302
319
  )
303
320
  common.add_project_domain_option_to_parser(parser)
@@ -364,28 +381,34 @@ class SetEndpoint(command.Command):
364
381
  return parser
365
382
 
366
383
  def take_action(self, parsed_args):
367
- identity_client = self.app.client_manager.identity
368
- endpoint = utils.find_resource(
369
- identity_client.endpoints, parsed_args.endpoint
370
- )
384
+ identity_client = self.app.client_manager.sdk_connection.identity
385
+ endpoint = identity_client.find_endpoint(parsed_args.endpoint)
386
+
387
+ kwargs = {}
371
388
 
372
- service_id = None
373
389
  if parsed_args.service:
374
- service = common.find_service(identity_client, parsed_args.service)
375
- service_id = service.id
376
- enabled = None
390
+ service = common.find_service_sdk(
391
+ identity_client, parsed_args.service
392
+ )
393
+ kwargs['service_id'] = service.id
394
+
377
395
  if parsed_args.enabled:
378
- enabled = True
396
+ kwargs['is_enabled'] = True
379
397
  if parsed_args.disabled:
380
- enabled = False
398
+ kwargs['is_enabled'] = False
399
+
400
+ if parsed_args.url:
401
+ kwargs['url'] = parsed_args.url
402
+
403
+ if parsed_args.interface:
404
+ kwargs['interface'] = parsed_args.interface
381
405
 
382
- identity_client.endpoints.update(
406
+ if parsed_args.region:
407
+ kwargs['region_id'] = parsed_args.region
408
+
409
+ identity_client.update_endpoint(
383
410
  endpoint.id,
384
- service=service_id,
385
- url=parsed_args.url,
386
- interface=parsed_args.interface,
387
- region=parsed_args.region,
388
- enabled=enabled,
411
+ **kwargs,
389
412
  )
390
413
 
391
414
 
@@ -405,16 +428,9 @@ class ShowEndpoint(command.ShowOne):
405
428
  return parser
406
429
 
407
430
  def take_action(self, parsed_args):
408
- identity_client = self.app.client_manager.identity
409
- endpoint = utils.find_resource(
410
- identity_client.endpoints, parsed_args.endpoint
411
- )
431
+ identity_client = self.app.client_manager.sdk_connection.identity
432
+ endpoint = identity_client.find_endpoint(parsed_args.endpoint)
412
433
 
413
- service = common.find_service(identity_client, endpoint.service_id)
434
+ service = common.find_service_sdk(identity_client, endpoint.service_id)
414
435
 
415
- info = {}
416
- endpoint._info.pop('links')
417
- info.update(endpoint._info)
418
- info['service_name'] = get_service_name(service)
419
- info['service_type'] = service.type
420
- return zip(*sorted(info.items()))
436
+ return _format_endpoint(endpoint, service)