python-openstackclient 8.3.0__py3-none-any.whl → 10.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openstackclient/__init__.py +2 -6
- openstackclient/api/api.py +41 -23
- openstackclient/api/compute_v2.py +44 -25
- openstackclient/api/object_store_v1.py +75 -97
- openstackclient/api/volume_v2.py +2 -1
- openstackclient/api/volume_v3.py +2 -1
- openstackclient/common/availability_zone.py +58 -42
- openstackclient/common/clientmanager.py +56 -29
- openstackclient/common/configuration.py +10 -3
- openstackclient/common/envvars.py +2 -2
- openstackclient/common/extension.py +14 -5
- openstackclient/common/limits.py +10 -5
- openstackclient/common/module.py +14 -6
- openstackclient/common/pagination.py +8 -2
- openstackclient/common/progressbar.py +7 -6
- openstackclient/common/project_cleanup.py +13 -7
- openstackclient/common/quota.py +126 -114
- openstackclient/common/versions.py +8 -2
- openstackclient/compute/client.py +7 -3
- openstackclient/compute/v2/agent.py +17 -10
- openstackclient/compute/v2/aggregate.py +36 -22
- openstackclient/compute/v2/console.py +14 -8
- openstackclient/compute/v2/console_connection.py +11 -3
- openstackclient/compute/v2/flavor.py +39 -21
- openstackclient/compute/v2/host.py +14 -6
- openstackclient/compute/v2/hypervisor.py +14 -5
- openstackclient/compute/v2/hypervisor_stats.py +10 -2
- openstackclient/compute/v2/keypair.py +29 -14
- openstackclient/compute/v2/server.py +251 -171
- openstackclient/compute/v2/server_backup.py +10 -4
- openstackclient/compute/v2/server_event.py +21 -12
- openstackclient/compute/v2/server_group.py +21 -11
- openstackclient/compute/v2/server_image.py +19 -10
- openstackclient/compute/v2/server_migration.py +24 -10
- openstackclient/compute/v2/server_share.py +274 -0
- openstackclient/compute/v2/server_volume.py +10 -4
- openstackclient/compute/v2/service.py +14 -7
- openstackclient/compute/v2/usage.py +26 -21
- openstackclient/identity/client.py +8 -3
- openstackclient/identity/common.py +103 -41
- openstackclient/identity/v2_0/catalog.py +14 -7
- openstackclient/identity/v2_0/ec2creds.py +21 -10
- openstackclient/identity/v2_0/endpoint.py +23 -11
- openstackclient/identity/v2_0/project.py +25 -14
- openstackclient/identity/v2_0/role.py +28 -14
- openstackclient/identity/v2_0/role_assignment.py +9 -3
- openstackclient/identity/v2_0/service.py +26 -12
- openstackclient/identity/v2_0/token.py +12 -5
- openstackclient/identity/v2_0/user.py +26 -15
- openstackclient/identity/v3/access_rule.py +26 -12
- openstackclient/identity/v3/application_credential.py +59 -24
- openstackclient/identity/v3/catalog.py +14 -7
- openstackclient/identity/v3/consumer.py +22 -11
- openstackclient/identity/v3/credential.py +36 -16
- openstackclient/identity/v3/domain.py +37 -18
- openstackclient/identity/v3/ec2creds.py +25 -12
- openstackclient/identity/v3/endpoint.py +42 -20
- openstackclient/identity/v3/endpoint_group.py +28 -17
- openstackclient/identity/v3/federation_protocol.py +71 -50
- openstackclient/identity/v3/group.py +55 -32
- openstackclient/identity/v3/identity_provider.py +92 -57
- openstackclient/identity/v3/implied_role.py +21 -9
- openstackclient/identity/v3/limit.py +115 -92
- openstackclient/identity/v3/mapping.py +26 -13
- openstackclient/identity/v3/policy.py +23 -12
- openstackclient/identity/v3/project.py +211 -122
- openstackclient/identity/v3/region.py +36 -16
- openstackclient/identity/v3/registered_limit.py +116 -109
- openstackclient/identity/v3/role.py +61 -31
- openstackclient/identity/v3/role_assignment.py +23 -6
- openstackclient/identity/v3/service.py +36 -16
- openstackclient/identity/v3/service_provider.py +37 -15
- openstackclient/identity/v3/tag.py +23 -17
- openstackclient/identity/v3/token.py +30 -14
- openstackclient/identity/v3/trust.py +32 -14
- openstackclient/identity/v3/unscoped_saml.py +10 -2
- openstackclient/identity/v3/user.py +49 -26
- openstackclient/image/client.py +7 -3
- openstackclient/image/v1/image.py +33 -26
- openstackclient/image/v2/cache.py +14 -9
- openstackclient/image/v2/image.py +76 -49
- openstackclient/image/v2/info.py +7 -1
- openstackclient/image/v2/metadef_namespaces.py +109 -13
- openstackclient/image/v2/metadef_objects.py +28 -15
- openstackclient/image/v2/metadef_properties.py +24 -13
- openstackclient/image/v2/metadef_resource_type_association.py +14 -7
- openstackclient/image/v2/metadef_resource_types.py +7 -1
- openstackclient/image/v2/task.py +15 -6
- openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +7 -192
- openstackclient/network/client.py +7 -2
- openstackclient/network/common.py +16 -241
- openstackclient/network/utils.py +36 -22
- openstackclient/network/v2/address_group.py +27 -16
- openstackclient/network/v2/address_scope.py +24 -13
- openstackclient/network/v2/bgpvpn/bgpvpn.py +463 -0
- openstackclient/network/v2/bgpvpn/constants.py +30 -0
- openstackclient/network/v2/bgpvpn/network_association.py +214 -0
- openstackclient/network/v2/bgpvpn/port_association.py +490 -0
- openstackclient/network/v2/bgpvpn/router_association.py +288 -0
- openstackclient/network/v2/default_security_group_rule.py +19 -10
- openstackclient/network/v2/floating_ip.py +110 -159
- openstackclient/network/v2/floating_ip_port_forwarding.py +30 -18
- openstackclient/network/v2/fwaas/__init__.py +0 -0
- openstackclient/network/v2/fwaas/group.py +466 -0
- openstackclient/network/v2/fwaas/policy.py +518 -0
- openstackclient/network/v2/fwaas/rule.py +574 -0
- openstackclient/network/v2/ip_availability.py +13 -5
- openstackclient/network/v2/l3_conntrack_helper.py +22 -13
- openstackclient/network/v2/local_ip.py +24 -13
- openstackclient/network/v2/local_ip_association.py +14 -7
- openstackclient/network/v2/ndp_proxy.py +20 -11
- openstackclient/network/v2/network.py +129 -196
- openstackclient/network/v2/network_agent.py +46 -25
- openstackclient/network/v2/network_auto_allocated_topology.py +22 -11
- openstackclient/network/v2/network_flavor.py +27 -16
- openstackclient/network/v2/network_flavor_profile.py +23 -12
- openstackclient/network/v2/network_meter.py +21 -10
- openstackclient/network/v2/network_meter_rule.py +21 -11
- openstackclient/network/v2/network_qos_policy.py +25 -15
- openstackclient/network/v2/network_qos_rule.py +32 -17
- openstackclient/network/v2/network_qos_rule_type.py +13 -5
- openstackclient/network/v2/network_rbac.py +23 -12
- openstackclient/network/v2/network_segment.py +20 -11
- openstackclient/network/v2/network_segment_range.py +56 -29
- openstackclient/network/v2/network_service_provider.py +7 -1
- openstackclient/network/v2/network_trunk.py +38 -22
- openstackclient/network/v2/port.py +54 -29
- openstackclient/network/v2/router.py +75 -52
- openstackclient/network/v2/security_group.py +87 -157
- openstackclient/network/v2/security_group_rule.py +100 -280
- openstackclient/network/v2/subnet.py +49 -28
- openstackclient/network/v2/subnet_pool.py +30 -17
- openstackclient/network/v2/taas/tap_flow.py +22 -11
- openstackclient/network/v2/taas/tap_mirror.py +22 -11
- openstackclient/network/v2/taas/tap_service.py +23 -12
- openstackclient/object/client.py +7 -2
- openstackclient/object/v1/account.py +13 -6
- openstackclient/object/v1/container.py +25 -15
- openstackclient/object/v1/object.py +25 -15
- openstackclient/py.typed +0 -0
- openstackclient/shell.py +46 -10
- openstackclient/tests/functional/base.py +55 -20
- openstackclient/tests/functional/common/test_extension.py +4 -0
- openstackclient/tests/functional/common/test_quota.py +3 -1
- openstackclient/tests/functional/compute/v2/common.py +14 -13
- openstackclient/tests/functional/compute/v2/test_flavor.py +3 -1
- openstackclient/tests/functional/compute/v2/test_server.py +3 -0
- openstackclient/tests/functional/identity/v2/common.py +10 -6
- openstackclient/tests/functional/identity/v2/test_role.py +4 -4
- openstackclient/tests/functional/identity/v3/common.py +25 -19
- openstackclient/tests/functional/identity/v3/test_group.py +20 -20
- openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
- openstackclient/tests/functional/identity/v3/test_limit.py +47 -0
- openstackclient/tests/functional/identity/v3/test_project.py +10 -10
- openstackclient/tests/functional/identity/v3/test_role.py +18 -18
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
- openstackclient/tests/functional/identity/v3/test_user.py +8 -8
- openstackclient/tests/functional/image/base.py +1 -6
- openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
- openstackclient/tests/functional/network/v2/common.py +5 -2
- openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
- openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
- openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
- openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
- openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
- openstackclient/tests/functional/object/v1/common.py +4 -0
- openstackclient/tests/functional/volume/v2/common.py +4 -0
- openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
- openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
- openstackclient/tests/functional/volume/v3/common.py +4 -0
- openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +56 -138
- openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
- openstackclient/tests/unit/common/test_availability_zone.py +35 -49
- openstackclient/tests/unit/common/test_extension.py +2 -2
- openstackclient/tests/unit/common/test_module.py +12 -7
- openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
- openstackclient/tests/unit/common/test_quota.py +62 -23
- openstackclient/tests/unit/compute/v2/fakes.py +25 -0
- openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
- openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
- openstackclient/tests/unit/compute/v2/test_server.py +17 -104
- openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
- openstackclient/tests/unit/identity/v3/fakes.py +3 -0
- openstackclient/tests/unit/identity/v3/test_group.py +4 -14
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
- openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
- openstackclient/tests/unit/identity/v3/test_project.py +831 -512
- openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +355 -220
- openstackclient/tests/unit/identity/v3/test_user.py +4 -4
- openstackclient/tests/unit/image/v2/test_image.py +16 -16
- openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
- openstackclient/tests/unit/network/test_common.py +0 -155
- openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
- openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
- openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
- openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
- openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
- openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
- openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
- openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
- openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
- openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
- openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
- openstackclient/tests/unit/network/v2/test_router.py +8 -9
- openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
- openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
- openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
- openstackclient/tests/unit/object/v1/fakes.py +8 -7
- openstackclient/tests/unit/object/v1/test_container.py +65 -101
- openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
- openstackclient/tests/unit/object/v1/test_object.py +44 -84
- openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
- openstackclient/tests/unit/test_hacking.py +108 -0
- openstackclient/tests/unit/volume/v2/fakes.py +1 -0
- openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
- openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
- openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
- openstackclient/tests/unit/volume/v3/fakes.py +1 -0
- openstackclient/tests/unit/volume/v3/test_volume.py +94 -15
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
- openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
- openstackclient/volume/client.py +7 -3
- openstackclient/volume/v2/backup_record.py +15 -6
- openstackclient/volume/v2/consistency_group.py +37 -25
- openstackclient/volume/v2/consistency_group_snapshot.py +27 -12
- openstackclient/volume/v2/qos_specs.py +30 -19
- openstackclient/volume/v2/service.py +17 -6
- openstackclient/volume/v2/volume.py +69 -34
- openstackclient/volume/v2/volume_backend.py +19 -6
- openstackclient/volume/v2/volume_backup.py +48 -22
- openstackclient/volume/v2/volume_host.py +6 -4
- openstackclient/volume/v2/volume_snapshot.py +52 -26
- openstackclient/volume/v2/volume_transfer_request.py +33 -15
- openstackclient/volume/v2/volume_type.py +46 -27
- openstackclient/volume/v3/block_storage_cleanup.py +11 -3
- openstackclient/volume/v3/block_storage_cluster.py +19 -7
- openstackclient/volume/v3/block_storage_log_level.py +15 -6
- openstackclient/volume/v3/block_storage_manage.py +10 -4
- openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
- openstackclient/volume/v3/service.py +16 -6
- openstackclient/volume/v3/volume.py +103 -46
- openstackclient/volume/v3/volume_attachment.py +43 -21
- openstackclient/volume/v3/volume_backup.py +55 -26
- openstackclient/volume/v3/volume_group.py +23 -13
- openstackclient/volume/v3/volume_group_snapshot.py +32 -13
- openstackclient/volume/v3/volume_group_type.py +26 -13
- openstackclient/volume/v3/volume_message.py +15 -7
- openstackclient/volume/v3/volume_snapshot.py +71 -34
- openstackclient/volume/v3/volume_transfer_request.py +33 -15
- openstackclient/volume/v3/volume_type.py +45 -27
- {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
- {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +279 -267
- {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
- {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +9 -0
- python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
- openstackclient/api/image_v1.py +0 -69
- openstackclient/api/image_v2.py +0 -79
- openstackclient/network/v2/floating_ip_pool.py +0 -38
- openstackclient/tests/functional/image/v1/test_image.py +0 -97
- openstackclient/tests/unit/api/test_image_v1.py +0 -96
- openstackclient/tests/unit/api/test_image_v2.py +0 -96
- openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
- openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
- openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
- python_openstackclient-8.3.0.dist-info/pbr.json +0 -1
- /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
- {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
- {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
|
@@ -13,8 +13,12 @@
|
|
|
13
13
|
|
|
14
14
|
"""Registered limits action implementations."""
|
|
15
15
|
|
|
16
|
+
import argparse
|
|
17
|
+
from collections.abc import Iterable, Sequence
|
|
16
18
|
import logging
|
|
19
|
+
from typing import Any
|
|
17
20
|
|
|
21
|
+
from openstack import utils as sdk_utils
|
|
18
22
|
from osc_lib import exceptions
|
|
19
23
|
from osc_lib import utils
|
|
20
24
|
|
|
@@ -25,10 +29,35 @@ from openstackclient.identity import common as common_utils
|
|
|
25
29
|
LOG = logging.getLogger(__name__)
|
|
26
30
|
|
|
27
31
|
|
|
32
|
+
def _format_registered_limit(
|
|
33
|
+
registered_limit: Any,
|
|
34
|
+
) -> tuple[tuple[str, ...], Any]:
|
|
35
|
+
columns = (
|
|
36
|
+
'default_limit',
|
|
37
|
+
'description',
|
|
38
|
+
'id',
|
|
39
|
+
'region_id',
|
|
40
|
+
'resource_name',
|
|
41
|
+
'service_id',
|
|
42
|
+
)
|
|
43
|
+
column_headers = (
|
|
44
|
+
'default_limit',
|
|
45
|
+
'description',
|
|
46
|
+
'id',
|
|
47
|
+
'region_id',
|
|
48
|
+
'resource_name',
|
|
49
|
+
'service_id',
|
|
50
|
+
)
|
|
51
|
+
return (
|
|
52
|
+
column_headers,
|
|
53
|
+
utils.get_item_properties(registered_limit, columns),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
28
57
|
class CreateRegisteredLimit(command.ShowOne):
|
|
29
58
|
_description = _("Create a registered limit")
|
|
30
59
|
|
|
31
|
-
def get_parser(self, prog_name):
|
|
60
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
32
61
|
parser = super().get_parser(prog_name)
|
|
33
62
|
parser.add_argument(
|
|
34
63
|
'--description',
|
|
@@ -63,66 +92,62 @@ class CreateRegisteredLimit(command.ShowOne):
|
|
|
63
92
|
)
|
|
64
93
|
return parser
|
|
65
94
|
|
|
66
|
-
def take_action(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
95
|
+
def take_action(
|
|
96
|
+
self, parsed_args: argparse.Namespace
|
|
97
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
98
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
99
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
71
100
|
)
|
|
72
|
-
|
|
101
|
+
|
|
102
|
+
kwargs = {}
|
|
103
|
+
|
|
104
|
+
if parsed_args.description:
|
|
105
|
+
kwargs["description"] = parsed_args.description
|
|
106
|
+
|
|
107
|
+
kwargs["service_id"] = common_utils.find_service_sdk(
|
|
108
|
+
identity_client, parsed_args.service
|
|
109
|
+
).id
|
|
110
|
+
|
|
73
111
|
if parsed_args.region:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
# filter by name, osc_lib.utils.find_resource() method cannot
|
|
78
|
-
# be used because that method try to fall back to list all the
|
|
79
|
-
# resource if requested resource cannot be get via name. Which
|
|
80
|
-
# ends up with NoUniqueMatch error.
|
|
81
|
-
# So osc_lib.utils.find_resource() function cannot be used for
|
|
82
|
-
# 'regions', using common_utils.get_resource() instead.
|
|
83
|
-
region = common_utils.get_resource(
|
|
84
|
-
identity_client.regions, parsed_args.region
|
|
85
|
-
)
|
|
86
|
-
else:
|
|
87
|
-
self.log.warning(
|
|
88
|
-
_(
|
|
89
|
-
"Passing 'None' to indicate no region is deprecated. "
|
|
90
|
-
"Instead, don't pass --region."
|
|
91
|
-
)
|
|
92
|
-
)
|
|
112
|
+
kwargs["region_id"] = identity_client.get_region(
|
|
113
|
+
parsed_args.region
|
|
114
|
+
).id
|
|
93
115
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
description=parsed_args.description,
|
|
99
|
-
region=region,
|
|
100
|
-
)
|
|
116
|
+
kwargs["resource_name"] = parsed_args.resource_name
|
|
117
|
+
kwargs["default_limit"] = parsed_args.default_limit
|
|
118
|
+
|
|
119
|
+
registered_limit = identity_client.create_registered_limit(**kwargs)
|
|
101
120
|
|
|
102
|
-
registered_limit
|
|
103
|
-
return zip(*sorted(registered_limit._info.items()))
|
|
121
|
+
return _format_registered_limit(registered_limit)
|
|
104
122
|
|
|
105
123
|
|
|
106
124
|
class DeleteRegisteredLimit(command.Command):
|
|
107
125
|
_description = _("Delete a registered limit")
|
|
108
126
|
|
|
109
|
-
def get_parser(self, prog_name):
|
|
127
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
110
128
|
parser = super().get_parser(prog_name)
|
|
111
129
|
parser.add_argument(
|
|
112
130
|
'registered_limits',
|
|
113
131
|
metavar='<registered-limits>',
|
|
114
132
|
nargs="+",
|
|
115
|
-
help=_(
|
|
133
|
+
help=_(
|
|
134
|
+
'Registered limit(s) to delete (ID) '
|
|
135
|
+
'(repeat option to remove multiple registered limits)'
|
|
136
|
+
),
|
|
116
137
|
)
|
|
117
138
|
return parser
|
|
118
139
|
|
|
119
|
-
def take_action(self, parsed_args):
|
|
120
|
-
identity_client =
|
|
140
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
141
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
142
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
143
|
+
)
|
|
121
144
|
|
|
122
145
|
errors = 0
|
|
123
146
|
for registered_limit_id in parsed_args.registered_limits:
|
|
124
147
|
try:
|
|
125
|
-
identity_client.
|
|
148
|
+
identity_client.delete_registered_limit(
|
|
149
|
+
registered_limit_id, ignore_missing=False
|
|
150
|
+
)
|
|
126
151
|
except Exception as e:
|
|
127
152
|
errors += 1
|
|
128
153
|
from pprint import pprint
|
|
@@ -147,7 +172,7 @@ class DeleteRegisteredLimit(command.Command):
|
|
|
147
172
|
class ListRegisteredLimit(command.Lister):
|
|
148
173
|
_description = _("List registered limits")
|
|
149
174
|
|
|
150
|
-
def get_parser(self, prog_name):
|
|
175
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
151
176
|
parser = super().get_parser(prog_name)
|
|
152
177
|
parser.add_argument(
|
|
153
178
|
'--service',
|
|
@@ -169,41 +194,27 @@ class ListRegisteredLimit(command.Lister):
|
|
|
169
194
|
)
|
|
170
195
|
return parser
|
|
171
196
|
|
|
172
|
-
def take_action(
|
|
173
|
-
|
|
197
|
+
def take_action(
|
|
198
|
+
self, parsed_args: argparse.Namespace
|
|
199
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
200
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
201
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
202
|
+
)
|
|
174
203
|
|
|
175
|
-
|
|
204
|
+
kwargs = {}
|
|
176
205
|
if parsed_args.service:
|
|
177
|
-
|
|
206
|
+
kwargs["service_id"] = common_utils.find_service_sdk(
|
|
178
207
|
identity_client, parsed_args.service
|
|
179
|
-
)
|
|
180
|
-
region = None
|
|
208
|
+
).id
|
|
181
209
|
if parsed_args.region:
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
# filter by name, osc_lib.utils.find_resource() method cannot
|
|
186
|
-
# be used because that method try to fall back to list all the
|
|
187
|
-
# resource if requested resource cannot be get via name. Which
|
|
188
|
-
# ends up with NoUniqueMatch error.
|
|
189
|
-
# So osc_lib.utils.find_resource() function cannot be used for
|
|
190
|
-
# 'regions', using common_utils.get_resource() instead.
|
|
191
|
-
region = common_utils.get_resource(
|
|
192
|
-
identity_client.regions, parsed_args.region
|
|
193
|
-
)
|
|
194
|
-
else:
|
|
195
|
-
self.log.warning(
|
|
196
|
-
_(
|
|
197
|
-
"Passing 'None' to indicate no region is deprecated. "
|
|
198
|
-
"Instead, don't pass --region."
|
|
199
|
-
)
|
|
200
|
-
)
|
|
210
|
+
kwargs["region_id"] = identity_client.get_region(
|
|
211
|
+
parsed_args.region
|
|
212
|
+
).id
|
|
201
213
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
)
|
|
214
|
+
if parsed_args.resource_name:
|
|
215
|
+
kwargs["resource_name"] = parsed_args.resource_name
|
|
216
|
+
|
|
217
|
+
registered_limits = identity_client.registered_limits(**kwargs)
|
|
207
218
|
|
|
208
219
|
columns = (
|
|
209
220
|
'ID',
|
|
@@ -222,7 +233,7 @@ class ListRegisteredLimit(command.Lister):
|
|
|
222
233
|
class SetRegisteredLimit(command.ShowOne):
|
|
223
234
|
_description = _("Update information about a registered limit")
|
|
224
235
|
|
|
225
|
-
def get_parser(self, prog_name):
|
|
236
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
226
237
|
parser = super().get_parser(prog_name)
|
|
227
238
|
parser.add_argument(
|
|
228
239
|
'registered_limit_id',
|
|
@@ -272,51 +283,44 @@ class SetRegisteredLimit(command.ShowOne):
|
|
|
272
283
|
)
|
|
273
284
|
return parser
|
|
274
285
|
|
|
275
|
-
def take_action(
|
|
276
|
-
|
|
286
|
+
def take_action(
|
|
287
|
+
self, parsed_args: argparse.Namespace
|
|
288
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
289
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
290
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
291
|
+
)
|
|
277
292
|
|
|
278
|
-
|
|
293
|
+
kwargs = {}
|
|
279
294
|
if parsed_args.service:
|
|
280
|
-
|
|
295
|
+
kwargs["service_id"] = common_utils.find_service_sdk(
|
|
281
296
|
identity_client, parsed_args.service
|
|
282
|
-
)
|
|
297
|
+
).id
|
|
298
|
+
|
|
299
|
+
if parsed_args.resource_name:
|
|
300
|
+
kwargs["resource_name"] = parsed_args.resource_name
|
|
301
|
+
|
|
302
|
+
if parsed_args.default_limit:
|
|
303
|
+
kwargs["default_limit"] = parsed_args.default_limit
|
|
304
|
+
|
|
305
|
+
if parsed_args.description:
|
|
306
|
+
kwargs["description"] = parsed_args.description
|
|
283
307
|
|
|
284
|
-
region = None
|
|
285
308
|
if parsed_args.region:
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
# filter by name, osc_lib.utils.find_resource() method cannot
|
|
290
|
-
# be used because that method try to fall back to list all the
|
|
291
|
-
# resource if requested resource cannot be get via name. Which
|
|
292
|
-
# ends up with NoUniqueMatch error.
|
|
293
|
-
# So osc_lib.utils.find_resource() function cannot be used for
|
|
294
|
-
# 'regions', using common_utils.get_resource() instead.
|
|
295
|
-
region = common_utils.get_resource(
|
|
296
|
-
identity_client.regions, parsed_args.region
|
|
297
|
-
)
|
|
298
|
-
else:
|
|
299
|
-
self.log.warning(
|
|
300
|
-
_("Passing 'None' to indicate no region is deprecated.")
|
|
301
|
-
)
|
|
309
|
+
kwargs["region_id"] = identity_client.get_region(
|
|
310
|
+
parsed_args.region
|
|
311
|
+
).id
|
|
302
312
|
|
|
303
|
-
registered_limit = identity_client.
|
|
304
|
-
parsed_args.registered_limit_id,
|
|
305
|
-
service=service,
|
|
306
|
-
resource_name=parsed_args.resource_name,
|
|
307
|
-
default_limit=parsed_args.default_limit,
|
|
308
|
-
description=parsed_args.description,
|
|
309
|
-
region=region,
|
|
313
|
+
registered_limit = identity_client.update_registered_limit(
|
|
314
|
+
parsed_args.registered_limit_id, **kwargs
|
|
310
315
|
)
|
|
311
316
|
|
|
312
|
-
registered_limit
|
|
313
|
-
return zip(*sorted(registered_limit._info.items()))
|
|
317
|
+
return _format_registered_limit(registered_limit)
|
|
314
318
|
|
|
315
319
|
|
|
316
320
|
class ShowRegisteredLimit(command.ShowOne):
|
|
317
321
|
_description = _("Display registered limit details")
|
|
318
322
|
|
|
319
|
-
def get_parser(self, prog_name):
|
|
323
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
320
324
|
parser = super().get_parser(prog_name)
|
|
321
325
|
parser.add_argument(
|
|
322
326
|
'registered_limit_id',
|
|
@@ -325,10 +329,13 @@ class ShowRegisteredLimit(command.ShowOne):
|
|
|
325
329
|
)
|
|
326
330
|
return parser
|
|
327
331
|
|
|
328
|
-
def take_action(
|
|
329
|
-
|
|
330
|
-
|
|
332
|
+
def take_action(
|
|
333
|
+
self, parsed_args: argparse.Namespace
|
|
334
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
335
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
336
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
337
|
+
)
|
|
338
|
+
registered_limit = identity_client.get_registered_limit(
|
|
331
339
|
parsed_args.registered_limit_id
|
|
332
340
|
)
|
|
333
|
-
registered_limit
|
|
334
|
-
return zip(*sorted(registered_limit._info.items()))
|
|
341
|
+
return _format_registered_limit(registered_limit)
|
|
@@ -15,9 +15,13 @@
|
|
|
15
15
|
|
|
16
16
|
"""Identity v3 Role action implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Iterable, Sequence
|
|
18
20
|
import logging
|
|
21
|
+
from typing import Any
|
|
19
22
|
|
|
20
23
|
from openstack import exceptions as sdk_exc
|
|
24
|
+
from openstack import utils as sdk_utils
|
|
21
25
|
from osc_lib import exceptions
|
|
22
26
|
from osc_lib import utils
|
|
23
27
|
|
|
@@ -29,7 +33,7 @@ from openstackclient.identity import common
|
|
|
29
33
|
LOG = logging.getLogger(__name__)
|
|
30
34
|
|
|
31
35
|
|
|
32
|
-
def _format_role(role):
|
|
36
|
+
def _format_role(role: Any) -> tuple[tuple[str, ...], Any]:
|
|
33
37
|
columns = (
|
|
34
38
|
"id",
|
|
35
39
|
"name",
|
|
@@ -48,7 +52,9 @@ def _format_role(role):
|
|
|
48
52
|
)
|
|
49
53
|
|
|
50
54
|
|
|
51
|
-
def _add_identity_and_resource_options_to_parser(
|
|
55
|
+
def _add_identity_and_resource_options_to_parser(
|
|
56
|
+
parser: argparse.ArgumentParser,
|
|
57
|
+
) -> None:
|
|
52
58
|
system_or_domain_or_project = parser.add_mutually_exclusive_group()
|
|
53
59
|
system_or_domain_or_project.add_argument(
|
|
54
60
|
'--system',
|
|
@@ -83,9 +89,11 @@ def _add_identity_and_resource_options_to_parser(parser):
|
|
|
83
89
|
|
|
84
90
|
|
|
85
91
|
def _process_identity_and_resource_options(
|
|
86
|
-
parsed_args
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
parsed_args: argparse.Namespace,
|
|
93
|
+
identity_client: Any,
|
|
94
|
+
validate_actor_existence: bool = True,
|
|
95
|
+
) -> dict[str, Any]:
|
|
96
|
+
def _find_user() -> Any:
|
|
89
97
|
domain_id = (
|
|
90
98
|
common._find_sdk_id(
|
|
91
99
|
identity_client.find_domain,
|
|
@@ -102,7 +110,7 @@ def _process_identity_and_resource_options(
|
|
|
102
110
|
domain_id=domain_id,
|
|
103
111
|
)
|
|
104
112
|
|
|
105
|
-
def _find_group():
|
|
113
|
+
def _find_group() -> Any:
|
|
106
114
|
domain_id = (
|
|
107
115
|
common._find_sdk_id(
|
|
108
116
|
identity_client.find_domain,
|
|
@@ -119,7 +127,7 @@ def _process_identity_and_resource_options(
|
|
|
119
127
|
domain_id=domain_id,
|
|
120
128
|
)
|
|
121
129
|
|
|
122
|
-
def _find_project():
|
|
130
|
+
def _find_project() -> Any:
|
|
123
131
|
domain_id = (
|
|
124
132
|
common._find_sdk_id(
|
|
125
133
|
identity_client.find_domain,
|
|
@@ -180,7 +188,7 @@ class AddRole(command.Command):
|
|
|
180
188
|
"system, a domain, or a project"
|
|
181
189
|
)
|
|
182
190
|
|
|
183
|
-
def get_parser(self, prog_name):
|
|
191
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
184
192
|
parser = super().get_parser(prog_name)
|
|
185
193
|
parser.add_argument(
|
|
186
194
|
'role',
|
|
@@ -191,8 +199,10 @@ class AddRole(command.Command):
|
|
|
191
199
|
common.add_role_domain_option_to_parser(parser)
|
|
192
200
|
return parser
|
|
193
201
|
|
|
194
|
-
def take_action(self, parsed_args):
|
|
195
|
-
identity_client =
|
|
202
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
203
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
204
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
205
|
+
)
|
|
196
206
|
|
|
197
207
|
if (
|
|
198
208
|
not parsed_args.user
|
|
@@ -278,7 +288,7 @@ class AddRole(command.Command):
|
|
|
278
288
|
class CreateRole(command.ShowOne):
|
|
279
289
|
_description = _("Create new role")
|
|
280
290
|
|
|
281
|
-
def get_parser(self, prog_name):
|
|
291
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
282
292
|
parser = super().get_parser(prog_name)
|
|
283
293
|
parser.add_argument(
|
|
284
294
|
'name',
|
|
@@ -303,10 +313,14 @@ class CreateRole(command.ShowOne):
|
|
|
303
313
|
common.add_resource_option_to_parser(parser)
|
|
304
314
|
return parser
|
|
305
315
|
|
|
306
|
-
def take_action(
|
|
307
|
-
|
|
316
|
+
def take_action(
|
|
317
|
+
self, parsed_args: argparse.Namespace
|
|
318
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
319
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
320
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
321
|
+
)
|
|
308
322
|
|
|
309
|
-
create_kwargs = {}
|
|
323
|
+
create_kwargs: dict[str, Any] = {}
|
|
310
324
|
if parsed_args.domain:
|
|
311
325
|
create_kwargs['domain_id'] = common._find_sdk_id(
|
|
312
326
|
identity_client.find_domain, name_or_id=parsed_args.domain
|
|
@@ -341,7 +355,7 @@ class CreateRole(command.ShowOne):
|
|
|
341
355
|
class DeleteRole(command.Command):
|
|
342
356
|
_description = _("Delete role(s)")
|
|
343
357
|
|
|
344
|
-
def get_parser(self, prog_name):
|
|
358
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
345
359
|
parser = super().get_parser(prog_name)
|
|
346
360
|
parser.add_argument(
|
|
347
361
|
'roles',
|
|
@@ -356,8 +370,10 @@ class DeleteRole(command.Command):
|
|
|
356
370
|
)
|
|
357
371
|
return parser
|
|
358
372
|
|
|
359
|
-
def take_action(self, parsed_args):
|
|
360
|
-
identity_client =
|
|
373
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
374
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
375
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
376
|
+
)
|
|
361
377
|
|
|
362
378
|
domain_id = None
|
|
363
379
|
if parsed_args.domain:
|
|
@@ -395,7 +411,7 @@ class DeleteRole(command.Command):
|
|
|
395
411
|
class ListRole(command.Lister):
|
|
396
412
|
_description = _("List roles")
|
|
397
413
|
|
|
398
|
-
def get_parser(self, prog_name):
|
|
414
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
399
415
|
parser = super().get_parser(prog_name)
|
|
400
416
|
parser.add_argument(
|
|
401
417
|
'--domain',
|
|
@@ -404,8 +420,12 @@ class ListRole(command.Lister):
|
|
|
404
420
|
)
|
|
405
421
|
return parser
|
|
406
422
|
|
|
407
|
-
def take_action(
|
|
408
|
-
|
|
423
|
+
def take_action(
|
|
424
|
+
self, parsed_args: argparse.Namespace
|
|
425
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
426
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
427
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
428
|
+
)
|
|
409
429
|
|
|
410
430
|
if parsed_args.domain:
|
|
411
431
|
domain = identity_client.find_domain(
|
|
@@ -416,8 +436,10 @@ class ListRole(command.Lister):
|
|
|
416
436
|
return (
|
|
417
437
|
('ID', 'Name', 'Domain'),
|
|
418
438
|
(
|
|
419
|
-
|
|
420
|
-
|
|
439
|
+
(
|
|
440
|
+
*utils.get_item_properties(s, ('id', 'name')),
|
|
441
|
+
domain.name,
|
|
442
|
+
)
|
|
421
443
|
for s in data
|
|
422
444
|
),
|
|
423
445
|
)
|
|
@@ -435,7 +457,7 @@ class RemoveRole(command.Command):
|
|
|
435
457
|
"Removes a role assignment from system/domain/project : user/group"
|
|
436
458
|
)
|
|
437
459
|
|
|
438
|
-
def get_parser(self, prog_name):
|
|
460
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
439
461
|
parser = super().get_parser(prog_name)
|
|
440
462
|
parser.add_argument(
|
|
441
463
|
'role',
|
|
@@ -447,8 +469,10 @@ class RemoveRole(command.Command):
|
|
|
447
469
|
|
|
448
470
|
return parser
|
|
449
471
|
|
|
450
|
-
def take_action(self, parsed_args):
|
|
451
|
-
identity_client =
|
|
472
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
473
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
474
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
475
|
+
)
|
|
452
476
|
if (
|
|
453
477
|
not parsed_args.user
|
|
454
478
|
and not parsed_args.domain
|
|
@@ -527,7 +551,7 @@ class RemoveRole(command.Command):
|
|
|
527
551
|
class SetRole(command.Command):
|
|
528
552
|
_description = _("Set role properties")
|
|
529
553
|
|
|
530
|
-
def get_parser(self, prog_name):
|
|
554
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
531
555
|
parser = super().get_parser(prog_name)
|
|
532
556
|
parser.add_argument(
|
|
533
557
|
'role',
|
|
@@ -552,8 +576,10 @@ class SetRole(command.Command):
|
|
|
552
576
|
common.add_resource_option_to_parser(parser)
|
|
553
577
|
return parser
|
|
554
578
|
|
|
555
|
-
def take_action(self, parsed_args):
|
|
556
|
-
identity_client =
|
|
579
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
580
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
581
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
582
|
+
)
|
|
557
583
|
|
|
558
584
|
update_kwargs = {}
|
|
559
585
|
if parsed_args.description:
|
|
@@ -585,7 +611,7 @@ class SetRole(command.Command):
|
|
|
585
611
|
class ShowRole(command.ShowOne):
|
|
586
612
|
_description = _("Display role details")
|
|
587
613
|
|
|
588
|
-
def get_parser(self, prog_name):
|
|
614
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
589
615
|
parser = super().get_parser(prog_name)
|
|
590
616
|
parser.add_argument(
|
|
591
617
|
'role',
|
|
@@ -599,8 +625,12 @@ class ShowRole(command.ShowOne):
|
|
|
599
625
|
)
|
|
600
626
|
return parser
|
|
601
627
|
|
|
602
|
-
def take_action(
|
|
603
|
-
|
|
628
|
+
def take_action(
|
|
629
|
+
self, parsed_args: argparse.Namespace
|
|
630
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
631
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
632
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
633
|
+
)
|
|
604
634
|
|
|
605
635
|
domain_id = None
|
|
606
636
|
if parsed_args.domain:
|
|
@@ -13,13 +13,22 @@
|
|
|
13
13
|
|
|
14
14
|
"""Identity v3 Assignment action implementations"""
|
|
15
15
|
|
|
16
|
+
import argparse
|
|
17
|
+
from collections.abc import Iterable
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
from openstack import utils as sdk_utils
|
|
21
|
+
from osc_lib import exceptions
|
|
22
|
+
|
|
16
23
|
from openstackclient import command
|
|
17
24
|
from openstackclient.i18n import _
|
|
18
25
|
from openstackclient.identity import common
|
|
19
26
|
|
|
20
27
|
|
|
21
|
-
def _format_role_assignment_(
|
|
22
|
-
|
|
28
|
+
def _format_role_assignment_(
|
|
29
|
+
assignment: Any, include_names: Any
|
|
30
|
+
) -> tuple[Any, ...]:
|
|
31
|
+
def _get_names(attr: Any) -> str:
|
|
23
32
|
return (
|
|
24
33
|
(
|
|
25
34
|
attr['name']
|
|
@@ -34,7 +43,7 @@ def _format_role_assignment_(assignment, include_names):
|
|
|
34
43
|
else ''
|
|
35
44
|
)
|
|
36
45
|
|
|
37
|
-
def _get_ids(attr):
|
|
46
|
+
def _get_ids(attr: Any) -> str:
|
|
38
47
|
return attr['id'] or '' if attr else ''
|
|
39
48
|
|
|
40
49
|
func = _get_names if include_names else _get_ids
|
|
@@ -52,7 +61,7 @@ def _format_role_assignment_(assignment, include_names):
|
|
|
52
61
|
class ListRoleAssignment(command.Lister):
|
|
53
62
|
_description = _("List role assignments")
|
|
54
63
|
|
|
55
|
-
def get_parser(self, prog_name):
|
|
64
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
56
65
|
parser = super().get_parser(prog_name)
|
|
57
66
|
parser.add_argument(
|
|
58
67
|
'--effective',
|
|
@@ -117,8 +126,12 @@ class ListRoleAssignment(command.Lister):
|
|
|
117
126
|
)
|
|
118
127
|
return parser
|
|
119
128
|
|
|
120
|
-
def take_action(
|
|
121
|
-
|
|
129
|
+
def take_action(
|
|
130
|
+
self, parsed_args: argparse.Namespace
|
|
131
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
132
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
133
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
134
|
+
)
|
|
122
135
|
auth_ref = self.app.client_manager.auth_ref
|
|
123
136
|
|
|
124
137
|
role_id = None
|
|
@@ -151,6 +164,8 @@ class ListRoleAssignment(command.Lister):
|
|
|
151
164
|
)
|
|
152
165
|
elif parsed_args.authuser:
|
|
153
166
|
if auth_ref:
|
|
167
|
+
if auth_ref.user_id is None:
|
|
168
|
+
raise exceptions.CommandError('missing auth info')
|
|
154
169
|
user_id = common._find_sdk_id(
|
|
155
170
|
identity_client.find_user,
|
|
156
171
|
name_or_id=auth_ref.user_id,
|
|
@@ -185,6 +200,8 @@ class ListRoleAssignment(command.Lister):
|
|
|
185
200
|
)
|
|
186
201
|
elif parsed_args.authproject:
|
|
187
202
|
if auth_ref:
|
|
203
|
+
if auth_ref.project_id is None:
|
|
204
|
+
raise exceptions.CommandError('missing auth info')
|
|
188
205
|
project_id = common._find_sdk_id(
|
|
189
206
|
identity_client.find_project,
|
|
190
207
|
name_or_id=auth_ref.project_id,
|