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
@@ -168,7 +168,7 @@ class DeleteEndpointGroup(command.Command):
168
168
  if result > 0:
169
169
  total = len(parsed_args.endpointgroup)
170
170
  msg = _(
171
- "%(result)s of %(total)s endpointgroups failed " "to delete."
171
+ "%(result)s of %(total)s endpointgroups failed to delete."
172
172
  ) % {'result': result, 'total': total}
173
173
  raise exceptions.CommandError(msg)
174
174
 
@@ -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_exc
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,25 @@ from openstackclient.identity import common
29
29
  LOG = logging.getLogger(__name__)
30
30
 
31
31
 
32
+ def _format_group(group):
33
+ columns = (
34
+ 'description',
35
+ 'domain_id',
36
+ 'id',
37
+ 'name',
38
+ )
39
+ column_headers = (
40
+ 'description',
41
+ 'domain_id',
42
+ 'id',
43
+ 'name',
44
+ )
45
+ return (
46
+ column_headers,
47
+ utils.get_item_properties(group, columns),
48
+ )
49
+
50
+
32
51
  class AddUserToGroup(command.Command):
33
52
  _description = _("Add user to group")
34
53
 
@@ -53,19 +72,19 @@ class AddUserToGroup(command.Command):
53
72
  return parser
54
73
 
55
74
  def take_action(self, parsed_args):
56
- identity_client = self.app.client_manager.identity
75
+ identity_client = self.app.client_manager.sdk_connection.identity
57
76
 
58
- group_id = common.find_group(
77
+ group_id = common.find_group_id_sdk(
59
78
  identity_client, parsed_args.group, parsed_args.group_domain
60
- ).id
79
+ )
61
80
 
62
81
  result = 0
63
82
  for i in parsed_args.user:
64
83
  try:
65
- user_id = common.find_user(
84
+ user_id = common.find_user_id_sdk(
66
85
  identity_client, i, parsed_args.user_domain
67
- ).id
68
- identity_client.users.add_to_group(user_id, group_id)
86
+ )
87
+ identity_client.add_user_to_group(user_id, group_id)
69
88
  except Exception as e:
70
89
  result += 1
