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,12 +14,15 @@
|
|
|
14
14
|
|
|
15
15
|
"""Volume v2 snapshot action implementations"""
|
|
16
16
|
|
|
17
|
+
import argparse
|
|
17
18
|
import functools
|
|
18
19
|
import logging
|
|
19
|
-
import
|
|
20
|
+
from collections.abc import Iterable, Sequence
|
|
21
|
+
from typing import Any
|
|
20
22
|
|
|
21
23
|
from cliff import columns as cliff_columns
|
|
22
24
|
from openstack.block_storage.v2 import snapshot as _snapshot
|
|
25
|
+
from openstack import utils as sdk_utils
|
|
23
26
|
from osc_lib.cli import format_columns
|
|
24
27
|
from osc_lib.cli import parseractions
|
|
25
28
|
from osc_lib import exceptions
|
|
@@ -45,11 +48,13 @@ class VolumeIdColumn(cliff_columns.FormattableColumn[str]):
|
|
|
45
48
|
``functools.partial(VolumeIdColumn, volume_cache)``.
|
|
46
49
|
"""
|
|
47
50
|
|
|
48
|
-
def __init__(
|
|
51
|
+
def __init__(
|
|
52
|
+
self, value: str, volume_cache: dict[str, Any] | None = None
|
|
53
|
+
) -> None:
|
|
49
54
|
super().__init__(value)
|
|
50
55
|
self._volume_cache = volume_cache or {}
|
|
51
56
|
|
|
52
|
-
def human_readable(self):
|
|
57
|
+
def human_readable(self) -> str:
|
|
53
58
|
"""Return a volume name if available
|
|
54
59
|
|
|
55
60
|
:rtype: either the volume ID or name
|
|
@@ -61,7 +66,7 @@ class VolumeIdColumn(cliff_columns.FormattableColumn[str]):
|
|
|
61
66
|
return volume
|
|
62
67
|
|
|
63
68
|
|
|
64
|
-
def _format_snapshot(snapshot: _snapshot.Snapshot) -> dict[str,
|
|
69
|
+
def _format_snapshot(snapshot: _snapshot.Snapshot) -> dict[str, Any]:
|
|
65
70
|
# Some columns returned by openstacksdk should not be shown because they're
|
|
66
71
|
# either irrelevant or duplicates
|
|
67
72
|
ignored_columns = {
|
|
@@ -100,7 +105,7 @@ def _format_snapshot(snapshot: _snapshot.Snapshot) -> dict[str, ty.Any]:
|
|
|
100
105
|
class CreateVolumeSnapshot(command.ShowOne):
|
|
101
106
|
_description = _("Create new volume snapshot")
|
|
102
107
|
|
|
103
|
-
def get_parser(self, prog_name):
|
|
108
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
104
109
|
parser = super().get_parser(prog_name)
|
|
105
110
|
parser.add_argument(
|
|
106
111
|
"snapshot_name",
|
|
@@ -150,8 +155,12 @@ class CreateVolumeSnapshot(command.ShowOne):
|
|
|
150
155
|
)
|
|
151
156
|
return parser
|
|
152
157
|
|
|
153
|
-
def take_action(
|
|
154
|
-
|
|
158
|
+
def take_action(
|
|
159
|
+
self, parsed_args: argparse.Namespace
|
|
160
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
161
|
+
volume_client = sdk_utils.ensure_service_version(
|
|
162
|
+
self.app.client_manager.sdk_connection.volume, '2'
|
|
163
|
+
)
|
|
155
164
|
|
|
156
165
|
volume = parsed_args.volume
|
|
157
166
|
if not parsed_args.volume:
|
|
@@ -186,13 +195,14 @@ class CreateVolumeSnapshot(command.ShowOne):
|
|
|
186
195
|
)
|
|
187
196
|
|
|
188
197
|
data = _format_snapshot(snapshot)
|
|
189
|
-
|
|
198
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
199
|
+
return col_headers, col_data
|
|
190
200
|
|
|
191
201
|
|
|
192
202
|
class DeleteVolumeSnapshot(command.Command):
|
|
193
203
|
_description = _("Delete volume snapshot(s)")
|
|
194
204
|
|
|
195
|
-
def get_parser(self, prog_name):
|
|
205
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
196
206
|
parser = super().get_parser(prog_name)
|
|
197
207
|
parser.add_argument(
|
|
198
208
|
"snapshots",
|
|
@@ -210,8 +220,10 @@ class DeleteVolumeSnapshot(command.Command):
|
|
|
210
220
|
)
|
|
211
221
|
return parser
|
|
212
222
|
|
|
213
|
-
def take_action(self, parsed_args):
|
|
214
|
-
volume_client =
|
|
223
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
224
|
+
volume_client = sdk_utils.ensure_service_version(
|
|
225
|
+
self.app.client_manager.sdk_connection.volume, '2'
|
|
226
|
+
)
|
|
215
227
|
result = 0
|
|
216
228
|
|
|
217
229
|
for snapshot in parsed_args.snapshots:
|
|
@@ -219,8 +231,11 @@ class DeleteVolumeSnapshot(command.Command):
|
|
|
219
231
|
snapshot_id = volume_client.find_snapshot(
|
|
220
232
|
snapshot, ignore_missing=False
|
|
221
233
|
).id
|
|
234
|
+
# FIXME(stephenfin): This parameter is missing from sdk
|
|
235
|
+
# https://review.opendev.org/c/openstack/openstacksdk/+/984529
|
|
222
236
|
volume_client.delete_snapshot(
|
|
223
|
-
snapshot_id,
|
|
237
|
+
snapshot_id,
|
|
238
|
+
force=parsed_args.force, # type: ignore
|
|
224
239
|
)
|
|
225
240
|
except Exception as e:
|
|
226
241
|
result += 1
|
|
@@ -244,7 +259,7 @@ class DeleteVolumeSnapshot(command.Command):
|
|
|
244
259
|
class ListVolumeSnapshot(command.Lister):
|
|
245
260
|
_description = _("List volume snapshots")
|
|
246
261
|
|
|
247
|
-
def get_parser(self, prog_name):
|
|
262
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
248
263
|
parser = super().get_parser(prog_name)
|
|
249
264
|
parser.add_argument(
|
|
250
265
|
'--all-projects',
|
|
@@ -295,8 +310,12 @@ class ListVolumeSnapshot(command.Lister):
|
|
|
295
310
|
pagination.add_marker_pagination_option_to_parser(parser)
|
|
296
311
|
return parser
|
|
297
312
|
|
|
298
|
-
def take_action(
|
|
299
|
-
|
|
313
|
+
def take_action(
|
|
314
|
+
self, parsed_args: argparse.Namespace
|
|
315
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
316
|
+
volume_client = sdk_utils.ensure_service_version(
|
|
317
|
+
self.app.client_manager.sdk_connection.volume, '2'
|
|
318
|
+
)
|
|
300
319
|
identity_client = self.app.client_manager.identity
|
|
301
320
|
|
|
302
321
|
columns: tuple[str, ...] = (
|
|
@@ -384,7 +403,7 @@ class ListVolumeSnapshot(command.Lister):
|
|
|
384
403
|
class SetVolumeSnapshot(command.Command):
|
|
385
404
|
_description = _("Set volume snapshot properties")
|
|
386
405
|
|
|
387
|
-
def get_parser(self, prog_name):
|
|
406
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
388
407
|
parser = super().get_parser(prog_name)
|
|
389
408
|
parser.add_argument(
|
|
390
409
|
'snapshot',
|
|
@@ -440,8 +459,10 @@ class SetVolumeSnapshot(command.Command):
|
|
|
440
459
|
)
|
|
441
460
|
return parser
|
|
442
461
|
|
|
443
|
-
def take_action(self, parsed_args):
|
|
444
|
-
volume_client =
|
|
462
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
463
|
+
volume_client = sdk_utils.ensure_service_version(
|
|
464
|
+
self.app.client_manager.sdk_connection.volume, '2'
|
|
465
|
+
)
|
|
445
466
|
|
|
446
467
|
snapshot = volume_client.find_snapshot(
|
|
447
468
|
parsed_args.snapshot, ignore_missing=False
|
|
@@ -499,7 +520,7 @@ class SetVolumeSnapshot(command.Command):
|
|
|
499
520
|
class ShowVolumeSnapshot(command.ShowOne):
|
|
500
521
|
_description = _("Display volume snapshot details")
|
|
501
522
|
|
|
502
|
-
def get_parser(self, prog_name):
|
|
523
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
503
524
|
parser = super().get_parser(prog_name)
|
|
504
525
|
parser.add_argument(
|
|
505
526
|
"snapshot",
|
|
@@ -508,21 +529,26 @@ class ShowVolumeSnapshot(command.ShowOne):
|
|
|
508
529
|
)
|
|
509
530
|
return parser
|
|
510
531
|
|
|
511
|
-
def take_action(
|
|
512
|
-
|
|
532
|
+
def take_action(
|
|
533
|
+
self, parsed_args: argparse.Namespace
|
|
534
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
535
|
+
volume_client = sdk_utils.ensure_service_version(
|
|
536
|
+
self.app.client_manager.sdk_connection.volume, '2'
|
|
537
|
+
)
|
|
513
538
|
|
|
514
539
|
snapshot = volume_client.find_snapshot(
|
|
515
540
|
parsed_args.snapshot, ignore_missing=False
|
|
516
541
|
)
|
|
517
542
|
|
|
518
543
|
data = _format_snapshot(snapshot)
|
|
519
|
-
|
|
544
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
545
|
+
return col_headers, col_data
|
|
520
546
|
|
|
521
547
|
|
|
522
548
|
class UnsetVolumeSnapshot(command.Command):
|
|
523
549
|
_description = _("Unset volume snapshot properties")
|
|
524
550
|
|
|
525
|
-
def get_parser(self, prog_name):
|
|
551
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
526
552
|
parser = super().get_parser(prog_name)
|
|
527
553
|
parser.add_argument(
|
|
528
554
|
'snapshot',
|
|
@@ -542,7 +568,7 @@ class UnsetVolumeSnapshot(command.Command):
|
|
|
542
568
|
)
|
|
543
569
|
return parser
|
|
544
570
|
|
|
545
|
-
def take_action(self, parsed_args):
|
|
571
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
546
572
|
volume_client = self.app.client_manager.sdk_connection.volume
|
|
547
573
|
|
|
548
574
|
snapshot = volume_client.find_snapshot(
|
|
@@ -14,7 +14,10 @@
|
|
|
14
14
|
|
|
15
15
|
"""Volume v2 transfer action implementations"""
|
|
16
16
|
|
|
17
|
+
import argparse
|
|
17
18
|
import logging
|
|
19
|
+
from collections.abc import Iterable, Sequence
|
|
20
|
+
from typing import Any
|
|
18
21
|
|
|
19
22
|
from osc_lib import exceptions
|
|
20
23
|
from osc_lib import utils
|
|
@@ -29,7 +32,7 @@ LOG = logging.getLogger(__name__)
|
|
|
29
32
|
class AcceptTransferRequest(command.ShowOne):
|
|
30
33
|
_description = _("Accept volume transfer request.")
|
|
31
34
|
|
|
32
|
-
def get_parser(self, prog_name):
|
|
35
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
33
36
|
parser = super().get_parser(prog_name)
|
|
34
37
|
parser.add_argument(
|
|
35
38
|
'transfer_request',
|
|
@@ -44,7 +47,9 @@ class AcceptTransferRequest(command.ShowOne):
|
|
|
44
47
|
)
|
|
45
48
|
return parser
|
|
46
49
|
|
|
47
|
-
def take_action(
|
|
50
|
+
def take_action(
|
|
51
|
+
self, parsed_args: argparse.Namespace
|
|
52
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
48
53
|
volume_client = self.app.client_manager.volume
|
|
49
54
|
|
|
50
55
|
try:
|
|
@@ -62,13 +67,14 @@ class AcceptTransferRequest(command.ShowOne):
|
|
|
62
67
|
)
|
|
63
68
|
transfer_accept._info.pop("links", None)
|
|
64
69
|
|
|
65
|
-
|
|
70
|
+
col_headers, col_data = zip(*sorted(transfer_accept._info.items()))
|
|
71
|
+
return col_headers, col_data
|
|
66
72
|
|
|
67
73
|
|
|
68
74
|
class CreateTransferRequest(command.ShowOne):
|
|
69
75
|
_description = _("Create volume transfer request.")
|
|
70
76
|
|
|
71
|
-
def get_parser(self, prog_name):
|
|
77
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
72
78
|
parser = super().get_parser(prog_name)
|
|
73
79
|
parser.add_argument(
|
|
74
80
|
'--name',
|
|
@@ -82,7 +88,9 @@ class CreateTransferRequest(command.ShowOne):
|
|
|
82
88
|
)
|
|
83
89
|
return parser
|
|
84
90
|
|
|
85
|
-
def take_action(
|
|
91
|
+
def take_action(
|
|
92
|
+
self, parsed_args: argparse.Namespace
|
|
93
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
86
94
|
volume_client = self.app.client_manager.volume
|
|
87
95
|
|
|
88
96
|
volume_id = utils.find_resource(
|
|
@@ -95,13 +103,16 @@ class CreateTransferRequest(command.ShowOne):
|
|
|
95
103
|
)
|
|
96
104
|
volume_transfer_request._info.pop("links", None)
|
|
97
105
|
|
|
98
|
-
|
|
106
|
+
col_headers, col_data = zip(
|
|
107
|
+
*sorted(volume_transfer_request._info.items())
|
|
108
|
+
)
|
|
109
|
+
return col_headers, col_data
|
|
99
110
|
|
|
100
111
|
|
|
101
112
|
class DeleteTransferRequest(command.Command):
|
|
102
113
|
_description = _("Delete volume transfer request(s).")
|
|
103
114
|
|
|
104
|
-
def get_parser(self, prog_name):
|
|
115
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
105
116
|
parser = super().get_parser(prog_name)
|
|
106
117
|
parser.add_argument(
|
|
107
118
|
'transfer_request',
|
|
@@ -111,7 +122,7 @@ class DeleteTransferRequest(command.Command):
|
|
|
111
122
|
)
|
|
112
123
|
return parser
|
|
113
124
|
|
|
114
|
-
def take_action(self, parsed_args):
|
|
125
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
115
126
|
volume_client = self.app.client_manager.volume
|
|
116
127
|
result = 0
|
|
117
128
|
|
|
@@ -144,7 +155,7 @@ class DeleteTransferRequest(command.Command):
|
|
|
144
155
|
class ListTransferRequest(command.Lister):
|
|
145
156
|
_description = _("Lists all volume transfer requests.")
|
|
146
157
|
|
|
147
|
-
def get_parser(self, prog_name):
|
|
158
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
148
159
|
parser = super().get_parser(prog_name)
|
|
149
160
|
parser.add_argument(
|
|
150
161
|
'--all-projects',
|
|
@@ -155,7 +166,9 @@ class ListTransferRequest(command.Lister):
|
|
|
155
166
|
)
|
|
156
167
|
return parser
|
|
157
168
|
|
|
158
|
-
def take_action(
|
|
169
|
+
def take_action(
|
|
170
|
+
self, parsed_args: argparse.Namespace
|
|
171
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
159
172
|
columns = ['ID', 'Name', 'Volume ID']
|
|
160
173
|
column_headers = ['ID', 'Name', 'Volume']
|
|
161
174
|
|
|
@@ -178,7 +191,7 @@ class ListTransferRequest(command.Lister):
|
|
|
178
191
|
class ShowTransferRequest(command.ShowOne):
|
|
179
192
|
_description = _("Show volume transfer request details.")
|
|
180
193
|
|
|
181
|
-
def get_parser(self, prog_name):
|
|
194
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
182
195
|
parser = super().get_parser(prog_name)
|
|
183
196
|
parser.add_argument(
|
|
184
197
|
'transfer_request',
|
|
@@ -187,7 +200,9 @@ class ShowTransferRequest(command.ShowOne):
|
|
|
187
200
|
)
|
|
188
201
|
return parser
|
|
189
202
|
|
|
190
|
-
def take_action(
|
|
203
|
+
def take_action(
|
|
204
|
+
self, parsed_args: argparse.Namespace
|
|
205
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
191
206
|
volume_client = self.app.client_manager.volume
|
|
192
207
|
volume_transfer_request = utils.find_resource(
|
|
193
208
|
volume_client.transfers,
|
|
@@ -195,4 +210,7 @@ class ShowTransferRequest(command.ShowOne):
|
|
|
195
210
|
)
|
|
196
211
|
volume_transfer_request._info.pop("links", None)
|
|
197
212
|
|
|
198
|
-
|
|
213
|
+
col_headers, col_data = zip(
|
|
214
|
+
*sorted(volume_transfer_request._info.items())
|
|
215
|
+
)
|
|
216
|
+
return col_headers, col_data
|
|
@@ -14,9 +14,12 @@
|
|
|
14
14
|
|
|
15
15
|
"""Volume v2 Type action implementations"""
|
|
16
16
|
|
|
17
|
+
import argparse
|
|
18
|
+
from collections.abc import MutableMapping
|
|
17
19
|
import functools
|
|
18
20
|
import logging
|
|
19
|
-
import
|
|
21
|
+
from collections.abc import Iterable, Sequence
|
|
22
|
+
from typing import Any
|
|
20
23
|
|
|
21
24
|
from cliff import columns as cliff_columns
|
|
22
25
|
from osc_lib.cli import format_columns
|
|
@@ -32,7 +35,7 @@ from openstackclient.identity import common as identity_common
|
|
|
32
35
|
LOG = logging.getLogger(__name__)
|
|
33
36
|
|
|
34
37
|
|
|
35
|
-
class EncryptionInfoColumn(cliff_columns.FormattableColumn[
|
|
38
|
+
class EncryptionInfoColumn(cliff_columns.FormattableColumn[Any]):
|
|
36
39
|
"""Formattable column for encryption info column.
|
|
37
40
|
|
|
38
41
|
Unlike the parent FormattableColumn class, the initializer of the
|
|
@@ -43,26 +46,30 @@ class EncryptionInfoColumn(cliff_columns.FormattableColumn[ty.Any]):
|
|
|
43
46
|
``functools.partial(EncryptionInfoColumn encryption_data)``.
|
|
44
47
|
"""
|
|
45
48
|
|
|
46
|
-
def __init__(
|
|
49
|
+
def __init__(
|
|
50
|
+
self, value: Any, encryption_data: dict[str, Any] | None = None
|
|
51
|
+
) -> None:
|
|
47
52
|
super().__init__(value)
|
|
48
53
|
self._encryption_data = encryption_data or {}
|
|
49
54
|
|
|
50
|
-
def _get_encryption_info(self):
|
|
55
|
+
def _get_encryption_info(self) -> Any:
|
|
51
56
|
type_id = self._value
|
|
52
57
|
return self._encryption_data.get(type_id)
|
|
53
58
|
|
|
54
|
-
def human_readable(self):
|
|
59
|
+
def human_readable(self) -> str:
|
|
55
60
|
encryption_info = self._get_encryption_info()
|
|
56
61
|
if encryption_info:
|
|
57
62
|
return utils.format_dict(encryption_info)
|
|
58
63
|
else:
|
|
59
64
|
return '-'
|
|
60
65
|
|
|
61
|
-
def machine_readable(self):
|
|
66
|
+
def machine_readable(self) -> Any:
|
|
62
67
|
return self._get_encryption_info()
|
|
63
68
|
|
|
64
69
|
|
|
65
|
-
def _create_encryption_type(
|
|
70
|
+
def _create_encryption_type(
|
|
71
|
+
volume_client: Any, volume_type: Any, parsed_args: argparse.Namespace
|
|
72
|
+
) -> Any:
|
|
66
73
|
if not parsed_args.encryption_provider:
|
|
67
74
|
msg = _(
|
|
68
75
|
"'--encryption-provider' should be specified while "
|
|
@@ -85,7 +92,9 @@ def _create_encryption_type(volume_client, volume_type, parsed_args):
|
|
|
85
92
|
return encryption
|
|
86
93
|
|
|
87
94
|
|
|
88
|
-
def _set_encryption_type(
|
|
95
|
+
def _set_encryption_type(
|
|
96
|
+
volume_client: Any, volume_type: Any, parsed_args: argparse.Namespace
|
|
97
|
+
) -> None:
|
|
89
98
|
# update the existing encryption type
|
|
90
99
|
body = {}
|
|
91
100
|
for attr in ['provider', 'cipher', 'key_size', 'control_location']:
|
|
@@ -109,7 +118,7 @@ def _set_encryption_type(volume_client, volume_type, parsed_args):
|
|
|
109
118
|
class CreateVolumeType(command.ShowOne):
|
|
110
119
|
_description = _("Create new volume type")
|
|
111
120
|
|
|
112
|
-
def get_parser(self, prog_name):
|
|
121
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
113
122
|
parser = super().get_parser(prog_name)
|
|
114
123
|
parser.add_argument(
|
|
115
124
|
"name",
|
|
@@ -243,7 +252,9 @@ class CreateVolumeType(command.ShowOne):
|
|
|
243
252
|
)
|
|
244
253
|
return parser
|
|
245
254
|
|
|
246
|
-
def take_action(
|
|
255
|
+
def take_action(
|
|
256
|
+
self, parsed_args: argparse.Namespace
|
|
257
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
247
258
|
identity_client = self.app.client_manager.identity
|
|
248
259
|
volume_client = self.app.client_manager.volume
|
|
249
260
|
|
|
@@ -325,13 +336,14 @@ class CreateVolumeType(command.ShowOne):
|
|
|
325
336
|
|
|
326
337
|
volume_type._info.pop("os-volume-type-access:is_public", None)
|
|
327
338
|
|
|
328
|
-
|
|
339
|
+
col_headers, col_data = zip(*sorted(volume_type._info.items()))
|
|
340
|
+
return col_headers, col_data
|
|
329
341
|
|
|
330
342
|
|
|
331
343
|
class DeleteVolumeType(command.Command):
|
|
332
344
|
_description = _("Delete volume type(s)")
|
|
333
345
|
|
|
334
|
-
def get_parser(self, prog_name):
|
|
346
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
335
347
|
parser = super().get_parser(prog_name)
|
|
336
348
|
parser.add_argument(
|
|
337
349
|
"volume_types",
|
|
@@ -341,7 +353,7 @@ class DeleteVolumeType(command.Command):
|
|
|
341
353
|
)
|
|
342
354
|
return parser
|
|
343
355
|
|
|
344
|
-
def take_action(self, parsed_args):
|
|
356
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
345
357
|
volume_client = self.app.client_manager.volume
|
|
346
358
|
result = 0
|
|
347
359
|
|
|
@@ -373,7 +385,7 @@ class DeleteVolumeType(command.Command):
|
|
|
373
385
|
class ListVolumeType(command.Lister):
|
|
374
386
|
_description = _("List volume types")
|
|
375
387
|
|
|
376
|
-
def get_parser(self, prog_name):
|
|
388
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
377
389
|
parser = super().get_parser(prog_name)
|
|
378
390
|
parser.add_argument(
|
|
379
391
|
'--long',
|
|
@@ -412,7 +424,9 @@ class ListVolumeType(command.Lister):
|
|
|
412
424
|
)
|
|
413
425
|
return parser
|
|
414
426
|
|
|
415
|
-
def take_action(
|
|
427
|
+
def take_action(
|
|
428
|
+
self, parsed_args: argparse.Namespace
|
|
429
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
416
430
|
volume_client = self.app.client_manager.volume
|
|
417
431
|
|
|
418
432
|
if parsed_args.long:
|
|
@@ -439,7 +453,9 @@ class ListVolumeType(command.Lister):
|
|
|
439
453
|
is_public=parsed_args.is_public,
|
|
440
454
|
)
|
|
441
455
|
|
|
442
|
-
formatters = {
|
|
456
|
+
formatters: MutableMapping[str, Any] = {
|
|
457
|
+
'Extra Specs': format_columns.DictColumn
|
|
458
|
+
}
|
|
443
459
|
|
|
444
460
|
if parsed_args.encryption_type:
|
|
445
461
|
encryption = {}
|
|
@@ -466,7 +482,7 @@ class ListVolumeType(command.Lister):
|
|
|
466
482
|
_EncryptionInfoColumn = functools.partial(
|
|
467
483
|
EncryptionInfoColumn, encryption_data=encryption
|
|
468
484
|
)
|
|
469
|
-
formatters['id'] = _EncryptionInfoColumn
|
|
485
|
+
formatters['id'] = _EncryptionInfoColumn
|
|
470
486
|
|
|
471
487
|
return (
|
|
472
488
|
column_headers,
|
|
@@ -484,7 +500,7 @@ class ListVolumeType(command.Lister):
|
|
|
484
500
|
class SetVolumeType(command.Command):
|
|
485
501
|
_description = _("Set volume type properties")
|
|
486
502
|
|
|
487
|
-
def get_parser(self, prog_name):
|
|
503
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
488
504
|
parser = super().get_parser(prog_name)
|
|
489
505
|
parser.add_argument(
|
|
490
506
|
'volume_type',
|
|
@@ -623,7 +639,7 @@ class SetVolumeType(command.Command):
|
|
|
623
639
|
)
|
|
624
640
|
return parser
|
|
625
641
|
|
|
626
|
-
def take_action(self, parsed_args):
|
|
642
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
627
643
|
volume_client = self.app.client_manager.volume
|
|
628
644
|
identity_client = self.app.client_manager.identity
|
|
629
645
|
|
|
@@ -719,7 +735,7 @@ class SetVolumeType(command.Command):
|
|
|
719
735
|
class ShowVolumeType(command.ShowOne):
|
|
720
736
|
_description = _("Display volume type details")
|
|
721
737
|
|
|
722
|
-
def get_parser(self, prog_name):
|
|
738
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
723
739
|
parser = super().get_parser(prog_name)
|
|
724
740
|
parser.add_argument(
|
|
725
741
|
"volume_type",
|
|
@@ -736,7 +752,9 @@ class ShowVolumeType(command.ShowOne):
|
|
|
736
752
|
)
|
|
737
753
|
return parser
|
|
738
754
|
|
|
739
|
-
def take_action(
|
|
755
|
+
def take_action(
|
|
756
|
+
self, parsed_args: argparse.Namespace
|
|
757
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
740
758
|
volume_client = self.app.client_manager.volume
|
|
741
759
|
volume_type = utils.find_resource(
|
|
742
760
|
volume_client.volume_types, parsed_args.volume_type
|
|
@@ -784,13 +802,14 @@ class ShowVolumeType(command.ShowOne):
|
|
|
784
802
|
e,
|
|
785
803
|
)
|
|
786
804
|
volume_type._info.pop("os-volume-type-access:is_public", None)
|
|
787
|
-
|
|
805
|
+
col_headers, col_data = zip(*sorted(volume_type._info.items()))
|
|
806
|
+
return col_headers, col_data
|
|
788
807
|
|
|
789
808
|
|
|
790
809
|
class UnsetVolumeType(command.Command):
|
|
791
810
|
_description = _("Unset volume type properties")
|
|
792
811
|
|
|
793
|
-
def get_parser(self, prog_name):
|
|
812
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
794
813
|
parser = super().get_parser(prog_name)
|
|
795
814
|
parser.add_argument(
|
|
796
815
|
'volume_type',
|
|
@@ -825,7 +844,7 @@ class UnsetVolumeType(command.Command):
|
|
|
825
844
|
)
|
|
826
845
|
return parser
|
|
827
846
|
|
|
828
|
-
def take_action(self, parsed_args):
|
|
847
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
829
848
|
volume_client = self.app.client_manager.volume
|
|
830
849
|
identity_client = self.app.client_manager.identity
|
|
831
850
|
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
# License for the specific language governing permissions and limitations
|
|
11
11
|
# under the License.
|
|
12
12
|
|
|
13
|
+
import argparse
|
|
14
|
+
from collections.abc import Iterable
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
13
17
|
from cinderclient import api_versions
|
|
14
18
|
from osc_lib import exceptions
|
|
15
19
|
|
|
@@ -17,7 +21,9 @@ from openstackclient import command
|
|
|
17
21
|
from openstackclient.i18n import _
|
|
18
22
|
|
|
19
23
|
|
|
20
|
-
def _format_cleanup_response(
|
|
24
|
+
def _format_cleanup_response(
|
|
25
|
+
cleaning: Any, unavailable: Any
|
|
26
|
+
) -> tuple[tuple[str, ...], list[tuple[Any, ...]]]:
|
|
21
27
|
column_headers = (
|
|
22
28
|
'ID',
|
|
23
29
|
'Cluster Name',
|
|
@@ -49,7 +55,7 @@ class BlockStorageCleanup(command.Lister):
|
|
|
49
55
|
This command requires ``--os-volume-api-version`` 3.24 or greater.
|
|
50
56
|
"""
|
|
51
57
|
|
|
52
|
-
def get_parser(self, prog_name):
|
|
58
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
53
59
|
parser = super().get_parser(prog_name)
|
|
54
60
|
parser.add_argument(
|
|
55
61
|
'--cluster',
|
|
@@ -127,7 +133,9 @@ class BlockStorageCleanup(command.Lister):
|
|
|
127
133
|
)
|
|
128
134
|
return parser
|
|
129
135
|
|
|
130
|
-
def take_action(
|
|
136
|
+
def take_action(
|
|
137
|
+
self, parsed_args: argparse.Namespace
|
|
138
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
131
139
|
volume_client = self.app.client_manager.volume
|
|
132
140
|
|
|
133
141
|
if volume_client.api_version < api_versions.APIVersion('3.24'):
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
# License for the specific language governing permissions and limitations
|
|
11
11
|
# under the License.
|
|
12
12
|
|
|
13
|
+
import argparse
|
|
14
|
+
from collections.abc import Iterable, Sequence
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
13
17
|
from cinderclient import api_versions
|
|
14
18
|
from osc_lib import exceptions
|
|
15
19
|
from osc_lib import utils
|
|
@@ -18,7 +22,9 @@ from openstackclient import command
|
|
|
18
22
|
from openstackclient.i18n import _
|
|
19
23
|
|
|
20
24
|
|
|
21
|
-
def _format_cluster(
|
|
25
|
+
def _format_cluster(
|
|
26
|
+
cluster: Any, detailed: bool = False
|
|
27
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
22
28
|
columns: tuple[str, ...] = (
|
|
23
29
|
'name',
|
|
24
30
|
'binary',
|
|
@@ -73,7 +79,7 @@ class ListBlockStorageCluster(command.Lister):
|
|
|
73
79
|
This command requires ``--os-volume-api-version`` 3.7 or greater.
|
|
74
80
|
"""
|
|
75
81
|
|
|
76
|
-
def get_parser(self, prog_name):
|
|
82
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
77
83
|
parser = super().get_parser(prog_name)
|
|
78
84
|
parser.add_argument(
|
|
79
85
|
'--cluster',
|
|
@@ -137,7 +143,9 @@ class ListBlockStorageCluster(command.Lister):
|
|
|
137
143
|
)
|
|
138
144
|
return parser
|
|
139
145
|
|
|
140
|
-
def take_action(
|
|
146
|
+
def take_action(
|
|
147
|
+
self, parsed_args: argparse.Namespace
|
|
148
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
141
149
|
volume_client = self.app.client_manager.volume
|
|
142
150
|
|
|
143
151
|
if volume_client.api_version < api_versions.APIVersion('3.7'):
|
|
@@ -180,7 +188,7 @@ class SetBlockStorageCluster(command.Command):
|
|
|
180
188
|
This command requires ``--os-volume-api-version`` 3.7 or greater.
|
|
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
|
'cluster',
|
|
@@ -221,7 +229,9 @@ class SetBlockStorageCluster(command.Command):
|
|
|
221
229
|
)
|
|
222
230
|
return parser
|
|
223
231
|
|
|
224
|
-
def take_action(
|
|
232
|
+
def take_action(
|
|
233
|
+
self, parsed_args: argparse.Namespace
|
|
234
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
225
235
|
volume_client = self.app.client_manager.volume
|
|
226
236
|
|
|
227
237
|
if volume_client.api_version < api_versions.APIVersion('3.7'):
|
|
@@ -251,7 +261,7 @@ class ShowBlockStorageCluster(command.ShowOne):
|
|
|
251
261
|
This command requires ``--os-volume-api-version`` 3.7 or greater.
|
|
252
262
|
"""
|
|
253
263
|
|
|
254
|
-
def get_parser(self, prog_name):
|
|
264
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
255
265
|
parser = super().get_parser(prog_name)
|
|
256
266
|
parser.add_argument(
|
|
257
267
|
'cluster',
|
|
@@ -265,7 +275,9 @@ class ShowBlockStorageCluster(command.ShowOne):
|
|
|
265
275
|
)
|
|
266
276
|
return parser
|
|
267
277
|
|
|
268
|
-
def take_action(
|
|
278
|
+
def take_action(
|
|
279
|
+
self, parsed_args: argparse.Namespace
|
|
280
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
269
281
|
volume_client = self.app.client_manager.volume
|
|
270
282
|
|
|
271
283
|
if volume_client.api_version < api_versions.APIVersion('3.7'):
|