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,7 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
"""Compute v2 Server action implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Iterable, Sequence
|
|
18
20
|
import importlib
|
|
21
|
+
from typing import Any
|
|
19
22
|
|
|
20
23
|
from osc_lib import exceptions
|
|
21
24
|
from osc_lib import utils
|
|
@@ -32,7 +35,7 @@ class CreateServerBackup(command.ShowOne):
|
|
|
32
35
|
"2": "openstackclient.image.v2.image",
|
|
33
36
|
}
|
|
34
37
|
|
|
35
|
-
def get_parser(self, prog_name):
|
|
38
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
36
39
|
parser = super().get_parser(prog_name)
|
|
37
40
|
parser.add_argument(
|
|
38
41
|
'server',
|
|
@@ -65,8 +68,10 @@ class CreateServerBackup(command.ShowOne):
|
|
|
65
68
|
)
|
|
66
69
|
return parser
|
|
67
70
|
|
|
68
|
-
def take_action(
|
|
69
|
-
|
|
71
|
+
def take_action(
|
|
72
|
+
self, parsed_args: argparse.Namespace
|
|
73
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
74
|
+
def _show_progress(progress: int | None) -> None:
|
|
70
75
|
if progress:
|
|
71
76
|
self.app.stderr.write(f'\rProgress: {progress}')
|
|
72
77
|
self.app.stderr.flush()
|
|
@@ -124,4 +129,5 @@ class CreateServerBackup(command.ShowOne):
|
|
|
124
129
|
]
|
|
125
130
|
)
|
|
126
131
|
info = image_module._format_image(image)
|
|
127
|
-
|
|
132
|
+
col_headers, col_data = zip(*sorted(info.items()))
|
|
133
|
+
return col_headers, col_data
|
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
"""Compute v2 Server operation event implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Iterable, Sequence
|
|
18
20
|
import logging
|
|
21
|
+
from typing import Any
|
|
19
22
|
import uuid
|
|
20
23
|
|
|
21
24
|
from cliff import columns
|
|
@@ -34,7 +37,7 @@ LOG = logging.getLogger(__name__)
|
|
|
34
37
|
|
|
35
38
|
# TODO(stephenfin): Move this to osc_lib since it's useful elsewhere (e.g.
|
|
36
39
|
# glance)
|
|
37
|
-
def is_uuid_like(value) -> bool:
|
|
40
|
+
def is_uuid_like(value: str) -> bool:
|
|
38
41
|
"""Returns validation of a value as a UUID.
|
|
39
42
|
|
|
40
43
|
:param val: Value to verify
|
|
@@ -57,14 +60,14 @@ def is_uuid_like(value) -> bool:
|
|
|
57
60
|
return False
|
|
58
61
|
|
|
59
62
|
|
|
60
|
-
class ServerActionEventColumn(columns.FormattableColumn):
|
|
63
|
+
class ServerActionEventColumn(columns.FormattableColumn[Any]):
|
|
61
64
|
"""Custom formatter for server action events.
|
|
62
65
|
|
|
63
66
|
Format the :class:`~openstack.compute.v2.server_action.ServerActionEvent`
|
|
64
67
|
objects as we'd like.
|
|
65
68
|
"""
|
|
66
69
|
|
|
67
|
-
def _format_event(self, event):
|
|
70
|
+
def _format_event(self, event: Any) -> dict[str, Any]:
|
|
68
71
|
hidden_columns = ['id', 'name', 'location']
|
|
69
72
|
_, columns = utils.get_osc_show_columns_for_sdk_resource(
|
|
70
73
|
event, {}, hidden_columns
|
|
@@ -72,17 +75,19 @@ class ServerActionEventColumn(columns.FormattableColumn):
|
|
|
72
75
|
data = utils.get_item_properties(event, columns)
|
|
73
76
|
return dict(zip(columns, data))
|
|
74
77
|
|
|
75
|
-
def human_readable(self):
|
|
78
|
+
def human_readable(self) -> str:
|
|
76
79
|
events = [self._format_event(event) for event in self._value]
|
|
77
|
-
return utils.format_list_of_dicts(events)
|
|
80
|
+
return utils.format_list_of_dicts(events) or ""
|
|
78
81
|
|
|
79
|
-
def machine_readable(self):
|
|
82
|
+
def machine_readable(self) -> Any:
|
|
80
83
|
events = [self._format_event(event) for event in self._value]
|
|
81
84
|
return events
|
|
82
85
|
|
|
83
86
|
|
|
84
|
-
def _get_server_event_columns(
|
|
85
|
-
|
|
87
|
+
def _get_server_event_columns(
|
|
88
|
+
item: Any, client: Any
|
|
89
|
+
) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
90
|
+
hidden_columns = ['name', 'server_id', 'links', 'location']
|
|
86
91
|
|
|
87
92
|
if not sdk_utils.supports_microversion(client, '2.58'):
|
|
88
93
|
# updated_at was introduced in 2.58
|
|
@@ -100,7 +105,7 @@ class ListServerEvent(command.Lister):
|
|
|
100
105
|
deleted server, specified by ID only.
|
|
101
106
|
"""
|
|
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
|
'server',
|
|
@@ -138,7 +143,9 @@ class ListServerEvent(command.Lister):
|
|
|
138
143
|
pagination.add_marker_pagination_option_to_parser(parser)
|
|
139
144
|
return parser
|
|
140
145
|
|
|
141
|
-
def take_action(
|
|
146
|
+
def take_action(
|
|
147
|
+
self, parsed_args: argparse.Namespace
|
|
148
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
142
149
|
compute_client = self.app.client_manager.compute
|
|
143
150
|
|
|
144
151
|
kwargs = {}
|
|
@@ -251,7 +258,7 @@ class ShowServerEvent(command.ShowOne):
|
|
|
251
258
|
non-admin users.
|
|
252
259
|
"""
|
|
253
260
|
|
|
254
|
-
def get_parser(self, prog_name):
|
|
261
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
255
262
|
parser = super().get_parser(prog_name)
|
|
256
263
|
parser.add_argument(
|
|
257
264
|
'server',
|
|
@@ -265,7 +272,9 @@ class ShowServerEvent(command.ShowOne):
|
|
|
265
272
|
)
|
|
266
273
|
return parser
|
|
267
274
|
|
|
268
|
-
def take_action(
|
|
275
|
+
def take_action(
|
|
276
|
+
self, parsed_args: argparse.Namespace
|
|
277
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
269
278
|
compute_client = self.app.client_manager.compute
|
|
270
279
|
|
|
271
280
|
try:
|
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
"""Compute v2 Server Group action implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Iterable, Sequence
|
|
18
20
|
import logging
|
|
19
|
-
|
|
21
|
+
from typing import Any
|
|
20
22
|
|
|
21
23
|
from cliff import columns
|
|
22
24
|
from openstack import utils as sdk_utils
|
|
@@ -32,14 +34,16 @@ from openstackclient.i18n import _
|
|
|
32
34
|
LOG = logging.getLogger(__name__)
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
_formatters: dict[str, type[columns.FormattableColumn[
|
|
37
|
+
_formatters: dict[str, type[columns.FormattableColumn[Any]]] = {
|
|
36
38
|
'member_ids': format_columns.ListColumn,
|
|
37
39
|
'policies': format_columns.ListColumn,
|
|
38
40
|
'rules': format_columns.DictColumn,
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def _get_server_group_columns(
|
|
44
|
+
def _get_server_group_columns(
|
|
45
|
+
item: Any, client: Any
|
|
46
|
+
) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
43
47
|
column_map = {'member_ids': 'members'}
|
|
44
48
|
hidden_columns = ['metadata', 'location']
|
|
45
49
|
|
|
@@ -57,7 +61,7 @@ def _get_server_group_columns(item, client):
|
|
|
57
61
|
class CreateServerGroup(command.ShowOne):
|
|
58
62
|
_description = _("Create a new server group.")
|
|
59
63
|
|
|
60
|
-
def get_parser(self, prog_name):
|
|
64
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
61
65
|
parser = super().get_parser(prog_name)
|
|
62
66
|
parser.add_argument(
|
|
63
67
|
'name',
|
|
@@ -94,7 +98,9 @@ class CreateServerGroup(command.ShowOne):
|
|
|
94
98
|
)
|
|
95
99
|
return parser
|
|
96
100
|
|
|
97
|
-
def take_action(
|
|
101
|
+
def take_action(
|
|
102
|
+
self, parsed_args: argparse.Namespace
|
|
103
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
98
104
|
compute_client = self.app.client_manager.compute
|
|
99
105
|
|
|
100
106
|
if parsed_args.policy in ('soft-affinity', 'soft-anti-affinity'):
|
|
@@ -144,7 +150,7 @@ class CreateServerGroup(command.ShowOne):
|
|
|
144
150
|
class DeleteServerGroup(command.Command):
|
|
145
151
|
_description = _("Delete existing server group(s).")
|
|
146
152
|
|
|
147
|
-
def get_parser(self, prog_name):
|
|
153
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
148
154
|
parser = super().get_parser(prog_name)
|
|
149
155
|
parser.add_argument(
|
|
150
156
|
'server_group',
|
|
@@ -154,7 +160,7 @@ class DeleteServerGroup(command.Command):
|
|
|
154
160
|
)
|
|
155
161
|
return parser
|
|
156
162
|
|
|
157
|
-
def take_action(self, parsed_args):
|
|
163
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
158
164
|
compute_client = self.app.client_manager.compute
|
|
159
165
|
result = 0
|
|
160
166
|
for group in parsed_args.server_group:
|
|
@@ -179,7 +185,7 @@ class DeleteServerGroup(command.Command):
|
|
|
179
185
|
class ListServerGroup(command.Lister):
|
|
180
186
|
_description = _("List all server groups.")
|
|
181
187
|
|
|
182
|
-
def get_parser(self, prog_name):
|
|
188
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
183
189
|
parser = super().get_parser(prog_name)
|
|
184
190
|
parser.add_argument(
|
|
185
191
|
'--all-projects',
|
|
@@ -198,7 +204,9 @@ class ListServerGroup(command.Lister):
|
|
|
198
204
|
pagination.add_offset_pagination_option_to_parser(parser)
|
|
199
205
|
return parser
|
|
200
206
|
|
|
201
|
-
def take_action(
|
|
207
|
+
def take_action(
|
|
208
|
+
self, parsed_args: argparse.Namespace
|
|
209
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
202
210
|
compute_client = self.app.client_manager.compute
|
|
203
211
|
|
|
204
212
|
kwargs = {}
|
|
@@ -256,7 +264,7 @@ class ListServerGroup(command.Lister):
|
|
|
256
264
|
class ShowServerGroup(command.ShowOne):
|
|
257
265
|
_description = _("Display server group details.")
|
|
258
266
|
|
|
259
|
-
def get_parser(self, prog_name):
|
|
267
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
260
268
|
parser = super().get_parser(prog_name)
|
|
261
269
|
parser.add_argument(
|
|
262
270
|
'server_group',
|
|
@@ -265,7 +273,9 @@ class ShowServerGroup(command.ShowOne):
|
|
|
265
273
|
)
|
|
266
274
|
return parser
|
|
267
275
|
|
|
268
|
-
def take_action(
|
|
276
|
+
def take_action(
|
|
277
|
+
self, parsed_args: argparse.Namespace
|
|
278
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
269
279
|
compute_client = self.app.client_manager.compute
|
|
270
280
|
group = compute_client.find_server_group(
|
|
271
281
|
parsed_args.server_group, ignore_missing=False
|
|
@@ -15,8 +15,11 @@
|
|
|
15
15
|
|
|
16
16
|
"""Compute v2 Server action implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from collections.abc import Iterable, Sequence
|
|
18
20
|
import importlib
|
|
19
21
|
import logging
|
|
22
|
+
from typing import Any
|
|
20
23
|
|
|
21
24
|
from osc_lib.cli import parseractions
|
|
22
25
|
from osc_lib import exceptions
|
|
@@ -37,7 +40,7 @@ class CreateServerImage(command.ShowOne):
|
|
|
37
40
|
"2": "openstackclient.image.v2.image",
|
|
38
41
|
}
|
|
39
42
|
|
|
40
|
-
def get_parser(self, prog_name):
|
|
43
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
41
44
|
parser = super().get_parser(prog_name)
|
|
42
45
|
parser.add_argument(
|
|
43
46
|
'server',
|
|
@@ -66,8 +69,10 @@ class CreateServerImage(command.ShowOne):
|
|
|
66
69
|
)
|
|
67
70
|
return parser
|
|
68
71
|
|
|
69
|
-
def take_action(
|
|
70
|
-
|
|
72
|
+
def take_action(
|
|
73
|
+
self, parsed_args: argparse.Namespace
|
|
74
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
75
|
+
def _show_progress(progress: int | None) -> None:
|
|
71
76
|
if progress:
|
|
72
77
|
self.app.stdout.write(f'\rProgress: {progress}')
|
|
73
78
|
self.app.stdout.flush()
|
|
@@ -85,11 +90,16 @@ class CreateServerImage(command.ShowOne):
|
|
|
85
90
|
else:
|
|
86
91
|
image_name = server.name
|
|
87
92
|
|
|
88
|
-
|
|
93
|
+
image = compute_client.create_server_image(
|
|
89
94
|
server.id,
|
|
90
95
|
image_name,
|
|
91
96
|
parsed_args.properties,
|
|
92
|
-
)
|
|
97
|
+
)
|
|
98
|
+
if not image:
|
|
99
|
+
msg = _('Error creating server image: %s')
|
|
100
|
+
raise exceptions.CommandError(msg, parsed_args.server)
|
|
101
|
+
|
|
102
|
+
image_id = image.id
|
|
93
103
|
|
|
94
104
|
if parsed_args.wait:
|
|
95
105
|
if utils.wait_for_status(
|
|
@@ -99,10 +109,8 @@ class CreateServerImage(command.ShowOne):
|
|
|
99
109
|
):
|
|
100
110
|
self.app.stdout.write('\n')
|
|
101
111
|
else:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
)
|
|
105
|
-
raise exceptions.CommandError
|
|
112
|
+
msg = _('Error creating server image: %s')
|
|
113
|
+
raise exceptions.CommandError(msg, parsed_args.server)
|
|
106
114
|
|
|
107
115
|
image = image_client.find_image(image_id, ignore_missing=False)
|
|
108
116
|
|
|
@@ -119,4 +127,5 @@ class CreateServerImage(command.ShowOne):
|
|
|
119
127
|
)
|
|
120
128
|
info = image_module._format_image(image)
|
|
121
129
|
|
|
122
|
-
|
|
130
|
+
col_headers, col_data = zip(*sorted(info.items()))
|
|
131
|
+
return col_headers, col_data
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
"""Compute v2 Server Migration action implementations"""
|
|
14
14
|
|
|
15
|
+
import argparse
|
|
16
|
+
from collections.abc import Iterable, Sequence
|
|
17
|
+
from typing import Any
|
|
15
18
|
import uuid
|
|
16
19
|
|
|
17
20
|
from openstack import utils as sdk_utils
|
|
@@ -27,7 +30,7 @@ from openstackclient.identity import common as identity_common
|
|
|
27
30
|
class ListMigration(command.Lister):
|
|
28
31
|
_description = _("""List server migrations""")
|
|
29
32
|
|
|
30
|
-
def get_parser(self, prog_name):
|
|
33
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
31
34
|
parser = super().get_parser(prog_name)
|
|
32
35
|
parser.add_argument(
|
|
33
36
|
'--server',
|
|
@@ -98,7 +101,12 @@ class ListMigration(command.Lister):
|
|
|
98
101
|
identity_common.add_user_domain_option_to_parser(parser)
|
|
99
102
|
return parser
|
|
100
103
|
|
|
101
|
-
def print_migrations(
|
|
104
|
+
def print_migrations(
|
|
105
|
+
self,
|
|
106
|
+
parsed_args: argparse.Namespace,
|
|
107
|
+
compute_client: Any,
|
|
108
|
+
migrations: Any,
|
|
109
|
+
) -> tuple[list[str], Iterable[tuple[Any, ...]]]:
|
|
102
110
|
column_headers = [
|
|
103
111
|
'Source Node',
|
|
104
112
|
'Dest Node',
|
|
@@ -153,7 +161,9 @@ class ListMigration(command.Lister):
|
|
|
153
161
|
(utils.get_item_properties(mig, columns) for mig in migrations),
|
|
154
162
|
)
|
|
155
163
|
|
|
156
|
-
def take_action(
|
|
164
|
+
def take_action(
|
|
165
|
+
self, parsed_args: argparse.Namespace
|
|
166
|
+
) -> tuple[list[str], Iterable[tuple[Any, ...]]]:
|
|
157
167
|
compute_client = self.app.client_manager.compute
|
|
158
168
|
identity_client = self.app.client_manager.identity
|
|
159
169
|
|
|
@@ -248,7 +258,9 @@ class ListMigration(command.Lister):
|
|
|
248
258
|
return self.print_migrations(parsed_args, compute_client, migrations)
|
|
249
259
|
|
|
250
260
|
|
|
251
|
-
def _get_migration_by_uuid(
|
|
261
|
+
def _get_migration_by_uuid(
|
|
262
|
+
compute_client: Any, server_id: str, migration_uuid: str
|
|
263
|
+
) -> Any:
|
|
252
264
|
for migration in compute_client.server_migrations(server_id):
|
|
253
265
|
if migration.uuid == migration_uuid:
|
|
254
266
|
return migration
|
|
@@ -274,7 +286,7 @@ class ShowMigration(command.ShowOne):
|
|
|
274
286
|
these.
|
|
275
287
|
"""
|
|
276
288
|
|
|
277
|
-
def get_parser(self, prog_name):
|
|
289
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
278
290
|
parser = super().get_parser(prog_name)
|
|
279
291
|
parser.add_argument(
|
|
280
292
|
'server',
|
|
@@ -288,7 +300,9 @@ class ShowMigration(command.ShowOne):
|
|
|
288
300
|
)
|
|
289
301
|
return parser
|
|
290
302
|
|
|
291
|
-
def take_action(
|
|
303
|
+
def take_action(
|
|
304
|
+
self, parsed_args: argparse.Namespace
|
|
305
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
292
306
|
compute_client = self.app.client_manager.compute
|
|
293
307
|
|
|
294
308
|
if not sdk_utils.supports_microversion(compute_client, '2.24'):
|
|
@@ -389,7 +403,7 @@ class AbortMigration(command.Command):
|
|
|
389
403
|
This command requires ``--os-compute-api-version`` 2.24 or greater.
|
|
390
404
|
"""
|
|
391
405
|
|
|
392
|
-
def get_parser(self, prog_name):
|
|
406
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
393
407
|
parser = super().get_parser(prog_name)
|
|
394
408
|
parser.add_argument(
|
|
395
409
|
'server',
|
|
@@ -403,7 +417,7 @@ class AbortMigration(command.Command):
|
|
|
403
417
|
)
|
|
404
418
|
return parser
|
|
405
419
|
|
|
406
|
-
def take_action(self, parsed_args):
|
|
420
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
407
421
|
compute_client = self.app.client_manager.compute
|
|
408
422
|
|
|
409
423
|
if not sdk_utils.supports_microversion(compute_client, '2.24'):
|
|
@@ -456,7 +470,7 @@ class ForceCompleteMigration(command.Command):
|
|
|
456
470
|
This command requires ``--os-compute-api-version`` 2.22 or greater.
|
|
457
471
|
"""
|
|
458
472
|
|
|
459
|
-
def get_parser(self, prog_name):
|
|
473
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
460
474
|
parser = super().get_parser(prog_name)
|
|
461
475
|
parser.add_argument(
|
|
462
476
|
'server',
|
|
@@ -468,7 +482,7 @@ class ForceCompleteMigration(command.Command):
|
|
|
468
482
|
)
|
|
469
483
|
return parser
|
|
470
484
|
|
|
471
|
-
def take_action(self, parsed_args):
|
|
485
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
472
486
|
compute_client = self.app.client_manager.compute
|
|
473
487
|
|
|
474
488
|
if not sdk_utils.supports_microversion(compute_client, '2.22'):
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Copyright 2020, Red Hat Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
4
|
+
# not use this file except in compliance with the License. You may obtain
|
|
5
|
+
# a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
11
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
12
|
+
# License for the specific language governing permissions and limitations
|
|
13
|
+
# under the License.
|
|
14
|
+
|
|
15
|
+
"""Compute v2 Server action implementations"""
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
from collections.abc import Iterable, Sequence
|
|
19
|
+
from typing import Any
|
|
20
|
+
|
|
21
|
+
from openstack import utils as sdk_utils
|
|
22
|
+
from osc_lib import exceptions
|
|
23
|
+
from osc_lib import utils
|
|
24
|
+
|
|
25
|
+
from openstackclient import command
|
|
26
|
+
from openstackclient.i18n import _
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _get_server_share_columns(
|
|
30
|
+
item: Any,
|
|
31
|
+
) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
32
|
+
# Non admin cannot see uuid and export location, so hide them
|
|
33
|
+
if item.uuid is None:
|
|
34
|
+
column_map = {
|
|
35
|
+
'share_id': 'Share ID',
|
|
36
|
+
'status': 'Status',
|
|
37
|
+
'tag': 'Tag',
|
|
38
|
+
}
|
|
39
|
+
hidden_columns = [
|
|
40
|
+
'id',
|
|
41
|
+
'location',
|
|
42
|
+
'name',
|
|
43
|
+
'uuid',
|
|
44
|
+
'export_location',
|
|
45
|
+
'share_proto',
|
|
46
|
+
]
|
|
47
|
+
else:
|
|
48
|
+
column_map = {
|
|
49
|
+
'uuid': 'UUID',
|
|
50
|
+
'share_id': 'Share ID',
|
|
51
|
+
'status': 'Status',
|
|
52
|
+
'tag': 'Tag',
|
|
53
|
+
'export_location': 'Export Location',
|
|
54
|
+
}
|
|
55
|
+
hidden_columns = ['id', 'location', 'name', 'share_proto']
|
|
56
|
+
|
|
57
|
+
return utils.get_osc_show_columns_for_sdk_resource(
|
|
58
|
+
item, column_map, hidden_columns
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class ListServerShare(command.Lister):
|
|
63
|
+
"""List all the shares attached to a server.
|
|
64
|
+
|
|
65
|
+
Requires ``--os-compute-api-version 2.97`` or later.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
69
|
+
parser = super().get_parser(prog_name)
|
|
70
|
+
parser.add_argument(
|
|
71
|
+
'server',
|
|
72
|
+
metavar='<server>',
|
|
73
|
+
help=_('Server to list share mapping for (name or ID)'),
|
|
74
|
+
)
|
|
75
|
+
return parser
|
|
76
|
+
|
|
77
|
+
def take_action(
|
|
78
|
+
self, parsed_args: argparse.Namespace
|
|
79
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
80
|
+
compute_client = self.app.client_manager.compute
|
|
81
|
+
|
|
82
|
+
if not sdk_utils.supports_microversion(compute_client, '2.97'):
|
|
83
|
+
msg = _(
|
|
84
|
+
'--os-compute-api-version 2.97 or greater is required '
|
|
85
|
+
'to support share attachments'
|
|
86
|
+
)
|
|
87
|
+
raise exceptions.CommandError(msg)
|
|
88
|
+
|
|
89
|
+
server = compute_client.find_server(
|
|
90
|
+
parsed_args.server,
|
|
91
|
+
ignore_missing=False,
|
|
92
|
+
)
|
|
93
|
+
shares = compute_client.share_attachments(server)
|
|
94
|
+
|
|
95
|
+
columns = (
|
|
96
|
+
'share_id',
|
|
97
|
+
'status',
|
|
98
|
+
'tag',
|
|
99
|
+
)
|
|
100
|
+
column_headers = (
|
|
101
|
+
'Share ID',
|
|
102
|
+
'Status',
|
|
103
|
+
'Tag',
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
column_headers,
|
|
108
|
+
(utils.get_item_properties(s, columns) for s in shares),
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class ShowServerShare(command.ShowOne):
|
|
113
|
+
"""Show detail of a share attachment to a server.
|
|
114
|
+
|
|
115
|
+
Requires ``--os-compute-api-version 2.97`` or later.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
119
|
+
parser = super().get_parser(prog_name)
|
|
120
|
+
parser.add_argument(
|
|
121
|
+
'server',
|
|
122
|
+
metavar='<server>',
|
|
123
|
+
help=_('Server to show share mapping for (name or ID)'),
|
|
124
|
+
)
|
|
125
|
+
parser.add_argument(
|
|
126
|
+
'share',
|
|
127
|
+
metavar='<share>',
|
|
128
|
+
help=_('Share to show details for (name or ID)'),
|
|
129
|
+
)
|
|
130
|
+
return parser
|
|
131
|
+
|
|
132
|
+
def take_action(
|
|
133
|
+
self, parsed_args: argparse.Namespace
|
|
134
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
135
|
+
compute_client = self.app.client_manager.compute
|
|
136
|
+
shared_file_system_client = (
|
|
137
|
+
self.app.client_manager.sdk_connection.shared_file_system
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
if not sdk_utils.supports_microversion(compute_client, '2.97'):
|
|
141
|
+
msg = _(
|
|
142
|
+
'--os-compute-api-version 2.97 or greater is required '
|
|
143
|
+
'to support share attachments'
|
|
144
|
+
)
|
|
145
|
+
raise exceptions.CommandError(msg)
|
|
146
|
+
|
|
147
|
+
server = compute_client.find_server(
|
|
148
|
+
parsed_args.server,
|
|
149
|
+
ignore_missing=False,
|
|
150
|
+
)
|
|
151
|
+
share = shared_file_system_client.find_share(
|
|
152
|
+
parsed_args.share,
|
|
153
|
+
ignore_missing=False,
|
|
154
|
+
)
|
|
155
|
+
share_attachment = compute_client.get_share_attachment(
|
|
156
|
+
server, share.id
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
display_columns, columns = _get_server_share_columns(
|
|
160
|
+
share_attachment,
|
|
161
|
+
)
|
|
162
|
+
data = utils.get_item_properties(share_attachment, columns)
|
|
163
|
+
return display_columns, data
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class AddServerShare(command.ShowOne):
|
|
167
|
+
"""Add a share to a server.
|
|
168
|
+
|
|
169
|
+
Requires ``--os-compute-api-version 2.97`` or later.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
173
|
+
parser = super().get_parser(prog_name)
|
|
174
|
+
parser.add_argument(
|
|
175
|
+
'server',
|
|
176
|
+
metavar='<server>',
|
|
177
|
+
help=_('Server to add share to (name or ID)'),
|
|
178
|
+
)
|
|
179
|
+
parser.add_argument(
|
|
180
|
+
'share',
|
|
181
|
+
metavar='<share>',
|
|
182
|
+
help=_('Share to add (name or ID)'),
|
|
183
|
+
)
|
|
184
|
+
parser.add_argument(
|
|
185
|
+
'--tag',
|
|
186
|
+
metavar='<tag>',
|
|
187
|
+
help=_(
|
|
188
|
+
'Optional tag used to mount the share, '
|
|
189
|
+
'if not provided the share uuid is used as tag by default'
|
|
190
|
+
),
|
|
191
|
+
)
|
|
192
|
+
return parser
|
|
193
|
+
|
|
194
|
+
def take_action(
|
|
195
|
+
self, parsed_args: argparse.Namespace
|
|
196
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
197
|
+
compute_client = self.app.client_manager.compute
|
|
198
|
+
shared_file_system_client = (
|
|
199
|
+
self.app.client_manager.sdk_connection.shared_file_system
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
if not sdk_utils.supports_microversion(compute_client, '2.97'):
|
|
203
|
+
msg = _(
|
|
204
|
+
'--os-compute-api-version 2.97 or greater is required '
|
|
205
|
+
'to support share attachments'
|
|
206
|
+
)
|
|
207
|
+
raise exceptions.CommandError(msg)
|
|
208
|
+
|
|
209
|
+
server = compute_client.find_server(
|
|
210
|
+
parsed_args.server,
|
|
211
|
+
ignore_missing=False,
|
|
212
|
+
)
|
|
213
|
+
share = shared_file_system_client.find_share(
|
|
214
|
+
parsed_args.share,
|
|
215
|
+
ignore_missing=False,
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
kwargs: dict[str, Any] = {}
|
|
219
|
+
if parsed_args.tag:
|
|
220
|
+
kwargs['tag'] = parsed_args.tag
|
|
221
|
+
|
|
222
|
+
share_attachment = compute_client.create_share_attachment(
|
|
223
|
+
server, share.id, **kwargs
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
display_columns, columns = _get_server_share_columns(
|
|
227
|
+
share_attachment,
|
|
228
|
+
)
|
|
229
|
+
data = utils.get_item_properties(share_attachment, columns)
|
|
230
|
+
return display_columns, data
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
class RemoveServerShare(command.Command):
|
|
234
|
+
"""Remove a share from a server.
|
|
235
|
+
|
|
236
|
+
Requires ``--os-compute-api-version 2.97`` or later.
|
|
237
|
+
"""
|
|
238
|
+
|
|
239
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
240
|
+
parser = super().get_parser(prog_name)
|
|
241
|
+
parser.add_argument(
|
|
242
|
+
'server',
|
|
243
|
+
metavar='<server>',
|
|
244
|
+
help=_('Server to remove share from (name or ID)'),
|
|
245
|
+
)
|
|
246
|
+
parser.add_argument(
|
|
247
|
+
'share',
|
|
248
|
+
metavar='<share>',
|
|
249
|
+
help=_('Share to remove (name or ID)'),
|
|
250
|
+
)
|
|
251
|
+
return parser
|
|
252
|
+
|
|
253
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
254
|
+
compute_client = self.app.client_manager.compute
|
|
255
|
+
shared_file_system_client = (
|
|
256
|
+
self.app.client_manager.sdk_connection.shared_file_system
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
if not sdk_utils.supports_microversion(compute_client, '2.97'):
|
|
260
|
+
msg = _(
|
|
261
|
+
'--os-compute-api-version 2.97 or greater is required '
|
|
262
|
+
'to support share attachments'
|
|
263
|
+
)
|
|
264
|
+
raise exceptions.CommandError(msg)
|
|
265
|
+
|
|
266
|
+
server = compute_client.find_server(
|
|
267
|
+
parsed_args.server,
|
|
268
|
+
ignore_missing=False,
|
|
269
|
+
)
|
|
270
|
+
share = shared_file_system_client.find_share(
|
|
271
|
+
parsed_args.share,
|
|
272
|
+
ignore_missing=False,
|
|
273
|
+
)
|
|
274
|
+
compute_client.delete_share_attachment(server, share.id)
|