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
|
@@ -15,11 +15,14 @@
|
|
|
15
15
|
|
|
16
16
|
"""Identity v3 User action implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Iterable, Sequence
|
|
18
20
|
import copy
|
|
19
21
|
import logging
|
|
20
|
-
|
|
22
|
+
from typing import Any
|
|
21
23
|
|
|
22
24
|
from openstack import exceptions as sdk_exc
|
|
25
|
+
from openstack import utils as sdk_utils
|
|
23
26
|
from osc_lib import exceptions
|
|
24
27
|
from osc_lib import utils
|
|
25
28
|
|
|
@@ -31,7 +34,7 @@ from openstackclient.identity import common
|
|
|
31
34
|
LOG = logging.getLogger(__name__)
|
|
32
35
|
|
|
33
36
|
|
|
34
|
-
def _format_user(user):
|
|
37
|
+
def _format_user(user: Any) -> tuple[tuple[str, ...], Any]:
|
|
35
38
|
columns = (
|
|
36
39
|
'default_project_id',
|
|
37
40
|
'domain_id',
|
|
@@ -60,8 +63,10 @@ def _format_user(user):
|
|
|
60
63
|
)
|
|
61
64
|
|
|
62
65
|
|
|
63
|
-
def _get_options_for_user(
|
|
64
|
-
|
|
66
|
+
def _get_options_for_user(
|
|
67
|
+
identity_client: Any, parsed_args: argparse.Namespace
|
|
68
|
+
) -> dict[str, Any]:
|
|
69
|
+
options: dict[str, Any] = {}
|
|
65
70
|
if parsed_args.ignore_lockout_failure_attempts:
|
|
66
71
|
options['ignore_lockout_failure_attempts'] = True
|
|
67
72
|
if parsed_args.no_ignore_lockout_failure_attempts:
|
|
@@ -91,7 +96,7 @@ def _get_options_for_user(identity_client, parsed_args):
|
|
|
91
96
|
return options
|
|
92
97
|
|
|
93
98
|
|
|
94
|
-
def _add_user_options(parser):
|
|
99
|
+
def _add_user_options(parser: argparse.ArgumentParser) -> None:
|
|
95
100
|
# Add additional user options
|
|
96
101
|
|
|
97
102
|
parser.add_argument(
|
|
@@ -191,7 +196,7 @@ def _add_user_options(parser):
|
|
|
191
196
|
class CreateUser(command.ShowOne):
|
|
192
197
|
_description = _("Create new user")
|
|
193
198
|
|
|
194
|
-
def get_parser(self, prog_name):
|
|
199
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
195
200
|
parser = super().get_parser(prog_name)
|
|
196
201
|
parser.add_argument(
|
|
197
202
|
'name',
|
|
@@ -250,10 +255,14 @@ class CreateUser(command.ShowOne):
|
|
|
250
255
|
)
|
|
251
256
|
return parser
|
|
252
257
|
|
|
253
|
-
def take_action(
|
|
254
|
-
|
|
258
|
+
def take_action(
|
|
259
|
+
self, parsed_args: argparse.Namespace
|
|
260
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
261
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
262
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
263
|
+
)
|
|
255
264
|
|
|
256
|
-
kwargs = {}
|
|
265
|
+
kwargs: dict[str, Any] = {}
|
|
257
266
|
|
|
258
267
|
domain_id = None
|
|
259
268
|
if parsed_args.domain:
|
|
@@ -333,7 +342,7 @@ class CreateUser(command.ShowOne):
|
|
|
333
342
|
class DeleteUser(command.Command):
|
|
334
343
|
_description = _("Delete user(s)")
|
|
335
344
|
|
|
336
|
-
def get_parser(self, prog_name):
|
|
345
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
337
346
|
parser = super().get_parser(prog_name)
|
|
338
347
|
parser.add_argument(
|
|
339
348
|
'users',
|
|
@@ -348,8 +357,10 @@ class DeleteUser(command.Command):
|
|
|
348
357
|
)
|
|
349
358
|
return parser
|
|
350
359
|
|
|
351
|
-
def take_action(self, parsed_args):
|
|
352
|
-
identity_client =
|
|
360
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
361
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
362
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
363
|
+
)
|
|
353
364
|
|
|
354
365
|
domain = None
|
|
355
366
|
if parsed_args.domain:
|
|
@@ -393,7 +404,7 @@ class DeleteUser(command.Command):
|
|
|
393
404
|
class ListUser(command.Lister):
|
|
394
405
|
_description = _("List users")
|
|
395
406
|
|
|
396
|
-
def get_parser(self, prog_name):
|
|
407
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
397
408
|
parser = super().get_parser(prog_name)
|
|
398
409
|
parser.add_argument(
|
|
399
410
|
'--domain',
|
|
@@ -439,8 +450,12 @@ class ListUser(command.Lister):
|
|
|
439
450
|
)
|
|
440
451
|
return parser
|
|
441
452
|
|
|
442
|
-
def take_action(
|
|
443
|
-
|
|
453
|
+
def take_action(
|
|
454
|
+
self, parsed_args: argparse.Namespace
|
|
455
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
456
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
457
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
458
|
+
)
|
|
444
459
|
|
|
445
460
|
domain = None
|
|
446
461
|
if parsed_args.domain:
|
|
@@ -541,7 +556,7 @@ class ListUser(command.Lister):
|
|
|
541
556
|
class SetUser(command.Command):
|
|
542
557
|
_description = _("Set user properties")
|
|
543
558
|
|
|
544
|
-
def get_parser(self, prog_name):
|
|
559
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
545
560
|
parser = super().get_parser(prog_name)
|
|
546
561
|
parser.add_argument(
|
|
547
562
|
'user',
|
|
@@ -603,8 +618,10 @@ class SetUser(command.Command):
|
|
|
603
618
|
)
|
|
604
619
|
return parser
|
|
605
620
|
|
|
606
|
-
def take_action(self, parsed_args):
|
|
607
|
-
identity_client =
|
|
621
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
622
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
623
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
624
|
+
)
|
|
608
625
|
|
|
609
626
|
if parsed_args.password_prompt:
|
|
610
627
|
parsed_args.password = utils.get_password(self.app.stdin)
|
|
@@ -676,7 +693,7 @@ class SetPasswordUser(command.Command):
|
|
|
676
693
|
|
|
677
694
|
required_scope = False
|
|
678
695
|
|
|
679
|
-
def get_parser(self, prog_name):
|
|
696
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
680
697
|
parser = super().get_parser(prog_name)
|
|
681
698
|
parser.add_argument(
|
|
682
699
|
'--password',
|
|
@@ -690,15 +707,17 @@ class SetPasswordUser(command.Command):
|
|
|
690
707
|
)
|
|
691
708
|
return parser
|
|
692
709
|
|
|
693
|
-
def take_action(self, parsed_args):
|
|
694
|
-
identity_client =
|
|
710
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
711
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
712
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
713
|
+
)
|
|
695
714
|
conn = self.app.client_manager.sdk_connection
|
|
696
715
|
auth = conn.config.get_auth()
|
|
697
716
|
if auth is None:
|
|
698
717
|
# this will never happen
|
|
699
718
|
raise exceptions.CommandError('invalid authentication info')
|
|
700
719
|
|
|
701
|
-
user_id = auth.get_user_id(conn.
|
|
720
|
+
user_id = auth.get_user_id(conn.session)
|
|
702
721
|
|
|
703
722
|
# FIXME(gyee): there are two scenarios:
|
|
704
723
|
#
|
|
@@ -740,7 +759,7 @@ class SetPasswordUser(command.Command):
|
|
|
740
759
|
)
|
|
741
760
|
)
|
|
742
761
|
|
|
743
|
-
identity_client.
|
|
762
|
+
identity_client.update_password(
|
|
744
763
|
user=user_id,
|
|
745
764
|
current_password=current_password,
|
|
746
765
|
password=password,
|
|
@@ -750,7 +769,7 @@ class SetPasswordUser(command.Command):
|
|
|
750
769
|
class ShowUser(command.ShowOne):
|
|
751
770
|
_description = _("Display user details")
|
|
752
771
|
|
|
753
|
-
def get_parser(self, prog_name):
|
|
772
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
754
773
|
parser = super().get_parser(prog_name)
|
|
755
774
|
parser.add_argument(
|
|
756
775
|
'user',
|
|
@@ -764,8 +783,12 @@ class ShowUser(command.ShowOne):
|
|
|
764
783
|
)
|
|
765
784
|
return parser
|
|
766
785
|
|
|
767
|
-
def take_action(
|
|
768
|
-
|
|
786
|
+
def take_action(
|
|
787
|
+
self, parsed_args: argparse.Namespace
|
|
788
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
789
|
+
identity_client = sdk_utils.ensure_service_version(
|
|
790
|
+
self.app.client_manager.sdk_connection.identity, '3'
|
|
791
|
+
)
|
|
769
792
|
|
|
770
793
|
user_str = common._get_token_resource(
|
|
771
794
|
identity_client, 'user', parsed_args.user, parsed_args.domain
|
openstackclient/image/client.py
CHANGED
|
@@ -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 osc_lib import utils
|
|
18
20
|
|
|
@@ -27,7 +29,7 @@ API_NAME = 'image'
|
|
|
27
29
|
API_VERSIONS = ('1', '2')
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
def make_client(instance):
|
|
32
|
+
def make_client(instance: Any) -> Any:
|
|
31
33
|
"""Returns an image service client."""
|
|
32
34
|
LOG.debug(
|
|
33
35
|
'Image client initialized using OpenStack SDK: %s',
|
|
@@ -36,7 +38,9 @@ def make_client(instance):
|
|
|
36
38
|
return instance.sdk_connection.image
|
|
37
39
|
|
|
38
40
|
|
|
39
|
-
def build_option_parser(
|
|
41
|
+
def build_option_parser(
|
|
42
|
+
parser: argparse.ArgumentParser,
|
|
43
|
+
) -> argparse.ArgumentParser:
|
|
40
44
|
"""Hook to add global options"""
|
|
41
45
|
parser.add_argument(
|
|
42
46
|
'--os-image-api-version',
|
|
@@ -48,6 +52,6 @@ def build_option_parser(parser):
|
|
|
48
52
|
return parser
|
|
49
53
|
|
|
50
54
|
|
|
51
|
-
def check_api_version(check_version):
|
|
55
|
+
def check_api_version(check_version: str) -> bool:
|
|
52
56
|
# SDK supports auto-negotiation for us: always return True
|
|
53
57
|
return True
|
|
@@ -19,7 +19,8 @@ import argparse
|
|
|
19
19
|
import logging
|
|
20
20
|
import os
|
|
21
21
|
import sys
|
|
22
|
-
import
|
|
22
|
+
from collections.abc import Iterable, Sequence
|
|
23
|
+
from typing import Any
|
|
23
24
|
|
|
24
25
|
from cliff import columns as cliff_columns
|
|
25
26
|
from osc_lib.api import utils as api_utils
|
|
@@ -51,7 +52,7 @@ DISK_CHOICES = [
|
|
|
51
52
|
LOG = logging.getLogger(__name__)
|
|
52
53
|
|
|
53
54
|
|
|
54
|
-
def _get_columns(item):
|
|
55
|
+
def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
55
56
|
column_map = {'is_protected': 'protected', 'owner_id': 'owner'}
|
|
56
57
|
hidden_columns = [
|
|
57
58
|
'location',
|
|
@@ -69,7 +70,7 @@ def _get_columns(item):
|
|
|
69
70
|
|
|
70
71
|
|
|
71
72
|
class HumanReadableSizeColumn(cliff_columns.FormattableColumn[int]):
|
|
72
|
-
def human_readable(self):
|
|
73
|
+
def human_readable(self) -> str:
|
|
73
74
|
"""Return a formatted visibility string
|
|
74
75
|
|
|
75
76
|
:rtype:
|
|
@@ -83,7 +84,7 @@ class HumanReadableSizeColumn(cliff_columns.FormattableColumn[int]):
|
|
|
83
84
|
|
|
84
85
|
|
|
85
86
|
class VisibilityColumn(cliff_columns.FormattableColumn[bool]):
|
|
86
|
-
def human_readable(self):
|
|
87
|
+
def human_readable(self) -> str:
|
|
87
88
|
"""Return a formatted visibility string
|
|
88
89
|
|
|
89
90
|
:rtype:
|
|
@@ -99,7 +100,7 @@ class VisibilityColumn(cliff_columns.FormattableColumn[bool]):
|
|
|
99
100
|
class CreateImage(command.ShowOne):
|
|
100
101
|
_description = _("Create/upload an image")
|
|
101
102
|
|
|
102
|
-
def get_parser(self, prog_name):
|
|
103
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
103
104
|
parser = super().get_parser(prog_name)
|
|
104
105
|
parser.add_argument(
|
|
105
106
|
"name",
|
|
@@ -239,7 +240,9 @@ class CreateImage(command.ShowOne):
|
|
|
239
240
|
)
|
|
240
241
|
return parser
|
|
241
242
|
|
|
242
|
-
def take_action(
|
|
243
|
+
def take_action(
|
|
244
|
+
self, parsed_args: argparse.Namespace
|
|
245
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
243
246
|
image_client = self.app.client_manager.image
|
|
244
247
|
|
|
245
248
|
# Build an attribute dict from the parsed args, only include
|
|
@@ -299,7 +302,7 @@ class CreateImage(command.ShowOne):
|
|
|
299
302
|
volume_client.volumes,
|
|
300
303
|
parsed_args.volume,
|
|
301
304
|
)
|
|
302
|
-
|
|
305
|
+
_response, body = volume_client.volumes.upload_to_image(
|
|
303
306
|
source_volume.id,
|
|
304
307
|
parsed_args.force,
|
|
305
308
|
parsed_args.name,
|
|
@@ -314,10 +317,10 @@ class CreateImage(command.ShowOne):
|
|
|
314
317
|
else:
|
|
315
318
|
# Read file from stdin
|
|
316
319
|
if not sys.stdin.isatty():
|
|
317
|
-
if
|
|
320
|
+
if sys.platform == "win32":
|
|
318
321
|
import msvcrt
|
|
319
322
|
|
|
320
|
-
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
|
|
323
|
+
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
|
|
321
324
|
if hasattr(sys.stdin, 'buffer'):
|
|
322
325
|
kwargs['data'] = sys.stdin.buffer
|
|
323
326
|
else:
|
|
@@ -351,13 +354,15 @@ class CreateImage(command.ShowOne):
|
|
|
351
354
|
info['properties'] = format_columns.DictColumn(
|
|
352
355
|
info.get('properties', {})
|
|
353
356
|
)
|
|
354
|
-
|
|
357
|
+
col_headers, col_data = zip(*sorted(info.items()))
|
|
358
|
+
return col_headers, col_data
|
|
359
|
+
return ((), ())
|
|
355
360
|
|
|
356
361
|
|
|
357
362
|
class DeleteImage(command.Command):
|
|
358
363
|
_description = _("Delete image(s)")
|
|
359
364
|
|
|
360
|
-
def get_parser(self, prog_name):
|
|
365
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
361
366
|
parser = super().get_parser(prog_name)
|
|
362
367
|
parser.add_argument(
|
|
363
368
|
"images",
|
|
@@ -367,7 +372,7 @@ class DeleteImage(command.Command):
|
|
|
367
372
|
)
|
|
368
373
|
return parser
|
|
369
374
|
|
|
370
|
-
def take_action(self, parsed_args):
|
|
375
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
371
376
|
result = 0
|
|
372
377
|
image_client = self.app.client_manager.image
|
|
373
378
|
for image in parsed_args.images:
|
|
@@ -396,7 +401,7 @@ class DeleteImage(command.Command):
|
|
|
396
401
|
class ListImage(command.Lister):
|
|
397
402
|
_description = _("List available images")
|
|
398
403
|
|
|
399
|
-
def get_parser(self, prog_name):
|
|
404
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
400
405
|
parser = super().get_parser(prog_name)
|
|
401
406
|
public_group = parser.add_mutually_exclusive_group()
|
|
402
407
|
public_group.add_argument(
|
|
@@ -453,7 +458,9 @@ class ListImage(command.Lister):
|
|
|
453
458
|
)
|
|
454
459
|
return parser
|
|
455
460
|
|
|
456
|
-
def take_action(
|
|
461
|
+
def take_action(
|
|
462
|
+
self, parsed_args: argparse.Namespace
|
|
463
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
457
464
|
image_client = self.app.client_manager.image
|
|
458
465
|
|
|
459
466
|
kwargs = {}
|
|
@@ -498,7 +505,7 @@ class ListImage(command.Lister):
|
|
|
498
505
|
|
|
499
506
|
if parsed_args.property:
|
|
500
507
|
# NOTE(dtroyer): coerce to a list to subscript it in py3
|
|
501
|
-
attr, value =
|
|
508
|
+
attr, value = next(iter(parsed_args.property.items()))
|
|
502
509
|
api_utils.simple_filter(
|
|
503
510
|
images,
|
|
504
511
|
attr=attr,
|
|
@@ -527,7 +534,7 @@ class ListImage(command.Lister):
|
|
|
527
534
|
class SaveImage(command.Command):
|
|
528
535
|
_description = _("Save an image locally")
|
|
529
536
|
|
|
530
|
-
def get_parser(self, prog_name):
|
|
537
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
531
538
|
parser = super().get_parser(prog_name)
|
|
532
539
|
parser.add_argument(
|
|
533
540
|
"--chunk-size",
|
|
@@ -551,7 +558,7 @@ class SaveImage(command.Command):
|
|
|
551
558
|
)
|
|
552
559
|
return parser
|
|
553
560
|
|
|
554
|
-
def take_action(self, parsed_args):
|
|
561
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
555
562
|
image_client = self.app.client_manager.image
|
|
556
563
|
image = image_client.find_image(
|
|
557
564
|
parsed_args.image, ignore_missing=False
|
|
@@ -572,7 +579,7 @@ class SaveImage(command.Command):
|
|
|
572
579
|
class SetImage(command.Command):
|
|
573
580
|
_description = _("Set image properties")
|
|
574
581
|
|
|
575
|
-
def get_parser(self, prog_name):
|
|
582
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
576
583
|
parser = super().get_parser(prog_name)
|
|
577
584
|
parser.add_argument(
|
|
578
585
|
"image",
|
|
@@ -702,7 +709,7 @@ class SetImage(command.Command):
|
|
|
702
709
|
)
|
|
703
710
|
return parser
|
|
704
711
|
|
|
705
|
-
def take_action(self, parsed_args):
|
|
712
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
706
713
|
image_client = self.app.client_manager.image
|
|
707
714
|
|
|
708
715
|
kwargs = {}
|
|
@@ -785,10 +792,10 @@ class SetImage(command.Command):
|
|
|
785
792
|
# Read file from stdin
|
|
786
793
|
if sys.stdin.isatty() is not True:
|
|
787
794
|
if parsed_args.stdin:
|
|
788
|
-
if
|
|
795
|
+
if sys.platform == "win32":
|
|
789
796
|
import msvcrt
|
|
790
797
|
|
|
791
|
-
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
|
|
798
|
+
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
|
|
792
799
|
if hasattr(sys.stdin, 'buffer'):
|
|
793
800
|
kwargs['data'] = sys.stdin.buffer
|
|
794
801
|
else:
|
|
@@ -819,7 +826,7 @@ class SetImage(command.Command):
|
|
|
819
826
|
class ShowImage(command.ShowOne):
|
|
820
827
|
_description = _("Display image details")
|
|
821
828
|
|
|
822
|
-
def get_parser(self, prog_name):
|
|
829
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
823
830
|
parser = super().get_parser(prog_name)
|
|
824
831
|
parser.add_argument(
|
|
825
832
|
"--human-readable",
|
|
@@ -834,15 +841,15 @@ class ShowImage(command.ShowOne):
|
|
|
834
841
|
)
|
|
835
842
|
return parser
|
|
836
843
|
|
|
837
|
-
def take_action(
|
|
844
|
+
def take_action(
|
|
845
|
+
self, parsed_args: argparse.Namespace
|
|
846
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
838
847
|
image_client = self.app.client_manager.image
|
|
839
848
|
image = image_client.find_image(
|
|
840
849
|
parsed_args.image, ignore_missing=False
|
|
841
850
|
)
|
|
842
851
|
|
|
843
|
-
formatters: dict[
|
|
844
|
-
str, type[cliff_columns.FormattableColumn[ty.Any]]
|
|
845
|
-
] = {
|
|
852
|
+
formatters: dict[str, type[cliff_columns.FormattableColumn[Any]]] = {
|
|
846
853
|
'properties': format_columns.DictColumn,
|
|
847
854
|
}
|
|
848
855
|
if parsed_args.human_readable:
|
|
@@ -13,9 +13,12 @@
|
|
|
13
13
|
# License for the specific language governing permissions and limitations
|
|
14
14
|
# under the License.
|
|
15
15
|
|
|
16
|
+
import argparse
|
|
17
|
+
from collections.abc import Iterable, Sequence
|
|
16
18
|
import copy
|
|
17
19
|
import datetime
|
|
18
20
|
import logging
|
|
21
|
+
from typing import Any
|
|
19
22
|
|
|
20
23
|
from osc_lib import exceptions
|
|
21
24
|
from osc_lib import utils
|
|
@@ -27,7 +30,7 @@ from openstackclient.i18n import _
|
|
|
27
30
|
LOG = logging.getLogger(__name__)
|
|
28
31
|
|
|
29
32
|
|
|
30
|
-
def _format_image_cache(cached_images):
|
|
33
|
+
def _format_image_cache(cached_images: dict[str, Any]) -> list[dict[str, Any]]:
|
|
31
34
|
"""Format image cache to make it more consistent with OSC operations."""
|
|
32
35
|
|
|
33
36
|
image_list = []
|
|
@@ -70,11 +73,13 @@ def _format_image_cache(cached_images):
|
|
|
70
73
|
class ListCachedImage(command.Lister):
|
|
71
74
|
_description = _("Get Cache State")
|
|
72
75
|
|
|
73
|
-
def get_parser(self, prog_name):
|
|
76
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
74
77
|
parser = super().get_parser(prog_name)
|
|
75
78
|
return parser
|
|
76
79
|
|
|
77
|
-
def take_action(
|
|
80
|
+
def take_action(
|
|
81
|
+
self, parsed_args: argparse.Namespace
|
|
82
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
78
83
|
image_client = self.app.client_manager.image
|
|
79
84
|
|
|
80
85
|
# List of Cache data received
|
|
@@ -111,7 +116,7 @@ class ListCachedImage(command.Lister):
|
|
|
111
116
|
class QueueCachedImage(command.Command):
|
|
112
117
|
_description = _("Queue image(s) for caching.")
|
|
113
118
|
|
|
114
|
-
def get_parser(self, prog_name):
|
|
119
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
115
120
|
parser = super().get_parser(prog_name)
|
|
116
121
|
parser.add_argument(
|
|
117
122
|
"images",
|
|
@@ -121,7 +126,7 @@ class QueueCachedImage(command.Command):
|
|
|
121
126
|
)
|
|
122
127
|
return parser
|
|
123
128
|
|
|
124
|
-
def take_action(self, parsed_args):
|
|
129
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
125
130
|
image_client = self.app.client_manager.image
|
|
126
131
|
|
|
127
132
|
failures = 0
|
|
@@ -151,7 +156,7 @@ class QueueCachedImage(command.Command):
|
|
|
151
156
|
class DeleteCachedImage(command.Command):
|
|
152
157
|
_description = _("Delete image(s) from cache")
|
|
153
158
|
|
|
154
|
-
def get_parser(self, prog_name):
|
|
159
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
155
160
|
parser = super().get_parser(prog_name)
|
|
156
161
|
parser.add_argument(
|
|
157
162
|
"images",
|
|
@@ -161,7 +166,7 @@ class DeleteCachedImage(command.Command):
|
|
|
161
166
|
)
|
|
162
167
|
return parser
|
|
163
168
|
|
|
164
|
-
def take_action(self, parsed_args):
|
|
169
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
165
170
|
failures = 0
|
|
166
171
|
image_client = self.app.client_manager.image
|
|
167
172
|
for image in parsed_args.images:
|
|
@@ -190,7 +195,7 @@ class DeleteCachedImage(command.Command):
|
|
|
190
195
|
class ClearCachedImage(command.Command):
|
|
191
196
|
_description = _("Clear all images from cache, queue or both")
|
|
192
197
|
|
|
193
|
-
def get_parser(self, prog_name):
|
|
198
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
194
199
|
parser = super().get_parser(prog_name)
|
|
195
200
|
parser.add_argument(
|
|
196
201
|
"--cache",
|
|
@@ -210,7 +215,7 @@ class ClearCachedImage(command.Command):
|
|
|
210
215
|
)
|
|
211
216
|
return parser
|
|
212
217
|
|
|
213
|
-
def take_action(self, parsed_args):
|
|
218
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
214
219
|
image_client = self.app.client_manager.image
|
|
215
220
|
|
|
216
221
|
target = parsed_args.target
|