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
|
@@ -12,7 +12,10 @@
|
|
|
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 collections.abc import Iterable, Sequence
|
|
18
|
+
from typing import Any
|
|
16
19
|
|
|
17
20
|
from osc_lib.cli import identity as identity_utils
|
|
18
21
|
from osc_lib import exceptions
|
|
@@ -37,14 +40,14 @@ _attr_map = [
|
|
|
37
40
|
]
|
|
38
41
|
|
|
39
42
|
|
|
40
|
-
def _add_updatable_args(parser):
|
|
43
|
+
def _add_updatable_args(parser: argparse.ArgumentParser) -> None:
|
|
41
44
|
parser.add_argument('--name', help=_('Name of the tap service.'))
|
|
42
45
|
parser.add_argument(
|
|
43
46
|
'--description', help=_('Description of the tap service.')
|
|
44
47
|
)
|
|
45
48
|
|
|
46
49
|
|
|
47
|
-
def _get_columns(item):
|
|
50
|
+
def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
48
51
|
column_map: dict[str, str] = {}
|
|
49
52
|
hidden_columns = ['location', 'tenant_id']
|
|
50
53
|
return osc_utils.get_osc_show_columns_for_sdk_resource(
|
|
@@ -55,7 +58,7 @@ def _get_columns(item):
|
|
|
55
58
|
class CreateTapService(command.ShowOne):
|
|
56
59
|
_description = _("Create a new tap service.")
|
|
57
60
|
|
|
58
|
-
def get_parser(self, prog_name):
|
|
61
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
59
62
|
parser = super().get_parser(prog_name)
|
|
60
63
|
identity_utils.add_project_owner_option_to_parser(parser)
|
|
61
64
|
_add_updatable_args(parser)
|
|
@@ -68,7 +71,9 @@ class CreateTapService(command.ShowOne):
|
|
|
68
71
|
)
|
|
69
72
|
return parser
|
|
70
73
|
|
|
71
|
-
def take_action(
|
|
74
|
+
def take_action(
|
|
75
|
+
self, parsed_args: argparse.Namespace
|
|
76
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
72
77
|
client = self.app.client_manager.network
|
|
73
78
|
attrs = {}
|
|
74
79
|
if parsed_args.name is not None:
|
|
@@ -95,13 +100,15 @@ class CreateTapService(command.ShowOne):
|
|
|
95
100
|
class ListTapService(command.Lister):
|
|
96
101
|
_description = _("List tap services.")
|
|
97
102
|
|
|
98
|
-
def get_parser(self, prog_name):
|
|
103
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
99
104
|
parser = super().get_parser(prog_name)
|
|
100
105
|
identity_utils.add_project_owner_option_to_parser(parser)
|
|
101
106
|
|
|
102
107
|
return parser
|
|
103
108
|
|
|
104
|
-
def take_action(
|
|
109
|
+
def take_action(
|
|
110
|
+
self, parsed_args: argparse.Namespace
|
|
111
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
105
112
|
client = self.app.client_manager.network
|
|
106
113
|
params = {}
|
|
107
114
|
if parsed_args.project is not None:
|
|
@@ -123,7 +130,7 @@ class ListTapService(command.Lister):
|
|
|
123
130
|
class ShowTapService(command.ShowOne):
|
|
124
131
|
_description = _("Show tap service details.")
|
|
125
132
|
|
|
126
|
-
def get_parser(self, prog_name):
|
|
133
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
127
134
|
parser = super().get_parser(prog_name)
|
|
128
135
|
parser.add_argument(
|
|
129
136
|
TAP_SERVICE,
|
|
@@ -132,7 +139,9 @@ class ShowTapService(command.ShowOne):
|
|
|
132
139
|
)
|
|
133
140
|
return parser
|
|
134
141
|
|
|
135
|
-
def take_action(
|
|
142
|
+
def take_action(
|
|
143
|
+
self, parsed_args: argparse.Namespace
|
|
144
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
136
145
|
client = self.app.client_manager.network
|
|
137
146
|
id = client.find_tap_service(
|
|
138
147
|
parsed_args.tap_service, ignore_missing=False
|
|
@@ -146,7 +155,7 @@ class ShowTapService(command.ShowOne):
|
|
|
146
155
|
class DeleteTapService(command.Command):
|
|
147
156
|
_description = _("Delete a tap service.")
|
|
148
157
|
|
|
149
|
-
def get_parser(self, prog_name):
|
|
158
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
150
159
|
parser = super().get_parser(prog_name)
|
|
151
160
|
parser.add_argument(
|
|
152
161
|
TAP_SERVICE,
|
|
@@ -156,7 +165,7 @@ class DeleteTapService(command.Command):
|
|
|
156
165
|
)
|
|
157
166
|
return parser
|
|
158
167
|
|
|
159
|
-
def take_action(self, parsed_args):
|
|
168
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
160
169
|
client = self.app.client_manager.network
|
|
161
170
|
fails = 0
|
|
162
171
|
for id_or_name in parsed_args.tap_service:
|
|
@@ -185,7 +194,7 @@ class DeleteTapService(command.Command):
|
|
|
185
194
|
class UpdateTapService(command.ShowOne):
|
|
186
195
|
_description = _("Update a tap service.")
|
|
187
196
|
|
|
188
|
-
def get_parser(self, prog_name):
|
|
197
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
189
198
|
parser = super().get_parser(prog_name)
|
|
190
199
|
parser.add_argument(
|
|
191
200
|
TAP_SERVICE,
|
|
@@ -195,7 +204,9 @@ class UpdateTapService(command.ShowOne):
|
|
|
195
204
|
_add_updatable_args(parser)
|
|
196
205
|
return parser
|
|
197
206
|
|
|
198
|
-
def take_action(
|
|
207
|
+
def take_action(
|
|
208
|
+
self, parsed_args: argparse.Namespace
|
|
209
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
199
210
|
client = self.app.client_manager.network
|
|
200
211
|
original_t_s = client.find_tap_service(
|
|
201
212
|
parsed_args.tap_service, ignore_missing=False
|
openstackclient/object/client.py
CHANGED
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
|
|
16
16
|
"""Object client"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
19
|
+
from typing import Any
|
|
20
|
+
|
|
18
21
|
from osc_lib import utils
|
|
19
22
|
|
|
20
23
|
from openstackclient.api import object_store_v1
|
|
@@ -26,7 +29,7 @@ API_NAME = 'object_store'
|
|
|
26
29
|
API_VERSIONS = ('1',)
|
|
27
30
|
|
|
28
31
|
|
|
29
|
-
def make_client(instance):
|
|
32
|
+
def make_client(instance: Any) -> object_store_v1.APIv1:
|
|
30
33
|
"""Returns an object-store API client."""
|
|
31
34
|
|
|
32
35
|
endpoint = instance.get_endpoint_for_service_type(
|
|
@@ -43,7 +46,9 @@ def make_client(instance):
|
|
|
43
46
|
return client
|
|
44
47
|
|
|
45
48
|
|
|
46
|
-
def build_option_parser(
|
|
49
|
+
def build_option_parser(
|
|
50
|
+
parser: argparse.ArgumentParser,
|
|
51
|
+
) -> argparse.ArgumentParser:
|
|
47
52
|
"""Hook to add global options"""
|
|
48
53
|
parser.add_argument(
|
|
49
54
|
'--os-object-api-version',
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
|
|
14
14
|
"""Account v1 action implementations"""
|
|
15
15
|
|
|
16
|
+
import argparse
|
|
17
|
+
from collections.abc import Iterable, Sequence
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
16
20
|
from osc_lib.cli import format_columns
|
|
17
21
|
from osc_lib.cli import parseractions
|
|
18
22
|
|
|
@@ -23,7 +27,7 @@ from openstackclient.i18n import _
|
|
|
23
27
|
class SetAccount(command.Command):
|
|
24
28
|
_description = _("Set account properties")
|
|
25
29
|
|
|
26
|
-
def get_parser(self, prog_name):
|
|
30
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
27
31
|
parser = super().get_parser(prog_name)
|
|
28
32
|
parser.add_argument(
|
|
29
33
|
"--property",
|
|
@@ -37,7 +41,7 @@ class SetAccount(command.Command):
|
|
|
37
41
|
)
|
|
38
42
|
return parser
|
|
39
43
|
|
|
40
|
-
def take_action(self, parsed_args):
|
|
44
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
41
45
|
self.app.client_manager.object_store.account_set(
|
|
42
46
|
properties=parsed_args.property,
|
|
43
47
|
)
|
|
@@ -46,19 +50,22 @@ class SetAccount(command.Command):
|
|
|
46
50
|
class ShowAccount(command.ShowOne):
|
|
47
51
|
_description = _("Display account details")
|
|
48
52
|
|
|
49
|
-
def take_action(
|
|
53
|
+
def take_action(
|
|
54
|
+
self, parsed_args: argparse.Namespace
|
|
55
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
50
56
|
data = self.app.client_manager.object_store.account_show()
|
|
51
57
|
if 'properties' in data:
|
|
52
58
|
data['properties'] = format_columns.DictColumn(
|
|
53
59
|
data.pop('properties')
|
|
54
60
|
)
|
|
55
|
-
|
|
61
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
62
|
+
return col_headers, col_data
|
|
56
63
|
|
|
57
64
|
|
|
58
65
|
class UnsetAccount(command.Command):
|
|
59
66
|
_description = _("Unset account properties")
|
|
60
67
|
|
|
61
|
-
def get_parser(self, prog_name):
|
|
68
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
62
69
|
parser = super().get_parser(prog_name)
|
|
63
70
|
parser.add_argument(
|
|
64
71
|
'--property',
|
|
@@ -73,7 +80,7 @@ class UnsetAccount(command.Command):
|
|
|
73
80
|
)
|
|
74
81
|
return parser
|
|
75
82
|
|
|
76
|
-
def take_action(self, parsed_args):
|
|
83
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
77
84
|
self.app.client_manager.object_store.account_unset(
|
|
78
85
|
properties=parsed_args.property,
|
|
79
86
|
)
|
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
"""Container v1 action implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
18
19
|
import logging
|
|
20
|
+
from collections.abc import Iterable, Sequence
|
|
21
|
+
from typing import Any
|
|
19
22
|
|
|
20
23
|
from osc_lib.cli import format_columns
|
|
21
24
|
from osc_lib.cli import parseractions
|
|
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
|
|
|
31
34
|
class CreateContainer(command.Lister):
|
|
32
35
|
_description = _("Create new container")
|
|
33
36
|
|
|
34
|
-
def get_parser(self, prog_name):
|
|
37
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
35
38
|
parser = super().get_parser(prog_name)
|
|
36
39
|
parser.add_argument(
|
|
37
40
|
'--public',
|
|
@@ -51,7 +54,9 @@ class CreateContainer(command.Lister):
|
|
|
51
54
|
)
|
|
52
55
|
return parser
|
|
53
56
|
|
|
54
|
-
def take_action(
|
|
57
|
+
def take_action(
|
|
58
|
+
self, parsed_args: argparse.Namespace
|
|
59
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
55
60
|
results = []
|
|
56
61
|
for container in parsed_args.containers:
|
|
57
62
|
if len(container) > 256:
|
|
@@ -84,7 +89,7 @@ class CreateContainer(command.Lister):
|
|
|
84
89
|
class DeleteContainer(command.Command):
|
|
85
90
|
_description = _("Delete container")
|
|
86
91
|
|
|
87
|
-
def get_parser(self, prog_name):
|
|
92
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
88
93
|
parser = super().get_parser(prog_name)
|
|
89
94
|
parser.add_argument(
|
|
90
95
|
'--recursive',
|
|
@@ -101,7 +106,7 @@ class DeleteContainer(command.Command):
|
|
|
101
106
|
)
|
|
102
107
|
return parser
|
|
103
108
|
|
|
104
|
-
def take_action(self, parsed_args):
|
|
109
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
105
110
|
for container in parsed_args.containers:
|
|
106
111
|
if parsed_args.recursive:
|
|
107
112
|
objs = self.app.client_manager.object_store.object_list(
|
|
@@ -120,7 +125,7 @@ class DeleteContainer(command.Command):
|
|
|
120
125
|
class ListContainer(command.Lister):
|
|
121
126
|
_description = _("List containers")
|
|
122
127
|
|
|
123
|
-
def get_parser(self, prog_name):
|
|
128
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
124
129
|
parser = super().get_parser(prog_name)
|
|
125
130
|
parser.add_argument(
|
|
126
131
|
"--prefix",
|
|
@@ -147,7 +152,9 @@ class ListContainer(command.Lister):
|
|
|
147
152
|
)
|
|
148
153
|
return parser
|
|
149
154
|
|
|
150
|
-
def take_action(
|
|
155
|
+
def take_action(
|
|
156
|
+
self, parsed_args: argparse.Namespace
|
|
157
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
151
158
|
columns: tuple[str, ...] = ('Name',)
|
|
152
159
|
if parsed_args.long:
|
|
153
160
|
columns += ('Bytes', 'Count')
|
|
@@ -182,7 +189,7 @@ class ListContainer(command.Lister):
|
|
|
182
189
|
class SaveContainer(command.Command):
|
|
183
190
|
_description = _("Save container contents locally")
|
|
184
191
|
|
|
185
|
-
def get_parser(self, prog_name):
|
|
192
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
186
193
|
parser = super().get_parser(prog_name)
|
|
187
194
|
parser.add_argument(
|
|
188
195
|
'container',
|
|
@@ -191,7 +198,7 @@ class SaveContainer(command.Command):
|
|
|
191
198
|
)
|
|
192
199
|
return parser
|
|
193
200
|
|
|
194
|
-
def take_action(self, parsed_args):
|
|
201
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
195
202
|
self.app.client_manager.object_store.container_save(
|
|
196
203
|
container=parsed_args.container,
|
|
197
204
|
)
|
|
@@ -200,7 +207,7 @@ class SaveContainer(command.Command):
|
|
|
200
207
|
class SetContainer(command.Command):
|
|
201
208
|
_description = _("Set container properties")
|
|
202
209
|
|
|
203
|
-
def get_parser(self, prog_name):
|
|
210
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
204
211
|
parser = super().get_parser(prog_name)
|
|
205
212
|
parser.add_argument(
|
|
206
213
|
'container',
|
|
@@ -219,7 +226,7 @@ class SetContainer(command.Command):
|
|
|
219
226
|
)
|
|
220
227
|
return parser
|
|
221
228
|
|
|
222
|
-
def take_action(self, parsed_args):
|
|
229
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
223
230
|
self.app.client_manager.object_store.container_set(
|
|
224
231
|
parsed_args.container,
|
|
225
232
|
properties=parsed_args.property,
|
|
@@ -229,7 +236,7 @@ class SetContainer(command.Command):
|
|
|
229
236
|
class ShowContainer(command.ShowOne):
|
|
230
237
|
_description = _("Display container details")
|
|
231
238
|
|
|
232
|
-
def get_parser(self, prog_name):
|
|
239
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
233
240
|
parser = super().get_parser(prog_name)
|
|
234
241
|
parser.add_argument(
|
|
235
242
|
'container',
|
|
@@ -238,20 +245,23 @@ class ShowContainer(command.ShowOne):
|
|
|
238
245
|
)
|
|
239
246
|
return parser
|
|
240
247
|
|
|
241
|
-
def take_action(
|
|
248
|
+
def take_action(
|
|
249
|
+
self, parsed_args: argparse.Namespace
|
|
250
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
242
251
|
data = self.app.client_manager.object_store.container_show(
|
|
243
252
|
container=parsed_args.container,
|
|
244
253
|
)
|
|
245
254
|
if 'properties' in data:
|
|
246
255
|
data['properties'] = format_columns.DictColumn(data['properties'])
|
|
247
256
|
|
|
248
|
-
|
|
257
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
258
|
+
return col_headers, col_data
|
|
249
259
|
|
|
250
260
|
|
|
251
261
|
class UnsetContainer(command.Command):
|
|
252
262
|
_description = _("Unset container properties")
|
|
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
|
'container',
|
|
@@ -271,7 +281,7 @@ class UnsetContainer(command.Command):
|
|
|
271
281
|
)
|
|
272
282
|
return parser
|
|
273
283
|
|
|
274
|
-
def take_action(self, parsed_args):
|
|
284
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
275
285
|
self.app.client_manager.object_store.container_unset(
|
|
276
286
|
parsed_args.container,
|
|
277
287
|
properties=parsed_args.property,
|
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
"""Object v1 action implementations"""
|
|
17
17
|
|
|
18
|
+
import argparse
|
|
18
19
|
import logging
|
|
20
|
+
from collections.abc import Iterable, Sequence
|
|
21
|
+
from typing import Any
|
|
19
22
|
|
|
20
23
|
from osc_lib.cli import format_columns
|
|
21
24
|
from osc_lib.cli import parseractions
|
|
@@ -33,7 +36,7 @@ LOG = logging.getLogger(__name__)
|
|
|
33
36
|
class CreateObject(command.Lister):
|
|
34
37
|
_description = _("Upload object to container")
|
|
35
38
|
|
|
36
|
-
def get_parser(self, prog_name):
|
|
39
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
37
40
|
parser = super().get_parser(prog_name)
|
|
38
41
|
parser.add_argument(
|
|
39
42
|
'container',
|
|
@@ -56,7 +59,9 @@ class CreateObject(command.Lister):
|
|
|
56
59
|
)
|
|
57
60
|
return parser
|
|
58
61
|
|
|
59
|
-
def take_action(
|
|
62
|
+
def take_action(
|
|
63
|
+
self, parsed_args: argparse.Namespace
|
|
64
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
60
65
|
if parsed_args.name:
|
|
61
66
|
if len(parsed_args.objects) > 1:
|
|
62
67
|
msg = _(
|
|
@@ -98,7 +103,7 @@ class CreateObject(command.Lister):
|
|
|
98
103
|
class DeleteObject(command.Command):
|
|
99
104
|
_description = _("Delete object from container")
|
|
100
105
|
|
|
101
|
-
def get_parser(self, prog_name):
|
|
106
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
102
107
|
parser = super().get_parser(prog_name)
|
|
103
108
|
parser.add_argument(
|
|
104
109
|
'container',
|
|
@@ -113,7 +118,7 @@ class DeleteObject(command.Command):
|
|
|
113
118
|
)
|
|
114
119
|
return parser
|
|
115
120
|
|
|
116
|
-
def take_action(self, parsed_args):
|
|
121
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
117
122
|
for obj in parsed_args.objects:
|
|
118
123
|
self.app.client_manager.object_store.object_delete(
|
|
119
124
|
container=parsed_args.container,
|
|
@@ -124,7 +129,7 @@ class DeleteObject(command.Command):
|
|
|
124
129
|
class ListObject(command.Lister):
|
|
125
130
|
_description = _("List objects")
|
|
126
131
|
|
|
127
|
-
def get_parser(self, prog_name):
|
|
132
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
128
133
|
parser = super().get_parser(prog_name)
|
|
129
134
|
parser.add_argument(
|
|
130
135
|
"container",
|
|
@@ -161,7 +166,9 @@ class ListObject(command.Lister):
|
|
|
161
166
|
)
|
|
162
167
|
return parser
|
|
163
168
|
|
|
164
|
-
def take_action(
|
|
169
|
+
def take_action(
|
|
170
|
+
self, parsed_args: argparse.Namespace
|
|
171
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
165
172
|
columns: tuple[str, ...] = ('Name',)
|
|
166
173
|
if parsed_args.long:
|
|
167
174
|
columns += ('Bytes', 'Hash', 'Content Type', 'Last Modified')
|
|
@@ -200,7 +207,7 @@ class ListObject(command.Lister):
|
|
|
200
207
|
class SaveObject(command.Command):
|
|
201
208
|
_description = _("Save object locally")
|
|
202
209
|
|
|
203
|
-
def get_parser(self, prog_name):
|
|
210
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
204
211
|
parser = super().get_parser(prog_name)
|
|
205
212
|
parser.add_argument(
|
|
206
213
|
"--file",
|
|
@@ -222,7 +229,7 @@ class SaveObject(command.Command):
|
|
|
222
229
|
)
|
|
223
230
|
return parser
|
|
224
231
|
|
|
225
|
-
def take_action(self, parsed_args):
|
|
232
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
226
233
|
self.app.client_manager.object_store.object_save(
|
|
227
234
|
container=parsed_args.container,
|
|
228
235
|
object=parsed_args.object,
|
|
@@ -233,7 +240,7 @@ class SaveObject(command.Command):
|
|
|
233
240
|
class SetObject(command.Command):
|
|
234
241
|
_description = _("Set object properties")
|
|
235
242
|
|
|
236
|
-
def get_parser(self, prog_name):
|
|
243
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
237
244
|
parser = super().get_parser(prog_name)
|
|
238
245
|
parser.add_argument(
|
|
239
246
|
'container',
|
|
@@ -257,7 +264,7 @@ class SetObject(command.Command):
|
|
|
257
264
|
)
|
|
258
265
|
return parser
|
|
259
266
|
|
|
260
|
-
def take_action(self, parsed_args):
|
|
267
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
261
268
|
self.app.client_manager.object_store.object_set(
|
|
262
269
|
parsed_args.container,
|
|
263
270
|
parsed_args.object,
|
|
@@ -268,7 +275,7 @@ class SetObject(command.Command):
|
|
|
268
275
|
class ShowObject(command.ShowOne):
|
|
269
276
|
_description = _("Display object details")
|
|
270
277
|
|
|
271
|
-
def get_parser(self, prog_name):
|
|
278
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
272
279
|
parser = super().get_parser(prog_name)
|
|
273
280
|
parser.add_argument(
|
|
274
281
|
'container',
|
|
@@ -282,7 +289,9 @@ class ShowObject(command.ShowOne):
|
|
|
282
289
|
)
|
|
283
290
|
return parser
|
|
284
291
|
|
|
285
|
-
def take_action(
|
|
292
|
+
def take_action(
|
|
293
|
+
self, parsed_args: argparse.Namespace
|
|
294
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
286
295
|
data = self.app.client_manager.object_store.object_show(
|
|
287
296
|
container=parsed_args.container,
|
|
288
297
|
object=parsed_args.object,
|
|
@@ -290,13 +299,14 @@ class ShowObject(command.ShowOne):
|
|
|
290
299
|
if 'properties' in data:
|
|
291
300
|
data['properties'] = format_columns.DictColumn(data['properties'])
|
|
292
301
|
|
|
293
|
-
|
|
302
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
303
|
+
return col_headers, col_data
|
|
294
304
|
|
|
295
305
|
|
|
296
306
|
class UnsetObject(command.Command):
|
|
297
307
|
_description = _("Unset object properties")
|
|
298
308
|
|
|
299
|
-
def get_parser(self, prog_name):
|
|
309
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
300
310
|
parser = super().get_parser(prog_name)
|
|
301
311
|
parser.add_argument(
|
|
302
312
|
'container',
|
|
@@ -321,7 +331,7 @@ class UnsetObject(command.Command):
|
|
|
321
331
|
)
|
|
322
332
|
return parser
|
|
323
333
|
|
|
324
|
-
def take_action(self, parsed_args):
|
|
334
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
325
335
|
self.app.client_manager.object_store.object_unset(
|
|
326
336
|
parsed_args.container,
|
|
327
337
|
parsed_args.object,
|
openstackclient/py.typed
ADDED
|
File without changes
|
openstackclient/shell.py
CHANGED
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
|
|
17
17
|
"""Command-line interface to the OpenStack APIs"""
|
|
18
18
|
|
|
19
|
+
import argparse
|
|
19
20
|
import sys
|
|
21
|
+
from typing import Any
|
|
20
22
|
import warnings
|
|
21
23
|
|
|
22
24
|
from osc_lib.api import auth
|
|
@@ -31,14 +33,16 @@ DEFAULT_DOMAIN = 'default'
|
|
|
31
33
|
# core OSC
|
|
32
34
|
IGNORED_MODULES = (
|
|
33
35
|
'neutron_taas.taas_client.osc',
|
|
36
|
+
'neutronclient.osc.v2.fwaas',
|
|
34
37
|
'neutronclient.osc.v2.taas',
|
|
38
|
+
'neutronclient.osc.v2.networking_bgpvpn',
|
|
35
39
|
)
|
|
36
40
|
|
|
37
41
|
|
|
38
42
|
class OpenStackShell(shell.OpenStackShell):
|
|
39
43
|
client_manager: clientmanager.ClientManager
|
|
40
44
|
|
|
41
|
-
def __init__(self):
|
|
45
|
+
def __init__(self) -> None:
|
|
42
46
|
command_manager = commandmanager.CommandManager(
|
|
43
47
|
'openstack.cli', ignored_modules=IGNORED_MODULES
|
|
44
48
|
)
|
|
@@ -59,7 +63,12 @@ class OpenStackShell(shell.OpenStackShell):
|
|
|
59
63
|
# about them
|
|
60
64
|
warnings.filterwarnings('ignore', module='openstack')
|
|
61
65
|
|
|
62
|
-
def build_option_parser(
|
|
66
|
+
def build_option_parser(
|
|
67
|
+
self,
|
|
68
|
+
description: str | None,
|
|
69
|
+
version: str | None,
|
|
70
|
+
argparse_kwargs: dict[str, Any] | None = None,
|
|
71
|
+
) -> argparse.ArgumentParser:
|
|
63
72
|
parser = super().build_option_parser(
|
|
64
73
|
description, version, argparse_kwargs
|
|
65
74
|
)
|
|
@@ -67,7 +76,7 @@ class OpenStackShell(shell.OpenStackShell):
|
|
|
67
76
|
parser = auth.build_auth_plugins_option_parser(parser)
|
|
68
77
|
return parser
|
|
69
78
|
|
|
70
|
-
def _final_defaults(self):
|
|
79
|
+
def _final_defaults(self) -> None:
|
|
71
80
|
super()._final_defaults()
|
|
72
81
|
|
|
73
82
|
# Set the default plugin to admin_token if endpoint and token are given
|
|
@@ -77,7 +86,7 @@ class OpenStackShell(shell.OpenStackShell):
|
|
|
77
86
|
else:
|
|
78
87
|
self._auth_type = 'password'
|
|
79
88
|
|
|
80
|
-
def _load_plugins(self):
|
|
89
|
+
def _load_plugins(self) -> None:
|
|
81
90
|
"""Load plugins via stevedore."""
|
|
82
91
|
# Loop through extensions to get API versions
|
|
83
92
|
for mod in clientmanager.PLUGIN_MODULES:
|
|
@@ -128,16 +137,43 @@ class OpenStackShell(shell.OpenStackShell):
|
|
|
128
137
|
},
|
|
129
138
|
)
|
|
130
139
|
|
|
131
|
-
#
|
|
132
|
-
|
|
133
|
-
|
|
140
|
+
# Build our command group which we expect to look like:
|
|
141
|
+
#
|
|
142
|
+
# openstack.<service>.vN
|
|
143
|
+
#
|
|
144
|
+
# Note that command groups deal only with major versions
|
|
145
|
+
cmd_group = '.'.join(
|
|
146
|
+
[
|
|
147
|
+
'openstack',
|
|
148
|
+
api.replace('-', '_'),
|
|
149
|
+
'v' + version_opt.replace('.', '_').split('_')[0],
|
|
150
|
+
]
|
|
151
|
+
)
|
|
134
152
|
self.command_manager.add_command_group(cmd_group)
|
|
135
153
|
self.log.debug(
|
|
136
154
|
'%(name)s API version %(version)s, cmd group %(group)s',
|
|
137
155
|
{'name': api, 'version': version_opt, 'group': cmd_group},
|
|
138
156
|
)
|
|
139
157
|
|
|
140
|
-
|
|
158
|
+
mod_extensions = getattr(mod, 'API_EXTENSIONS', None)
|
|
159
|
+
if not mod_extensions:
|
|
160
|
+
continue
|
|
161
|
+
|
|
162
|
+
for extension in mod_extensions:
|
|
163
|
+
extension_cmd_group = '.'.join([cmd_group, extension])
|
|
164
|
+
self.command_manager.add_command_group(extension_cmd_group)
|
|
165
|
+
self.log.debug(
|
|
166
|
+
'%(name)s API version %(version)s '
|
|
167
|
+
'(%(extension)s extension), cmd group %(group)s',
|
|
168
|
+
{
|
|
169
|
+
'name': api,
|
|
170
|
+
'version': version_opt,
|
|
171
|
+
'extension': extension,
|
|
172
|
+
'group': cmd_group,
|
|
173
|
+
},
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
def _load_commands(self) -> None:
|
|
141
177
|
"""Load commands via cliff/stevedore
|
|
142
178
|
|
|
143
179
|
osc-lib has no opinion on what commands should be loaded
|
|
@@ -157,7 +193,7 @@ class OpenStackShell(shell.OpenStackShell):
|
|
|
157
193
|
# }
|
|
158
194
|
self.command_manager.add_command_group('openstack.extension')
|
|
159
195
|
|
|
160
|
-
def initialize_app(self, argv):
|
|
196
|
+
def initialize_app(self, argv: list[str]) -> None:
|
|
161
197
|
super().initialize_app(argv)
|
|
162
198
|
|
|
163
199
|
# Re-create the client_manager with our subclass
|
|
@@ -168,7 +204,7 @@ class OpenStackShell(shell.OpenStackShell):
|
|
|
168
204
|
)
|
|
169
205
|
|
|
170
206
|
|
|
171
|
-
def main(argv=None):
|
|
207
|
+
def main(argv: list[str] | None = None) -> int:
|
|
172
208
|
if argv is None:
|
|
173
209
|
argv = sys.argv[1:]
|
|
174
210
|
|