python-openstackclient 9.0.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 +97 -99
- 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 +249 -169
- 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 +78 -47
- 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 +23 -11
- 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 +38 -16
- 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 +38 -16
- openstackclient/identity/v3/mapping.py +26 -13
- openstackclient/identity/v3/policy.py +23 -12
- openstackclient/identity/v3/project.py +43 -23
- openstackclient/identity/v3/region.py +36 -16
- openstackclient/identity/v3/registered_limit.py +40 -16
- 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 -6
- 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 +74 -48
- 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_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/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 +11 -7
- 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 +6 -26
- 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 +11 -96
- 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_user.py +4 -4
- openstackclient/tests/unit/image/v2/test_image.py +11 -11
- 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_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 +60 -3
- 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 +29 -17
- openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
- openstackclient/volume/v2/qos_specs.py +28 -17
- openstackclient/volume/v2/service.py +17 -6
- openstackclient/volume/v2/volume.py +57 -29
- openstackclient/volume/v2/volume_backend.py +19 -6
- openstackclient/volume/v2/volume_backup.py +46 -20
- openstackclient/volume/v2/volume_host.py +6 -4
- openstackclient/volume/v2/volume_snapshot.py +50 -24
- openstackclient/volume/v2/volume_transfer_request.py +31 -13
- openstackclient/volume/v2/volume_type.py +43 -24
- 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 +89 -39
- openstackclient/volume/v3/volume_attachment.py +43 -21
- openstackclient/volume/v3/volume_backup.py +53 -24
- 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 +69 -32
- openstackclient/volume/v3/volume_transfer_request.py +31 -13
- openstackclient/volume/v3/volume_type.py +42 -24
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +271 -260
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +4 -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-9.0.0.dist-info/pbr.json +0 -1
- /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
"""Compute v2 Server action implementations"""
|
|
16
16
|
|
|
17
|
+
import argparse
|
|
18
|
+
from collections.abc import Iterable
|
|
19
|
+
from typing import Any
|
|
20
|
+
|
|
17
21
|
from openstack import utils as sdk_utils
|
|
18
22
|
from osc_lib import exceptions
|
|
19
23
|
from osc_lib import utils
|
|
@@ -25,7 +29,7 @@ from openstackclient.i18n import _
|
|
|
25
29
|
class ListServerVolume(command.Lister):
|
|
26
30
|
"""List all the volumes attached to a server."""
|
|
27
31
|
|
|
28
|
-
def get_parser(self, prog_name):
|
|
32
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
29
33
|
parser = super().get_parser(prog_name)
|
|
30
34
|
parser.add_argument(
|
|
31
35
|
'server',
|
|
@@ -33,7 +37,9 @@ class ListServerVolume(command.Lister):
|
|
|
33
37
|
)
|
|
34
38
|
return parser
|
|
35
39
|
|
|
36
|
-
def take_action(
|
|
40
|
+
def take_action(
|
|
41
|
+
self, parsed_args: argparse.Namespace
|
|
42
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
37
43
|
compute_client = self.app.client_manager.compute
|
|
38
44
|
|
|
39
45
|
server = compute_client.find_server(
|
|
@@ -81,7 +87,7 @@ class ListServerVolume(command.Lister):
|
|
|
81
87
|
class SetServerVolume(command.Command):
|
|
82
88
|
"""Update a volume attachment on the server."""
|
|
83
89
|
|
|
84
|
-
def get_parser(self, prog_name):
|
|
90
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
85
91
|
parser = super().get_parser(prog_name)
|
|
86
92
|
parser.add_argument(
|
|
87
93
|
'server',
|
|
@@ -113,7 +119,7 @@ class SetServerVolume(command.Command):
|
|
|
113
119
|
)
|
|
114
120
|
return parser
|
|
115
121
|
|
|
116
|
-
def take_action(self, parsed_args):
|
|
122
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
117
123
|
compute_client = self.app.client_manager.compute
|
|
118
124
|
volume_client = self.app.client_manager.sdk_connection.volume
|
|
119
125
|
|
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
"""Service action implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Iterable
|
|
18
20
|
import logging
|
|
21
|
+
from typing import Any
|
|
19
22
|
|
|
20
23
|
from openstack import utils as sdk_utils
|
|
21
24
|
from osc_lib import exceptions
|
|
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
|
|
|
31
34
|
class DeleteService(command.Command):
|
|
32
35
|
_description = _("Delete compute service(s)")
|
|
33
36
|
|
|
34
|
-
def get_parser(self, prog_name):
|
|
37
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
35
38
|
parser = super().get_parser(prog_name)
|
|
36
39
|
parser.add_argument(
|
|
37
40
|
"service",
|
|
@@ -51,7 +54,7 @@ class DeleteService(command.Command):
|
|
|
51
54
|
)
|
|
52
55
|
return parser
|
|
53
56
|
|
|
54
|
-
def take_action(self, parsed_args):
|
|
57
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
55
58
|
compute_client = self.app.client_manager.compute
|
|
56
59
|
result = 0
|
|
57
60
|
for s in parsed_args.service:
|
|
@@ -84,7 +87,7 @@ value which can be used to uniquely identify the service in a multi-cell
|
|
|
84
87
|
deployment."""
|
|
85
88
|
)
|
|
86
89
|
|
|
87
|
-
def get_parser(self, prog_name):
|
|
90
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
88
91
|
parser = super().get_parser(prog_name)
|
|
89
92
|
parser.add_argument(
|
|
90
93
|
"--host",
|
|
@@ -107,7 +110,9 @@ deployment."""
|
|
|
107
110
|
)
|
|
108
111
|
return parser
|
|
109
112
|
|
|
110
|
-
def take_action(
|
|
113
|
+
def take_action(
|
|
114
|
+
self, parsed_args: argparse.Namespace
|
|
115
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
111
116
|
compute_client = self.app.client_manager.compute
|
|
112
117
|
columns: tuple[str, ...] = (
|
|
113
118
|
"id",
|
|
@@ -146,7 +151,7 @@ deployment."""
|
|
|
146
151
|
class SetService(command.Command):
|
|
147
152
|
_description = _("Set compute service properties")
|
|
148
153
|
|
|
149
|
-
def get_parser(self, prog_name):
|
|
154
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
150
155
|
parser = super().get_parser(prog_name)
|
|
151
156
|
parser.add_argument("host", metavar="<host>", help=_("Name of host"))
|
|
152
157
|
parser.add_argument(
|
|
@@ -192,7 +197,9 @@ class SetService(command.Command):
|
|
|
192
197
|
return parser
|
|
193
198
|
|
|
194
199
|
@staticmethod
|
|
195
|
-
def _find_service_by_host_and_binary(
|
|
200
|
+
def _find_service_by_host_and_binary(
|
|
201
|
+
compute_client: Any, host: str, binary: str
|
|
202
|
+
) -> Any:
|
|
196
203
|
"""Utility method to find a compute service by host and binary
|
|
197
204
|
|
|
198
205
|
:param host: the name of the compute service host
|
|
@@ -220,7 +227,7 @@ class SetService(command.Command):
|
|
|
220
227
|
raise exceptions.CommandError(msg)
|
|
221
228
|
return services[0]
|
|
222
229
|
|
|
223
|
-
def take_action(self, parsed_args):
|
|
230
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
224
231
|
compute_client = self.app.client_manager.compute
|
|
225
232
|
|
|
226
233
|
if (
|
|
@@ -15,10 +15,11 @@
|
|
|
15
15
|
|
|
16
16
|
"""Usage action implementations"""
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Collection, Iterable, Sequence
|
|
19
20
|
import datetime
|
|
20
21
|
import functools
|
|
21
|
-
|
|
22
|
+
from typing import Any, cast
|
|
22
23
|
|
|
23
24
|
from cliff import columns as cliff_columns
|
|
24
25
|
from osc_lib import utils
|
|
@@ -40,32 +41,32 @@ class ProjectColumn(cliff_columns.FormattableColumn[str]):
|
|
|
40
41
|
project_cache)`` to use this.
|
|
41
42
|
"""
|
|
42
43
|
|
|
43
|
-
def __init__(self, value, project_cache=None):
|
|
44
|
+
def __init__(self, value: str, project_cache: Any = None) -> None:
|
|
44
45
|
super().__init__(value)
|
|
45
46
|
self.project_cache = project_cache or {}
|
|
46
47
|
|
|
47
|
-
def human_readable(self):
|
|
48
|
+
def human_readable(self) -> str:
|
|
48
49
|
project = self._value
|
|
49
50
|
if not project:
|
|
50
51
|
return ''
|
|
51
52
|
|
|
52
53
|
if project in self.project_cache.keys():
|
|
53
|
-
return self.project_cache[project].name
|
|
54
|
+
return cast(str, self.project_cache[project].name)
|
|
54
55
|
|
|
55
56
|
return project
|
|
56
57
|
|
|
57
58
|
|
|
58
|
-
class CountColumn(cliff_columns.FormattableColumn[Collection[
|
|
59
|
-
def human_readable(self):
|
|
60
|
-
return len(self._value) if self._value is not None else
|
|
59
|
+
class CountColumn(cliff_columns.FormattableColumn[Collection[Any]]):
|
|
60
|
+
def human_readable(self) -> str:
|
|
61
|
+
return str(len(self._value)) if self._value is not None else ""
|
|
61
62
|
|
|
62
63
|
|
|
63
64
|
class FloatColumn(cliff_columns.FormattableColumn[float]):
|
|
64
|
-
def human_readable(self):
|
|
65
|
-
return
|
|
65
|
+
def human_readable(self) -> str:
|
|
66
|
+
return f"{self._value:.2f}"
|
|
66
67
|
|
|
67
68
|
|
|
68
|
-
def _formatters(project_cache):
|
|
69
|
+
def _formatters(project_cache: Any) -> dict[str, Any]:
|
|
69
70
|
return {
|
|
70
71
|
'project_id': functools.partial(
|
|
71
72
|
ProjectColumn, project_cache=project_cache
|
|
@@ -77,21 +78,21 @@ def _formatters(project_cache):
|
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
|
|
80
|
-
def _get_usage_marker(usage):
|
|
81
|
+
def _get_usage_marker(usage: Any) -> str | None:
|
|
81
82
|
marker = None
|
|
82
83
|
if hasattr(usage, 'server_usages') and usage.server_usages:
|
|
83
84
|
marker = usage.server_usages[-1]['instance_id']
|
|
84
85
|
return marker
|
|
85
86
|
|
|
86
87
|
|
|
87
|
-
def _get_usage_list_marker(usage_list):
|
|
88
|
+
def _get_usage_list_marker(usage_list: Any) -> str | None:
|
|
88
89
|
marker = None
|
|
89
90
|
if usage_list:
|
|
90
91
|
marker = _get_usage_marker(usage_list[-1])
|
|
91
92
|
return marker
|
|
92
93
|
|
|
93
94
|
|
|
94
|
-
def _merge_usage(usage, next_usage):
|
|
95
|
+
def _merge_usage(usage: Any, next_usage: Any) -> None:
|
|
95
96
|
usage.server_usages.extend(next_usage.server_usages)
|
|
96
97
|
usage.total_hours += next_usage.total_hours
|
|
97
98
|
usage.total_memory_mb_usage += next_usage.total_memory_mb_usage
|
|
@@ -99,7 +100,7 @@ def _merge_usage(usage, next_usage):
|
|
|
99
100
|
usage.total_local_gb_usage += next_usage.total_local_gb_usage
|
|
100
101
|
|
|
101
102
|
|
|
102
|
-
def _merge_usage_list(usages, next_usage_list):
|
|
103
|
+
def _merge_usage_list(usages: Any, next_usage_list: Any) -> None:
|
|
103
104
|
for next_usage in next_usage_list:
|
|
104
105
|
if next_usage.project_id in usages:
|
|
105
106
|
_merge_usage(usages[next_usage.project_id], next_usage)
|
|
@@ -110,7 +111,7 @@ def _merge_usage_list(usages, next_usage_list):
|
|
|
110
111
|
class ListUsage(command.Lister):
|
|
111
112
|
_description = _("List resource usage per project")
|
|
112
113
|
|
|
113
|
-
def get_parser(self, prog_name):
|
|
114
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
114
115
|
parser = super().get_parser(prog_name)
|
|
115
116
|
parser.add_argument(
|
|
116
117
|
"--start",
|
|
@@ -128,12 +129,14 @@ class ListUsage(command.Lister):
|
|
|
128
129
|
)
|
|
129
130
|
return parser
|
|
130
131
|
|
|
131
|
-
def take_action(
|
|
132
|
-
|
|
132
|
+
def take_action(
|
|
133
|
+
self, parsed_args: argparse.Namespace
|
|
134
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
135
|
+
def _format_project(project: str) -> str:
|
|
133
136
|
if not project:
|
|
134
137
|
return ""
|
|
135
138
|
if project in project_cache.keys():
|
|
136
|
-
return project_cache[project].name
|
|
139
|
+
return cast(str, project_cache[project].name)
|
|
137
140
|
else:
|
|
138
141
|
return project
|
|
139
142
|
|
|
@@ -210,7 +213,7 @@ class ListUsage(command.Lister):
|
|
|
210
213
|
class ShowUsage(command.ShowOne):
|
|
211
214
|
_description = _("Show resource usage for a single project")
|
|
212
215
|
|
|
213
|
-
def get_parser(self, prog_name):
|
|
216
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
214
217
|
parser = super().get_parser(prog_name)
|
|
215
218
|
parser.add_argument(
|
|
216
219
|
"--project",
|
|
@@ -234,7 +237,9 @@ class ShowUsage(command.ShowOne):
|
|
|
234
237
|
)
|
|
235
238
|
return parser
|
|
236
239
|
|
|
237
|
-
def take_action(
|
|
240
|
+
def take_action(
|
|
241
|
+
self, parsed_args: argparse.Namespace
|
|
242
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
238
243
|
identity_client = self.app.client_manager.identity
|
|
239
244
|
compute_client = self.app.client_manager.compute
|
|
240
245
|
date_cli_format = "%Y-%m-%d"
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# License for the specific language governing permissions and limitations
|
|
13
13
|
# under the License.
|
|
14
14
|
|
|
15
|
+
import argparse
|
|
15
16
|
import logging
|
|
17
|
+
from typing import Any
|
|
16
18
|
|
|
17
19
|
from keystoneclient.v2_0 import client as identity_client_v2
|
|
18
20
|
from osc_lib import utils
|
|
@@ -39,7 +41,7 @@ AUTH_VERSIONS = {
|
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def make_client(instance):
|
|
44
|
+
def make_client(instance: Any) -> Any:
|
|
43
45
|
"""Returns an identity service client."""
|
|
44
46
|
identity_client = utils.get_client_class(
|
|
45
47
|
API_NAME, instance._api_version[API_NAME], API_VERSIONS
|
|
@@ -56,7 +58,9 @@ def make_client(instance):
|
|
|
56
58
|
return client
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
def build_option_parser(
|
|
61
|
+
def build_option_parser(
|
|
62
|
+
parser: argparse.ArgumentParser,
|
|
63
|
+
) -> argparse.ArgumentParser:
|
|
60
64
|
"""Hook to add global options"""
|
|
61
65
|
parser.add_argument(
|
|
62
66
|
'--os-identity-api-version',
|
|
@@ -70,10 +74,11 @@ def build_option_parser(parser):
|
|
|
70
74
|
return parser
|
|
71
75
|
|
|
72
76
|
|
|
77
|
+
# We're not going to add type hints to this at this point
|
|
73
78
|
class IdentityClientv2(identity_client_v2.Client):
|
|
74
79
|
"""Tweak the earlier client class to deal with some changes"""
|
|
75
80
|
|
|
76
|
-
def __getattr__(self, name):
|
|
81
|
+
def __getattr__(self, name: str) -> Any:
|
|
77
82
|
# Map v3 'projects' back to v2 'tenants'
|
|
78
83
|
if name == "projects":
|
|
79
84
|
return self.tenants
|
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
"""Common identity code"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Callable
|
|
20
|
+
from typing import Any, cast
|
|
21
|
+
|
|
18
22
|
from keystoneclient import exceptions as identity_exc
|
|
19
23
|
from keystoneclient.v3 import domains
|
|
20
24
|
from keystoneclient.v3 import groups
|
|
@@ -27,7 +31,7 @@ from osc_lib import utils
|
|
|
27
31
|
from openstackclient.i18n import _
|
|
28
32
|
|
|
29
33
|
|
|
30
|
-
def find_service_in_list(service_list, service_id):
|
|
34
|
+
def find_service_in_list(service_list: list[Any], service_id: str) -> Any:
|
|
31
35
|
"""Find a service by id in service list."""
|
|
32
36
|
|
|
33
37
|
for service in service_list:
|
|
@@ -38,7 +42,7 @@ def find_service_in_list(service_list, service_id):
|
|
|
38
42
|
)
|
|
39
43
|
|
|
40
44
|
|
|
41
|
-
def find_service(identity_client, name_type_or_id):
|
|
45
|
+
def find_service(identity_client: Any, name_type_or_id: str) -> Any:
|
|
42
46
|
"""Find a service by id, name or type."""
|
|
43
47
|
|
|
44
48
|
try:
|
|
@@ -74,7 +78,7 @@ def find_service(identity_client, name_type_or_id):
|
|
|
74
78
|
raise exceptions.CommandError(msg % name_type_or_id)
|
|
75
79
|
|
|
76
80
|
|
|
77
|
-
def find_service_sdk(identity_client, name_type_or_id):
|
|
81
|
+
def find_service_sdk(identity_client: Any, name_type_or_id: str) -> Any:
|
|
78
82
|
"""Find a service by id, name or type."""
|
|
79
83
|
|
|
80
84
|
try:
|
|
@@ -107,7 +111,7 @@ def find_service_sdk(identity_client, name_type_or_id):
|
|
|
107
111
|
return service
|
|
108
112
|
|
|
109
113
|
|
|
110
|
-
def get_resource(manager, name_type_or_id):
|
|
114
|
+
def get_resource(manager: Any, name_type_or_id: str) -> Any:
|
|
111
115
|
# NOTE (vishakha): Due to bug #1799153 and for any another related case
|
|
112
116
|
# where GET resource API does not support the filter by name,
|
|
113
117
|
# osc_lib.utils.find_resource() method cannot be used because that method
|
|
@@ -126,7 +130,7 @@ def get_resource(manager, name_type_or_id):
|
|
|
126
130
|
raise exceptions.CommandError(msg % name_type_or_id)
|
|
127
131
|
|
|
128
132
|
|
|
129
|
-
def get_resource_by_id(manager, resource_id):
|
|
133
|
+
def get_resource_by_id(manager: Any, resource_id: str) -> Any:
|
|
130
134
|
"""Get resource by ID
|
|
131
135
|
|
|
132
136
|
Raises CommandError if the resource is not found
|
|
@@ -138,7 +142,12 @@ def get_resource_by_id(manager, resource_id):
|
|
|
138
142
|
raise exceptions.CommandError(msg.format(resource_id))
|
|
139
143
|
|
|
140
144
|
|
|
141
|
-
def _get_token_resource(
|
|
145
|
+
def _get_token_resource(
|
|
146
|
+
client: Any,
|
|
147
|
+
resource: str,
|
|
148
|
+
parsed_name: str,
|
|
149
|
+
parsed_domain: str | None = None,
|
|
150
|
+
) -> str:
|
|
142
151
|
"""Peek into the user's auth token to get resource IDs
|
|
143
152
|
|
|
144
153
|
Look into a user's token to try and find the ID of a domain, project or
|
|
@@ -174,25 +183,28 @@ def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
|
|
|
174
183
|
if isinstance(obj, list):
|
|
175
184
|
for item in obj:
|
|
176
185
|
if item['name'] == parsed_name:
|
|
177
|
-
return item['id']
|
|
186
|
+
return cast(str, item['id'])
|
|
178
187
|
if item['id'] == parsed_name:
|
|
179
188
|
return parsed_name
|
|
180
189
|
return parsed_name
|
|
181
190
|
return obj['id'] if obj['name'] == parsed_name else parsed_name
|
|
182
191
|
# diaper defense in case parsing the token fails
|
|
183
|
-
except Exception:
|
|
192
|
+
except Exception:
|
|
184
193
|
return parsed_name
|
|
185
194
|
|
|
186
195
|
|
|
187
|
-
def find_domain(identity_client, name_or_id):
|
|
196
|
+
def find_domain(identity_client: Any, name_or_id: str) -> domains.Domain:
|
|
188
197
|
return _find_identity_resource(
|
|
189
198
|
identity_client.domains, name_or_id, domains.Domain
|
|
190
199
|
)
|
|
191
200
|
|
|
192
201
|
|
|
193
202
|
def find_domain_id_sdk(
|
|
194
|
-
identity_client
|
|
195
|
-
|
|
203
|
+
identity_client: Any,
|
|
204
|
+
name_or_id: str,
|
|
205
|
+
*,
|
|
206
|
+
validate_actor_existence: bool = True,
|
|
207
|
+
) -> str:
|
|
196
208
|
return _find_sdk_id(
|
|
197
209
|
identity_client.find_domain,
|
|
198
210
|
name_or_id=name_or_id,
|
|
@@ -200,7 +212,11 @@ def find_domain_id_sdk(
|
|
|
200
212
|
)
|
|
201
213
|
|
|
202
214
|
|
|
203
|
-
def find_group(
|
|
215
|
+
def find_group(
|
|
216
|
+
identity_client: Any,
|
|
217
|
+
name_or_id: str,
|
|
218
|
+
domain_name_or_id: str | None = None,
|
|
219
|
+
) -> groups.Group:
|
|
204
220
|
if domain_name_or_id is None:
|
|
205
221
|
return _find_identity_resource(
|
|
206
222
|
identity_client.groups, name_or_id, groups.Group
|
|
@@ -216,12 +232,12 @@ def find_group(identity_client, name_or_id, domain_name_or_id=None):
|
|
|
216
232
|
|
|
217
233
|
|
|
218
234
|
def find_group_id_sdk(
|
|
219
|
-
identity_client,
|
|
220
|
-
name_or_id,
|
|
221
|
-
domain_name_or_id=None,
|
|
235
|
+
identity_client: Any,
|
|
236
|
+
name_or_id: str,
|
|
237
|
+
domain_name_or_id: str | None = None,
|
|
222
238
|
*,
|
|
223
|
-
validate_actor_existence=True,
|
|
224
|
-
):
|
|
239
|
+
validate_actor_existence: bool = True,
|
|
240
|
+
) -> str:
|
|
225
241
|
if domain_name_or_id is None:
|
|
226
242
|
return _find_sdk_id(
|
|
227
243
|
identity_client.find_group,
|
|
@@ -242,7 +258,11 @@ def find_group_id_sdk(
|
|
|
242
258
|
)
|
|
243
259
|
|
|
244
260
|
|
|
245
|
-
def find_project(
|
|
261
|
+
def find_project(
|
|
262
|
+
identity_client: Any,
|
|
263
|
+
name_or_id: str,
|
|
264
|
+
domain_name_or_id: str | None = None,
|
|
265
|
+
) -> projects.Project:
|
|
246
266
|
if domain_name_or_id is None:
|
|
247
267
|
return _find_identity_resource(
|
|
248
268
|
identity_client.projects, name_or_id, projects.Project
|
|
@@ -257,13 +277,13 @@ def find_project(identity_client, name_or_id, domain_name_or_id=None):
|
|
|
257
277
|
|
|
258
278
|
|
|
259
279
|
def find_project_id_sdk(
|
|
260
|
-
identity_client,
|
|
261
|
-
name_or_id,
|
|
262
|
-
domain_name_or_id=None,
|
|
280
|
+
identity_client: Any,
|
|
281
|
+
name_or_id: str,
|
|
282
|
+
domain_name_or_id: str | None = None,
|
|
263
283
|
*,
|
|
264
|
-
validate_actor_existence=True,
|
|
265
|
-
validate_domain_actor_existence=None,
|
|
266
|
-
):
|
|
284
|
+
validate_actor_existence: bool = True,
|
|
285
|
+
validate_domain_actor_existence: bool | None = None,
|
|
286
|
+
) -> str:
|
|
267
287
|
if domain_name_or_id is None:
|
|
268
288
|
return _find_sdk_id(
|
|
269
289
|
identity_client.find_project,
|
|
@@ -287,7 +307,11 @@ def find_project_id_sdk(
|
|
|
287
307
|
)
|
|
288
308
|
|
|
289
309
|
|
|
290
|
-
def find_user(
|
|
310
|
+
def find_user(
|
|
311
|
+
identity_client: Any,
|
|
312
|
+
name_or_id: str,
|
|
313
|
+
domain_name_or_id: str | None = None,
|
|
314
|
+
) -> users.User:
|
|
291
315
|
if domain_name_or_id is None:
|
|
292
316
|
return _find_identity_resource(
|
|
293
317
|
identity_client.users, name_or_id, users.User
|
|
@@ -299,12 +323,12 @@ def find_user(identity_client, name_or_id, domain_name_or_id=None):
|
|
|
299
323
|
|
|
300
324
|
|
|
301
325
|
def find_user_id_sdk(
|
|
302
|
-
identity_client,
|
|
303
|
-
name_or_id,
|
|
304
|
-
domain_name_or_id=None,
|
|
326
|
+
identity_client: Any,
|
|
327
|
+
name_or_id: str,
|
|
328
|
+
domain_name_or_id: str | None = None,
|
|
305
329
|
*,
|
|
306
|
-
validate_actor_existence=True,
|
|
307
|
-
):
|
|
330
|
+
validate_actor_existence: bool = True,
|
|
331
|
+
) -> str:
|
|
308
332
|
if domain_name_or_id is None:
|
|
309
333
|
return _find_sdk_id(
|
|
310
334
|
identity_client.find_user,
|
|
@@ -325,8 +349,11 @@ def find_user_id_sdk(
|
|
|
325
349
|
|
|
326
350
|
|
|
327
351
|
def _find_identity_resource(
|
|
328
|
-
identity_client_manager
|
|
329
|
-
|
|
352
|
+
identity_client_manager: Any,
|
|
353
|
+
name_or_id: str,
|
|
354
|
+
resource_type: Any,
|
|
355
|
+
**kwargs: Any,
|
|
356
|
+
) -> Any:
|
|
330
357
|
"""Find a specific identity resource.
|
|
331
358
|
|
|
332
359
|
Using keystoneclient's manager, attempt to find a specific resource by its
|
|
@@ -365,8 +392,12 @@ def _find_identity_resource(
|
|
|
365
392
|
|
|
366
393
|
|
|
367
394
|
def _find_sdk_id(
|
|
368
|
-
find_command
|
|
369
|
-
|
|
395
|
+
find_command: Callable[..., Any],
|
|
396
|
+
name_or_id: str,
|
|
397
|
+
*,
|
|
398
|
+
validate_actor_existence: bool = True,
|
|
399
|
+
**kwargs: Any,
|
|
400
|
+
) -> str:
|
|
370
401
|
try:
|
|
371
402
|
resource = find_command(
|
|
372
403
|
name_or_id=name_or_id, ignore_missing=False, **kwargs
|
|
@@ -377,10 +408,10 @@ def _find_sdk_id(
|
|
|
377
408
|
if not validate_actor_existence:
|
|
378
409
|
return name_or_id
|
|
379
410
|
raise exceptions.CommandError from exc
|
|
380
|
-
return resource.id
|
|
411
|
+
return cast(str, resource.id)
|
|
381
412
|
|
|
382
413
|
|
|
383
|
-
def add_user_domain_option_to_parser(parser):
|
|
414
|
+
def add_user_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
|
|
384
415
|
parser.add_argument(
|
|
385
416
|
'--user-domain',
|
|
386
417
|
metavar='<user-domain>',
|
|
@@ -392,7 +423,7 @@ def add_user_domain_option_to_parser(parser):
|
|
|
392
423
|
)
|
|
393
424
|
|
|
394
425
|
|
|
395
|
-
def add_group_domain_option_to_parser(parser):
|
|
426
|
+
def add_group_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
|
|
396
427
|
parser.add_argument(
|
|
397
428
|
'--group-domain',
|
|
398
429
|
metavar='<group-domain>',
|
|
@@ -404,21 +435,21 @@ def add_group_domain_option_to_parser(parser):
|
|
|
404
435
|
)
|
|
405
436
|
|
|
406
437
|
|
|
407
|
-
def add_project_domain_option_to_parser(
|
|
438
|
+
def add_project_domain_option_to_parser(
|
|
439
|
+
parser: argparse.ArgumentParser,
|
|
440
|
+
) -> None:
|
|
408
441
|
parser.add_argument(
|
|
409
442
|
'--project-domain',
|
|
410
443
|
metavar='<project-domain>',
|
|
411
|
-
help=
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
'names exist.'
|
|
416
|
-
)
|
|
444
|
+
help=_(
|
|
445
|
+
'Domain the project belongs to (name or ID). This '
|
|
446
|
+
'can be used in case collisions between project '
|
|
447
|
+
'names exist.'
|
|
417
448
|
),
|
|
418
449
|
)
|
|
419
450
|
|
|
420
451
|
|
|
421
|
-
def add_role_domain_option_to_parser(parser):
|
|
452
|
+
def add_role_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
|
|
422
453
|
parser.add_argument(
|
|
423
454
|
'--role-domain',
|
|
424
455
|
metavar='<role-domain>',
|
|
@@ -430,7 +461,7 @@ def add_role_domain_option_to_parser(parser):
|
|
|
430
461
|
)
|
|
431
462
|
|
|
432
463
|
|
|
433
|
-
def add_inherited_option_to_parser(parser):
|
|
464
|
+
def add_inherited_option_to_parser(parser: argparse.ArgumentParser) -> None:
|
|
434
465
|
parser.add_argument(
|
|
435
466
|
'--inherited',
|
|
436
467
|
action='store_true',
|
|
@@ -441,7 +472,7 @@ def add_inherited_option_to_parser(parser):
|
|
|
441
472
|
)
|
|
442
473
|
|
|
443
474
|
|
|
444
|
-
def add_resource_option_to_parser(parser):
|
|
475
|
+
def add_resource_option_to_parser(parser: argparse.ArgumentParser) -> None:
|
|
445
476
|
immutable_group = parser.add_mutually_exclusive_group()
|
|
446
477
|
immutable_group.add_argument(
|
|
447
478
|
'--immutable',
|
|
@@ -13,8 +13,10 @@
|
|
|
13
13
|
|
|
14
14
|
"""Identity v2 Service Catalog action implementations"""
|
|
15
15
|
|
|
16
|
+
import argparse
|
|
17
|
+
from collections.abc import Iterable, Sequence
|
|
16
18
|
import logging
|
|
17
|
-
|
|
19
|
+
from typing import Any
|
|
18
20
|
|
|
19
21
|
from cliff import columns as cliff_columns
|
|
20
22
|
from osc_lib import exceptions
|
|
@@ -27,8 +29,8 @@ from openstackclient.i18n import _
|
|
|
27
29
|
LOG = logging.getLogger(__name__)
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
class EndpointsColumn(cliff_columns.FormattableColumn[
|
|
31
|
-
def human_readable(self):
|
|
32
|
+
class EndpointsColumn(cliff_columns.FormattableColumn[Any]):
|
|
33
|
+
def human_readable(self) -> str:
|
|
32
34
|
if not self._value:
|
|
33
35
|
return ""
|
|
34
36
|
ret = ''
|
|
@@ -47,7 +49,9 @@ class EndpointsColumn(cliff_columns.FormattableColumn[ty.Any]):
|
|
|
47
49
|
class ListCatalog(command.Lister):
|
|
48
50
|
_description = _("List services in the service catalog")
|
|
49
51
|
|
|
50
|
-
def take_action(
|
|
52
|
+
def take_action(
|
|
53
|
+
self, parsed_args: argparse.Namespace
|
|
54
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
51
55
|
# Trigger auth if it has not happened yet
|
|
52
56
|
auth_ref = self.app.client_manager.auth_ref
|
|
53
57
|
if not auth_ref:
|
|
@@ -75,7 +79,7 @@ class ListCatalog(command.Lister):
|
|
|
75
79
|
class ShowCatalog(command.ShowOne):
|
|
76
80
|
_description = _("Display service catalog details")
|
|
77
81
|
|
|
78
|
-
def get_parser(self, prog_name):
|
|
82
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
79
83
|
parser = super().get_parser(prog_name)
|
|
80
84
|
parser.add_argument(
|
|
81
85
|
'service',
|
|
@@ -84,7 +88,9 @@ class ShowCatalog(command.ShowOne):
|
|
|
84
88
|
)
|
|
85
89
|
return parser
|
|
86
90
|
|
|
87
|
-
def take_action(
|
|
91
|
+
def take_action(
|
|
92
|
+
self, parsed_args: argparse.Namespace
|
|
93
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
88
94
|
# Trigger auth if it has not happened yet
|
|
89
95
|
auth_ref = self.app.client_manager.auth_ref
|
|
90
96
|
if not auth_ref:
|
|
@@ -108,4 +114,5 @@ class ShowCatalog(command.ShowOne):
|
|
|
108
114
|
LOG.error(_('service %s not found\n'), parsed_args.service)
|
|
109
115
|
return ((), ())
|
|
110
116
|
|
|
111
|
-
|
|
117
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
118
|
+
return col_headers, col_data
|