71
90
  msg = _("%(user)s not added to group %(group)s: %(e)s") % {
@@ -109,32 +128,41 @@ class CheckUserInGroup(command.Command):
109
128
  return parser
110
129
 
111
130
  def take_action(self, parsed_args):
112
- identity_client = self.app.client_manager.identity
131
+ identity_client = self.app.client_manager.sdk_connection.identity
113
132
 
114
- user_id = common.find_user(
115
- identity_client, parsed_args.user, parsed_args.user_domain
116
- ).id
117
- group_id = common.find_group(
118
- identity_client, parsed_args.group, parsed_args.group_domain
119
- ).id
133
+ user_id = common.find_user_id_sdk(
134
+ identity_client,
135
+ parsed_args.user,
136
+ parsed_args.user_domain,
137
+ validate_actor_existence=False,
138
+ )
139
+ group_id = common.find_group_id_sdk(
140
+ identity_client,
141
+ parsed_args.group,
142
+ parsed_args.group_domain,
143
+ validate_actor_existence=False,
144
+ )
120
145
 
146
+ user_in_group = False
121
147
  try:
122
- identity_client.users.check_in_group(user_id, group_id)
123
- except ks_exc.http.HTTPClientError as e:
124
- if e.http_status == 403 or e.http_status == 404:
125
- msg = _("%(user)s not in group %(group)s\n") % {
126
- 'user': parsed_args.user,
127
- 'group': parsed_args.group,
128
- }
129
- self.app.stderr.write(msg)
130
- else:
131
- raise e
132
- else:
148
+ user_in_group = identity_client.check_user_in_group(
149
+ user_id, group_id
150
+ )
151
+ except sdk_exc.ForbiddenException:
152
+ # Assume False if forbidden
153
+ pass
154
+ if user_in_group:
133
155
  msg = _("%(user)s in group %(group)s\n") % {
134
156
  'user': parsed_args.user,
135
157
  'group': parsed_args.group,
136
158
  }
137
159
  self.app.stdout.write(msg)
160
+ else:
161
+ msg = _("%(user)s not in group %(group)s\n") % {
162
+ 'user': parsed_args.user,
163
+ 'group': parsed_args.group,
164
+ }
165
+ self.app.stderr.write(msg)
138
166
 
139
167
 
140
168
  class CreateGroup(command.ShowOne):
@@ -165,29 +193,33 @@ class CreateGroup(command.ShowOne):
165
193
  return parser
166
194
 
167
195
  def take_action(self, parsed_args):
168
- identity_client = self.app.client_manager.identity
196
+ identity_client = self.app.client_manager.sdk_connection.identity
169
197
 
170
- domain = None
198
+ kwargs = {}
199
+ if parsed_args.name:
200
+ kwargs['name'] = parsed_args.name
201
+ if parsed_args.description:
202
+ kwargs['description'] = parsed_args.description
171
203
  if parsed_args.domain:
172
- domain = common.find_domain(identity_client, parsed_args.domain).id
204
+ kwargs['domain_id'] = common.find_domain_id_sdk(
205
+ identity_client, parsed_args.domain
206
+ )
173
207
 
174
208
  try:
175
- group = identity_client.groups.create(
176
- name=parsed_args.name,
177
- domain=domain,
178
- description=parsed_args.description,
179
- )
180
- except ks_exc.Conflict:
209
+ group = identity_client.create_group(**kwargs)
210
+ except sdk_exc.ConflictException:
181
211
  if parsed_args.or_show:
182
- group = utils.find_resource(
183
- identity_client.groups, parsed_args.name, domain_id=domain
184
- )
212
+ if parsed_args.domain:
213
+ group = identity_client.find_group(
214
+ parsed_args.name, domain_id=parsed_args.domain
215
+ )
216
+ else:
217
+ group = identity_client.find_group(parsed_args.name)
185
218
  LOG.info(_('Returning existing group %s'), group.name)
186
219
  else:
187
220
  raise
188
221
 
189
- group._info.pop('links')
190
- return zip(*sorted(group._info.items()))
222
+ return _format_group(group)
191
223
 
192
224
 
193
225
  class DeleteGroup(command.Command):
@@ -209,15 +241,15 @@ class DeleteGroup(command.Command):
209
241
  return parser
210
242
 
211
243
  def take_action(self, parsed_args):
212
- identity_client = self.app.client_manager.identity
244
+ identity_client = self.app.client_manager.sdk_connection.identity
213
245
 
214
246
  errors = 0
215
247
  for group in parsed_args.groups:
216
248
  try:
217
- group_obj = common.find_group(
249
+ group_id = common.find_group_id_sdk(
218
250
  identity_client, group, parsed_args.domain
219
251
  )
220
- identity_client.groups.delete(group_obj.id)
252
+ identity_client.delete_group(group_id)
221
253
  except Exception as e:
222
254
  errors += 1
223
255
  LOG.error(
@@ -230,7 +262,7 @@ class DeleteGroup(command.Command):
230
262
 
231
263
  if errors > 0:
232
264
  total = len(parsed_args.groups)
233
- msg = _("%(errors)s of %(total)s groups failed " "to delete.") % {
265
+ msg = _("%(errors)s of %(total)s groups failed to delete.") % {
234
266
  'errors': errors,
235
267
  'total': total,
236
268
  }
@@ -262,30 +294,37 @@ class ListGroup(command.Lister):
262
294
  return parser
263
295
 
264
296
  def take_action(self, parsed_args):
265
- identity_client = self.app.client_manager.identity
297
+ identity_client = self.app.client_manager.sdk_connection.identity
266
298
 
267
299
  domain = None
268
300
  if parsed_args.domain:
269
- domain = common.find_domain(identity_client, parsed_args.domain).id
301
+ domain = common.find_domain_id_sdk(
302
+ identity_client, parsed_args.domain
303
+ )
270
304
 
305
+ data = []
271
306
  if parsed_args.user:
272
- user = common.find_user(
307
+ user = common.find_user_id_sdk(
273
308
  identity_client,
274
309
  parsed_args.user,
275
310
  parsed_args.user_domain,
276
- ).id
311
+ )
312
+ if domain:
313
+ # NOTE(0weng): The API doesn't actually support filtering additionally by domain_id,
314
+ # so this doesn't really do anything.
315
+ data = identity_client.user_groups(user, domain_id=domain)
316
+ else:
317
+ data = identity_client.user_groups(user)
277
318
  else:
278
- user = None
319
+ if domain:
320
+ data = identity_client.groups(domain_id=domain)
321
+ else:
322
+ data = identity_client.groups()
279
323
 
280
324
  # List groups
325
+ columns: tuple[str, ...] = ('ID', 'Name')
281
326
  if parsed_args.long:
282
- columns = ('ID', 'Name', 'Domain ID', 'Description')
283
- else:
284
- columns = ('ID', 'Name')
285
- data = identity_client.groups.list(
286
- domain=domain,
287
- user=user,
288
- )
327
+ columns += ('Domain ID', 'Description')
289
328
 
290
329
  return (
291
330
  columns,
@@ -324,19 +363,19 @@ class RemoveUserFromGroup(command.Command):
324
363
  return parser
325
364
 
326
365
  def take_action(self, parsed_args):
327
- identity_client = self.app.client_manager.identity
366
+ identity_client = self.app.client_manager.sdk_connection.identity
328
367
 
329
- group_id = common.find_group(
368
+ group_id = common.find_group_id_sdk(
330
369
  identity_client, parsed_args.group, parsed_args.group_domain
331
- ).id
370
+ )
332
371
 
333
372
  result = 0
334
373
  for i in parsed_args.user:
335
374
  try:
336
- user_id = common.find_user(
375
+ user_id = common.find_user_id_sdk(
337
376
  identity_client, i, parsed_args.user_domain
338
- ).id
339
- identity_client.users.remove_from_group(user_id, group_id)
377
+ )
378
+ identity_client.remove_user_from_group(user_id, group_id)
340
379
  except Exception as e:
341
380
  result += 1
342
381
  msg = _("%(user)s not removed from group %(group)s: %(e)s") % {
@@ -388,8 +427,8 @@ class SetGroup(command.Command):
388
427
  return parser
389
428
 
390
429
  def take_action(self, parsed_args):
391
- identity_client = self.app.client_manager.identity
392
- group = common.find_group(
430
+ identity_client = self.app.client_manager.sdk_connection.identity
431
+ group = common.find_group_id_sdk(
393
432
  identity_client, parsed_args.group, parsed_args.domain
394
433
  )
395
434
  kwargs = {}
@@ -398,7 +437,7 @@ class SetGroup(command.Command):
398
437
  if parsed_args.description:
399
438
  kwargs['description'] = parsed_args.description
400
439
 
401
- identity_client.groups.update(group.id, **kwargs)
440
+ identity_client.update_group(group, **kwargs)
402
441
 
403
442
 
404
443
  class ShowGroup(command.ShowOne):
@@ -419,13 +458,18 @@ class ShowGroup(command.ShowOne):
419
458
  return parser
420
459
 
421
460
  def take_action(self, parsed_args):
422
- identity_client = self.app.client_manager.identity
461
+ identity_client = self.app.client_manager.sdk_connection.identity
423
462
 
424
- group = common.find_group(
425
- identity_client,
426
- parsed_args.group,
427
- domain_name_or_id=parsed_args.domain,
428
- )
463
+ if parsed_args.domain:
464
+ domain = common.find_domain_id_sdk(
465
+ identity_client, parsed_args.domain
466
+ )
467
+ group = identity_client.find_group(
468
+ parsed_args.group, domain_id=domain, ignore_missing=False
469
+ )
470
+ else:
471
+ group = identity_client.find_group(
472
+ parsed_args.group, ignore_missing=False
473
+ )
429
474
 
430
- group._info.pop('links')
431
- return zip(*sorted(group._info.items()))
475
+ return _format_group(group)
@@ -174,8 +174,7 @@ class DeleteIdentityProvider(command.Command):
174
174
  if result > 0:
175
175
  total = len(parsed_args.identity_provider)
176
176
  msg = _(
177
- "%(result)s of %(total)s identity providers failed"
178
- " to delete."
177
+ "%(result)s of %(total)s identity providers failed to delete."
179
178
  ) % {'result': result, 'total': total}
180
179
  raise exceptions.CommandError(msg)
181
180
 
@@ -77,8 +77,7 @@ class CreateLimit(command.ShowOne):
77
77
  )
78
78
  region = None
79
79
  if parsed_args.region:
80
- val = getattr(parsed_args, 'region', None)
81
- if 'None' not in val:
80
+ if 'None' not in parsed_args.region:
82
81
  # NOTE (vishakha): Due to bug #1799153 and for any another
83
82
  # related case where GET resource API does not support the
84
83
  # filter by name, osc_lib.utils.find_resource() method cannot
@@ -149,11 +148,7 @@ class ListLimit(command.Lister):
149
148
  )
150
149
  region = None
151
150
  if parsed_args.region:
152
- region = utils.find_resource(
153
- identity_client.regions, parsed_args.region
154
- )
155
- val = getattr(parsed_args, 'region', None)
156
- if 'None' not in val:
151
+ if 'None' not in parsed_args.region:
157
152
  # NOTE (vishakha): Due to bug #1799153 and for any another
158
153
  # related case where GET resource API does not support the
159
154
  # filter by name, osc_lib.utils.find_resource() method cannot
@@ -281,13 +276,13 @@ class DeleteLimit(command.Command):
281
276
  except Exception as e:
282
277
  errors += 1
283
278
  LOG.error(
284
- _("Failed to delete limit with ID " "'%(id)s': %(e)s"),
279
+ _("Failed to delete limit with ID '%(id)s': %(e)s"),
285
280
  {'id': limit_id, 'e': e},
286
281
  )
287
282
 
288
283
  if errors > 0:
289
284
  total = len(parsed_args.limit_id)
290
- msg = _("%(errors)s of %(total)s limits failed to " "delete.") % {
285
+ msg = _("%(errors)s of %(total)s limits failed to delete.") % {
291
286
  'errors': errors,
292
287
  'total': total,
293
288
  }
@@ -161,9 +161,10 @@ class DeleteMapping(command.Command):
161
161
 
162
162
  if result > 0:
163
163
  total = len(parsed_args.mapping)
164
- msg = _(
165
- "%(result)s of %(total)s mappings failed " "to delete."
166
- ) % {'result': result, 'total': total}
164
+ msg = _("%(result)s of %(total)s mappings failed to delete.") % {
165
+ 'result': result,
166
+ 'total': total,
167
+ }
167
168
  raise exceptions.CommandError(msg)
168
169
 
169
170
 
@@ -92,9 +92,7 @@ class DeletePolicy(command.Command):
92
92
 
93
93
  if result > 0:
94
94
  total = len(parsed_args.policy)
95
- msg = _(
96
- "%(result)s of %(total)s policies failed " "to delete."
97
- ) % {
95
+ msg = _("%(result)s of %(total)s policies failed to delete.") % {
98
96
  'result': result,
99
97
  'total': total,
100
98
  }
@@ -115,12 +113,11 @@ class ListPolicy(command.Lister):
115
113
  return parser
116
114
 
117
115
  def take_action(self, parsed_args):
116
+ columns: tuple[str, ...] = ('ID', 'Type')
117
+ column_headers: tuple[str, ...] = columns
118
118
  if parsed_args.long:
119
- columns = ('ID', 'Type', 'Blob')
120
- column_headers = ('ID', 'Type', 'Rules')
121
- else:
122
- columns = ('ID', 'Type')
123
- column_headers = columns
119
+ columns += ('Blob',)
120
+ column_headers += ('Rules',)
124
121
  data = self.app.client_manager.identity.policies.list()
125
122
  return (
126
123
  column_headers,
@@ -190,9 +190,10 @@ class DeleteProject(command.Command):
190
190
 
191
191
  if errors > 0:
192
192
  total = len(parsed_args.projects)
193
- msg = _(
194
- "%(errors)s of %(total)s projects failed " "to delete."
195
- ) % {'errors': errors, 'total': total}
193
+ msg = _("%(errors)s of %(total)s projects failed to delete.") % {
194
+ 'errors': errors,
195
+ 'total': total,
196
+ }
196
197
  raise exceptions.CommandError(msg)
197
198
 
198
199
 
@@ -239,15 +240,28 @@ class ListProject(command.Lister):
239
240
  'keys and directions.'
240
241
  ),
241
242
  )
243
+ parser.add_argument(
244
+ '--enabled',
245
+ action='store_true',
246
+ dest='is_enabled',
247
+ default=None,
248
+ help=_('List only enabled projects'),
249
+ )
250
+ parser.add_argument(
251
+ '--disabled',
252
+ action='store_false',
253
+ dest='is_enabled',
254
+ default=None,
255
+ help=_('List only disabled projects'),
256
+ )
242
257
  tag.add_tag_filtering_option_to_parser(parser, _('projects'))
243
258
  return parser
244
259
 
245
260
  def take_action(self, parsed_args):
246
261
  identity_client = self.app.client_manager.identity
262
+ columns: tuple[str, ...] = ('ID', 'Name')
247
263
  if parsed_args.long:
248
- columns = ('ID', 'Name', 'Domain ID', 'Description', 'Enabled')
249
- else:
250
- columns = ('ID', 'Name')
264
+ columns += ('Domain ID', 'Description', 'Enabled')
251
265
  kwargs = {}
252
266
 
253
267
  domain_id = None
@@ -277,6 +291,9 @@ class ListProject(command.Lister):
277
291
 
278
292
  kwargs['user'] = user_id
279
293
 
294
+ if parsed_args.is_enabled is not None:
295
+ kwargs['is_enabled'] = parsed_args.is_enabled
296
+
280
297
  tag.get_tag_filtering_args(parsed_args, kwargs)
281
298
 
282
299
  if parsed_args.my_projects:
@@ -92,16 +92,13 @@ class DeleteRegion(command.Command):
92
92
  except Exception as e:
93
93
  result += 1
94
94
  LOG.error(
95
- _(
96
- "Failed to delete region with "
97
- "ID '%(region)s': %(e)s"
98
- ),
95
+ _("Failed to delete region with ID '%(region)s': %(e)s"),
99
96
  {'region': i, 'e': e},
100
97
  )
101
98
 
102
99
  if result > 0:
103
100
  total = len(parsed_args.region)
104
- msg = _("%(result)s of %(total)s regions failed " "to delete.") % {
101
+ msg = _("%(result)s of %(total)s regions failed to delete.") % {
105
102
  'result': result,
106
103
  'total': total,
107
104
  }
@@ -68,8 +68,7 @@ class CreateRegisteredLimit(command.ShowOne):
68
68
  )
69
69
  region = None
70
70
  if parsed_args.region:
71
- val = getattr(parsed_args, 'region', None)
72
- if 'None' not in val:
71
+ if 'None' not in parsed_args.region:
73
72
  # NOTE (vishakha): Due to bug #1799153 and for any another
74
73
  # related case where GET resource API does not support the
75
74
  # filter by name, osc_lib.utils.find_resource() method cannot
@@ -137,8 +136,7 @@ class DeleteRegisteredLimit(command.Command):
137
136
  if errors > 0:
138
137
  total = len(parsed_args.registered_limit_id)
139
138
  msg = _(
140
- "%(errors)s of %(total)s registered limits failed to "
141
- "delete."
139
+ "%(errors)s of %(total)s registered limits failed to delete."
142
140
  ) % {'errors': errors, 'total': total}
143
141
  raise exceptions.CommandError(msg)
144
142
 
@@ -176,8 +174,7 @@ class ListRegisteredLimit(command.Lister):
176
174
  )
177
175
  region = None
178
176
  if parsed_args.region:
179
- val = getattr(parsed_args, 'region', None)
180
- if 'None' not in val:
177
+ if 'None' not in parsed_args.region:
181
178
  # NOTE (vishakha): Due to bug #1799153 and for any another
182
179
  # related case where GET resource API does not support the
183
180
  # filter by name, osc_lib.utils.find_resource() method cannot
@@ -281,8 +278,7 @@ class SetRegisteredLimit(command.ShowOne):
281
278
 
282
279
  region = None
283
280
  if parsed_args.region:
284
- val = getattr(parsed_args, 'region', None)
285
- if 'None' not in val:
281
+ if 'None' not in parsed_args.region:
286
282
  # NOTE (vishakha): Due to bug #1799153 and for any another
287
283
  # related case where GET resource API does not support the
288
284
  # filter by name, osc_lib.utils.find_resource() method cannot
@@ -402,7 +402,7 @@ class DeleteRole(command.Command):
402
402
 
403
403
  if errors > 0:
404
404
  total = len(parsed_args.roles)
405
- msg = _("%(errors)s of %(total)s roles failed " "to delete.") % {
405
+ msg = _("%(errors)s of %(total)s roles failed to delete.") % {
406
406
  'errors': errors,
407
407
  'total': total,
408
408
  }
@@ -428,28 +428,27 @@ class ListRole(command.Lister):
428
428
  domain = identity_client.find_domain(
429
429
  name_or_id=parsed_args.domain,
430
430
  )
431
- columns = ('ID', 'Name', 'Domain')
432
431
  data = identity_client.roles(domain_id=domain.id)
432
+ return (
433
+ ('ID', 'Name', 'Domain'),
434
+ (
435
+ utils.get_item_properties(s, ('id', 'name'))
436
+ + (domain.name,)
437
+ for s in data
438
+ ),
439
+ )
440
+
433
441
  else:
434
- columns = ('ID', 'Name')
435
442
  data = identity_client.roles()
436
-
437
- return (
438
- columns,
439
- (
440
- utils.get_item_properties(
441
- s,
442
- columns,
443
- formatters={'Domain': lambda _: domain.name},
444
- )
445
- for s in data
446
- ),
447
- )
443
+ return (
444
+ ('ID', 'Name'),
445
+ (utils.get_item_properties(s, ('id', 'name')) for s in data),
446
+ )
448
447
 
449
448
 
450
449
  class RemoveRole(command.Command):
451
450
  _description = _(
452
- "Removes a role assignment from system/domain/project : " "user/group"
451
+ "Removes a role assignment from system/domain/project : user/group"
453
452
  )
454
453
 
455
454
  def get_parser(self, prog_name):
@@ -135,9 +135,10 @@ class DeleteService(command.Command):
135
135
 
136
136
  if result > 0:
137
137
  total = len(parsed_args.service)
138
- msg = _(
139
- "%(result)s of %(total)s services failed " "to delete."
140
- ) % {'result': result, 'total': total}
138
+ msg = _("%(result)s of %(total)s services failed to delete.") % {
139
+ 'result': result,
140
+ 'total': total,
141
+ }
141
142
  raise exceptions.CommandError(msg)
142
143
 
143
144
 
@@ -157,12 +158,11 @@ class ListService(command.Lister):
157
158
  def take_action(self, parsed_args):
158
159
  identity_client = self.app.client_manager.sdk_connection.identity
159
160
 
161
+ columns: tuple[str, ...] = ('id', 'name', 'type')
162
+ column_headers: tuple[str, ...] = ('ID', 'Name', 'Type')
160
163
  if parsed_args.long:
161
- columns = ('id', 'name', 'type', 'description', 'is_enabled')
162
- column_headers = ('ID', 'Name', 'Type', 'Description', 'Enabled')
163
- else:
164
- columns = ('id', 'name', 'type')
165
- column_headers = ('ID', 'Name', 'Type')
164
+ columns += ('description', 'is_enabled')
165
+ column_headers += ('Description', 'Enabled')
166
166
 
167
167
  data = identity_client.services()
168
168
 
@@ -77,8 +77,7 @@ class CreateServiceProvider(command.ShowOne):
77
77
  metavar='<sp-url>',
78
78
  required=True,
79
79
  help=_(
80
- 'A service URL where SAML assertions are being sent '
81
- '(required)'
80
+ 'A service URL where SAML assertions are being sent (required)'
82
81
  ),
83
82
  )
84
83
 
@@ -155,8 +154,7 @@ class DeleteServiceProvider(command.Command):
155
154
  if result > 0:
156
155
  total = len(parsed_args.service_provider)
157
156
  msg = _(
158
- "%(result)s of %(total)s service providers failed"
159
- " to delete."
157
+ "%(result)s of %(total)s service providers failed to delete."
160
158
  ) % {'result': result, 'total': total}
161
159
  raise exceptions.CommandError(msg)
162
160
 
@@ -204,8 +202,7 @@ class SetServiceProvider(command.ShowOne):
204
202
  '--auth-url',
205
203
  metavar='<auth-url>',
206
204
  help=_(
207
- 'New Authentication URL of remote '
208
- 'federated service provider'
205
+ 'New Authentication URL of remote federated service provider'
209
206
  ),
210
207
  )
211
208
 
@@ -83,7 +83,7 @@ def add_tag_option_to_parser_for_create(parser, resource_name):
83
83
  metavar='<tag>',
84
84
  default=[],
85
85
  help=_(
86
- 'Tag to be added to the %s ' '(repeat option to set multiple tags)'
86
+ 'Tag to be added to the %s (repeat option to set multiple tags)'
87
87
  )
88
88
  % resource_name,
89
89
  )
@@ -97,7 +97,7 @@ def add_tag_option_to_parser_for_set(parser, resource_name):
97
97
  metavar='<tag>',
98
98
  default=[],
99
99
  help=_(
100
- 'Tag to be added to the %s ' '(repeat option to set multiple tags)'
100
+ 'Tag to be added to the %s (repeat option to set multiple tags)'
101
101
  )
102
102
  % resource_name,
103
103
  )