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
|
@@ -16,9 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
"""Network segment action implementations"""
|
|
18
18
|
|
|
19
|
+
import argparse
|
|
20
|
+
from collections.abc import Iterable, Sequence
|
|
19
21
|
import itertools
|
|
20
22
|
import logging
|
|
21
|
-
|
|
23
|
+
from typing import Any
|
|
22
24
|
|
|
23
25
|
from osc_lib import exceptions
|
|
24
26
|
from osc_lib import utils
|
|
@@ -32,14 +34,14 @@ from openstackclient.network import common
|
|
|
32
34
|
LOG = logging.getLogger(__name__)
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
def _get_columns(item):
|
|
37
|
+
def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
36
38
|
hidden_columns = ['location', 'tenant_id']
|
|
37
39
|
return utils.get_osc_show_columns_for_sdk_resource(
|
|
38
40
|
item, {}, hidden_columns
|
|
39
41
|
)
|
|
40
42
|
|
|
41
43
|
|
|
42
|
-
def _get_ranges(item):
|
|
44
|
+
def _get_ranges(item: Any) -> Iterable[str]:
|
|
43
45
|
item = sorted([int(i) for i in item])
|
|
44
46
|
for a, b in itertools.groupby(enumerate(item), lambda xy: xy[1] - xy[0]):
|
|
45
47
|
c = list(b)
|
|
@@ -48,18 +50,24 @@ def _get_ranges(item):
|
|
|
48
50
|
)
|
|
49
51
|
|
|
50
52
|
|
|
51
|
-
def _hack_tuple_value_update_by_index(
|
|
53
|
+
def _hack_tuple_value_update_by_index(
|
|
54
|
+
tup: tuple[Any, ...], index: int, value: Any
|
|
55
|
+
) -> tuple[Any, ...]:
|
|
52
56
|
lot = list(tup)
|
|
53
57
|
lot[index] = value
|
|
54
58
|
return tuple(lot)
|
|
55
59
|
|
|
56
60
|
|
|
57
|
-
def _is_prop_empty(
|
|
61
|
+
def _is_prop_empty(
|
|
62
|
+
columns: tuple[str, ...], props: tuple[Any, ...], prop_name: str
|
|
63
|
+
) -> bool:
|
|
58
64
|
return True if not props[columns.index(prop_name)] else False
|
|
59
65
|
|
|
60
66
|
|
|
61
|
-
def _exchange_dict_keys_with_values(
|
|
62
|
-
|
|
67
|
+
def _exchange_dict_keys_with_values(
|
|
68
|
+
orig_dict: dict[Any, Any],
|
|
69
|
+
) -> dict[str, Any]:
|
|
70
|
+
updated_dict: dict[str, Any] = {}
|
|
63
71
|
for k, v in orig_dict.items():
|
|
64
72
|
k = [k]
|
|
65
73
|
if not updated_dict.get(v):
|
|
@@ -69,7 +77,9 @@ def _exchange_dict_keys_with_values(orig_dict):
|
|
|
69
77
|
return updated_dict
|
|
70
78
|
|
|
71
79
|
|
|
72
|
-
def _update_available_from_props(
|
|
80
|
+
def _update_available_from_props(
|
|
81
|
+
columns: tuple[str, ...], props: tuple[Any, ...]
|
|
82
|
+
) -> tuple[Any, ...]:
|
|
73
83
|
index_available = columns.index('available')
|
|
74
84
|
props = _hack_tuple_value_update_by_index(
|
|
75
85
|
props, index_available, list(_get_ranges(props[index_available]))
|
|
@@ -77,7 +87,9 @@ def _update_available_from_props(columns, props):
|
|
|
77
87
|
return props
|
|
78
88
|
|
|
79
89
|
|
|
80
|
-
def _update_used_from_props(
|
|
90
|
+
def _update_used_from_props(
|
|
91
|
+
columns: tuple[str, ...], props: tuple[Any, ...]
|
|
92
|
+
) -> tuple[Any, ...]:
|
|
81
93
|
index_used = columns.index('used')
|
|
82
94
|
updated_used = _exchange_dict_keys_with_values(props[index_used])
|
|
83
95
|
for k, v in updated_used.items():
|
|
@@ -86,7 +98,9 @@ def _update_used_from_props(columns, props):
|
|
|
86
98
|
return props
|
|
87
99
|
|
|
88
100
|
|
|
89
|
-
def _update_additional_fields_from_props(
|
|
101
|
+
def _update_additional_fields_from_props(
|
|
102
|
+
columns: tuple[str, ...], props: tuple[Any, ...]
|
|
103
|
+
) -> tuple[Any, ...]:
|
|
90
104
|
props = _update_available_from_props(columns, props)
|
|
91
105
|
props = _update_used_from_props(columns, props)
|
|
92
106
|
return props
|
|
@@ -97,7 +111,7 @@ class CreateNetworkSegmentRange(
|
|
|
97
111
|
):
|
|
98
112
|
_description = _("Create new network segment range")
|
|
99
113
|
|
|
100
|
-
def get_parser(self, prog_name):
|
|
114
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
101
115
|
parser = super().get_parser(prog_name)
|
|
102
116
|
shared_group = parser.add_mutually_exclusive_group()
|
|
103
117
|
shared_group.add_argument(
|
|
@@ -170,7 +184,9 @@ class CreateNetworkSegmentRange(
|
|
|
170
184
|
|
|
171
185
|
return parser
|
|
172
186
|
|
|
173
|
-
def take_action(
|
|
187
|
+
def take_action(
|
|
188
|
+
self, parsed_args: argparse.Namespace
|
|
189
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
174
190
|
network_client = self.app.client_manager.network
|
|
175
191
|
try:
|
|
176
192
|
# Verify that the extension exists.
|
|
@@ -251,7 +267,7 @@ class CreateNetworkSegmentRange(
|
|
|
251
267
|
class DeleteNetworkSegmentRange(command.Command):
|
|
252
268
|
_description = _("Delete network segment range(s)")
|
|
253
269
|
|
|
254
|
-
def get_parser(self, prog_name):
|
|
270
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
255
271
|
parser = super().get_parser(prog_name)
|
|
256
272
|
parser.add_argument(
|
|
257
273
|
'network_segment_range',
|
|
@@ -261,7 +277,7 @@ class DeleteNetworkSegmentRange(command.Command):
|
|
|
261
277
|
)
|
|
262
278
|
return parser
|
|
263
279
|
|
|
264
|
-
def take_action(self, parsed_args):
|
|
280
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
265
281
|
network_client = self.app.client_manager.network
|
|
266
282
|
try:
|
|
267
283
|
# Verify that the extension exists.
|
|
@@ -304,7 +320,7 @@ class DeleteNetworkSegmentRange(command.Command):
|
|
|
304
320
|
class ListNetworkSegmentRange(command.Lister):
|
|
305
321
|
_description = _("List network segment ranges")
|
|
306
322
|
|
|
307
|
-
def get_parser(self, prog_name):
|
|
323
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
308
324
|
parser = super().get_parser(prog_name)
|
|
309
325
|
parser.add_argument(
|
|
310
326
|
'--long',
|
|
@@ -344,7 +360,9 @@ class ListNetworkSegmentRange(command.Lister):
|
|
|
344
360
|
)
|
|
345
361
|
return parser
|
|
346
362
|
|
|
347
|
-
def take_action(
|
|
363
|
+
def take_action(
|
|
364
|
+
self, parsed_args: argparse.Namespace
|
|
365
|
+
) -> tuple[tuple[str, ...], tuple[Any, ...]]:
|
|
348
366
|
network_client = self.app.client_manager.network
|
|
349
367
|
try:
|
|
350
368
|
# Verify that the extension exists.
|
|
@@ -402,18 +420,25 @@ class ListNetworkSegmentRange(command.Lister):
|
|
|
402
420
|
'available',
|
|
403
421
|
)
|
|
404
422
|
|
|
405
|
-
display_props: tuple[
|
|
423
|
+
display_props: tuple[Any, ...] = tuple()
|
|
406
424
|
for s in data:
|
|
407
425
|
props = utils.get_item_properties(s, columns)
|
|
408
426
|
if (
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
or
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
427
|
+
(
|
|
428
|
+
parsed_args.available
|
|
429
|
+
and _is_prop_empty(columns, props, 'available')
|
|
430
|
+
)
|
|
431
|
+
or (
|
|
432
|
+
parsed_args.unavailable
|
|
433
|
+
and not _is_prop_empty(columns, props, 'available')
|
|
434
|
+
)
|
|
435
|
+
or (
|
|
436
|
+
parsed_args.used and _is_prop_empty(columns, props, 'used')
|
|
437
|
+
)
|
|
438
|
+
or (
|
|
439
|
+
parsed_args.unused
|
|
440
|
+
and not _is_prop_empty(columns, props, 'used')
|
|
441
|
+
)
|
|
417
442
|
):
|
|
418
443
|
continue
|
|
419
444
|
if parsed_args.long:
|
|
@@ -426,7 +451,7 @@ class ListNetworkSegmentRange(command.Lister):
|
|
|
426
451
|
class SetNetworkSegmentRange(common.NeutronCommandWithExtraArgs):
|
|
427
452
|
_description = _("Set network segment range properties")
|
|
428
453
|
|
|
429
|
-
def get_parser(self, prog_name):
|
|
454
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
430
455
|
parser = super().get_parser(prog_name)
|
|
431
456
|
parser.add_argument(
|
|
432
457
|
'network_segment_range',
|
|
@@ -452,7 +477,7 @@ class SetNetworkSegmentRange(common.NeutronCommandWithExtraArgs):
|
|
|
452
477
|
)
|
|
453
478
|
return parser
|
|
454
479
|
|
|
455
|
-
def take_action(self, parsed_args):
|
|
480
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
456
481
|
network_client = self.app.client_manager.network
|
|
457
482
|
try:
|
|
458
483
|
# Verify that the extension exists.
|
|
@@ -490,7 +515,7 @@ class SetNetworkSegmentRange(common.NeutronCommandWithExtraArgs):
|
|
|
490
515
|
class ShowNetworkSegmentRange(command.ShowOne):
|
|
491
516
|
_description = _("Display network segment range details")
|
|
492
517
|
|
|
493
|
-
def get_parser(self, prog_name):
|
|
518
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
494
519
|
parser = super().get_parser(prog_name)
|
|
495
520
|
parser.add_argument(
|
|
496
521
|
'network_segment_range',
|
|
@@ -499,7 +524,9 @@ class ShowNetworkSegmentRange(command.ShowOne):
|
|
|
499
524
|
)
|
|
500
525
|
return parser
|
|
501
526
|
|
|
502
|
-
def take_action(
|
|
527
|
+
def take_action(
|
|
528
|
+
self, parsed_args: argparse.Namespace
|
|
529
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
503
530
|
network_client = self.app.client_manager.network
|
|
504
531
|
try:
|
|
505
532
|
# Verify that the extension exists.
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
|
|
14
14
|
"""Network Service Providers Implementation"""
|
|
15
15
|
|
|
16
|
+
import argparse
|
|
17
|
+
from collections.abc import Iterable
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
16
20
|
from osc_lib import utils
|
|
17
21
|
|
|
18
22
|
from openstackclient import command
|
|
@@ -22,7 +26,9 @@ from openstackclient.i18n import _
|
|
|
22
26
|
class ListNetworkServiceProvider(command.Lister):
|
|
23
27
|
_description = _("List Service Providers")
|
|
24
28
|
|
|
25
|
-
def take_action(
|
|
29
|
+
def take_action(
|
|
30
|
+
self, parsed_args: argparse.Namespace
|
|
31
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
26
32
|
client = self.app.client_manager.network
|
|
27
33
|
|
|
28
34
|
columns = (
|
|
@@ -16,8 +16,10 @@
|
|
|
16
16
|
|
|
17
17
|
"""Network trunk and subports action implementations"""
|
|
18
18
|
|
|
19
|
+
import argparse
|
|
20
|
+
from collections.abc import Iterable, Sequence
|
|
19
21
|
import logging
|
|
20
|
-
|
|
22
|
+
from typing import Any
|
|
21
23
|
|
|
22
24
|
from cliff import columns as cliff_columns
|
|
23
25
|
from osc_lib.cli import format_columns
|
|
@@ -37,14 +39,14 @@ SUB_PORTS = 'sub_ports'
|
|
|
37
39
|
|
|
38
40
|
|
|
39
41
|
class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
|
|
40
|
-
def human_readable(self):
|
|
42
|
+
def human_readable(self) -> str:
|
|
41
43
|
return 'UP' if self._value else 'DOWN'
|
|
42
44
|
|
|
43
45
|
|
|
44
46
|
class CreateNetworkTrunk(command.ShowOne):
|
|
45
47
|
"""Create a network trunk for a given project"""
|
|
46
48
|
|
|
47
|
-
def get_parser(self, prog_name):
|
|
49
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
48
50
|
parser = super().get_parser(prog_name)
|
|
49
51
|
parser.add_argument(
|
|
50
52
|
'name', metavar='<name>', help=_("Name of the trunk to create")
|
|
@@ -87,7 +89,9 @@ class CreateNetworkTrunk(command.ShowOne):
|
|
|
87
89
|
identity_utils.add_project_owner_option_to_parser(parser)
|
|
88
90
|
return parser
|
|
89
91
|
|
|
90
|
-
def take_action(
|
|
92
|
+
def take_action(
|
|
93
|
+
self, parsed_args: argparse.Namespace
|
|
94
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
91
95
|
network_client = self.app.client_manager.network
|
|
92
96
|
identity_client = self.app.client_manager.identity
|
|
93
97
|
attrs = _get_attrs_for_trunk(
|
|
@@ -104,7 +108,7 @@ class CreateNetworkTrunk(command.ShowOne):
|
|
|
104
108
|
class DeleteNetworkTrunk(command.Command):
|
|
105
109
|
"""Delete a given network trunk"""
|
|
106
110
|
|
|
107
|
-
def get_parser(self, prog_name):
|
|
111
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
108
112
|
parser = super().get_parser(prog_name)
|
|
109
113
|
parser.add_argument(
|
|
110
114
|
'trunk',
|
|
@@ -114,7 +118,7 @@ class DeleteNetworkTrunk(command.Command):
|
|
|
114
118
|
)
|
|
115
119
|
return parser
|
|
116
120
|
|
|
117
|
-
def take_action(self, parsed_args):
|
|
121
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
118
122
|
network_client = self.app.client_manager.network
|
|
119
123
|
result = 0
|
|
120
124
|
for trunk in parsed_args.trunk:
|
|
@@ -145,7 +149,7 @@ class DeleteNetworkTrunk(command.Command):
|
|
|
145
149
|
class ListNetworkTrunk(command.Lister):
|
|
146
150
|
"""List all network trunks"""
|
|
147
151
|
|
|
148
|
-
def get_parser(self, prog_name):
|
|
152
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
149
153
|
parser = super().get_parser(prog_name)
|
|
150
154
|
parser.add_argument(
|
|
151
155
|
'--long',
|
|
@@ -155,7 +159,9 @@ class ListNetworkTrunk(command.Lister):
|
|
|
155
159
|
)
|
|
156
160
|
return parser
|
|
157
161
|
|
|
158
|
-
def take_action(
|
|
162
|
+
def take_action(
|
|
163
|
+
self, parsed_args: argparse.Namespace
|
|
164
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
159
165
|
network_client = self.app.client_manager.network
|
|
160
166
|
data = network_client.trunks()
|
|
161
167
|
headers: tuple[str, ...] = ('ID', 'Name', 'Parent Port', 'Description')
|
|
@@ -184,7 +190,7 @@ class ListNetworkTrunk(command.Lister):
|
|
|
184
190
|
class SetNetworkTrunk(command.Command):
|
|
185
191
|
"""Set network trunk properties"""
|
|
186
192
|
|
|
187
|
-
def get_parser(self, prog_name):
|
|
193
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
188
194
|
parser = super().get_parser(prog_name)
|
|
189
195
|
parser.add_argument(
|
|
190
196
|
'trunk', metavar="<trunk>", help=_("Trunk to modify (name or ID)")
|
|
@@ -220,7 +226,7 @@ class SetNetworkTrunk(command.Command):
|
|
|
220
226
|
)
|
|
221
227
|
return parser
|
|
222
228
|
|
|
223
|
-
def take_action(self, parsed_args):
|
|
229
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
224
230
|
network_client = self.app.client_manager.network
|
|
225
231
|
identity_client = self.app.client_manager.identity
|
|
226
232
|
trunk_id = network_client.find_trunk(
|
|
@@ -255,14 +261,16 @@ class SetNetworkTrunk(command.Command):
|
|
|
255
261
|
class ShowNetworkTrunk(command.ShowOne):
|
|
256
262
|
"""Show information of a given network trunk"""
|
|
257
263
|
|
|
258
|
-
def get_parser(self, prog_name):
|
|
264
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
259
265
|
parser = super().get_parser(prog_name)
|
|
260
266
|
parser.add_argument(
|
|
261
267
|
'trunk', metavar="<trunk>", help=_("Trunk to display (name or ID)")
|
|
262
268
|
)
|
|
263
269
|
return parser
|
|
264
270
|
|
|
265
|
-
def take_action(
|
|
271
|
+
def take_action(
|
|
272
|
+
self, parsed_args: argparse.Namespace
|
|
273
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
266
274
|
network_client = self.app.client_manager.network
|
|
267
275
|
trunk_id = network_client.find_trunk(
|
|
268
276
|
parsed_args.trunk,
|
|
@@ -279,7 +287,7 @@ class ShowNetworkTrunk(command.ShowOne):
|
|
|
279
287
|
class ListNetworkSubport(command.Lister):
|
|
280
288
|
"""List all subports for a given network trunk"""
|
|
281
289
|
|
|
282
|
-
def get_parser(self, prog_name):
|
|
290
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
283
291
|
parser = super().get_parser(prog_name)
|
|
284
292
|
parser.add_argument(
|
|
285
293
|
'--trunk',
|
|
@@ -289,7 +297,9 @@ class ListNetworkSubport(command.Lister):
|
|
|
289
297
|
)
|
|
290
298
|
return parser
|
|
291
299
|
|
|
292
|
-
def take_action(
|
|
300
|
+
def take_action(
|
|
301
|
+
self, parsed_args: argparse.Namespace
|
|
302
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
293
303
|
network_client = self.app.client_manager.network
|
|
294
304
|
trunk_id = network_client.find_trunk(
|
|
295
305
|
parsed_args.trunk,
|
|
@@ -321,7 +331,7 @@ class ListNetworkSubport(command.Lister):
|
|
|
321
331
|
class UnsetNetworkTrunk(command.Command):
|
|
322
332
|
"""Unset subports from a given network trunk"""
|
|
323
333
|
|
|
324
|
-
def get_parser(self, prog_name):
|
|
334
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
325
335
|
parser = super().get_parser(prog_name)
|
|
326
336
|
parser.add_argument(
|
|
327
337
|
'trunk',
|
|
@@ -341,7 +351,7 @@ class UnsetNetworkTrunk(command.Command):
|
|
|
341
351
|
)
|
|
342
352
|
return parser
|
|
343
353
|
|
|
344
|
-
def take_action(self, parsed_args):
|
|
354
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
345
355
|
network_client = self.app.client_manager.network
|
|
346
356
|
attrs = _get_attrs_for_subports(network_client, parsed_args)
|
|
347
357
|
trunk_id = network_client.find_trunk(
|
|
@@ -357,15 +367,17 @@ _formatters = {
|
|
|
357
367
|
}
|
|
358
368
|
|
|
359
369
|
|
|
360
|
-
def _get_columns(item):
|
|
370
|
+
def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
361
371
|
hidden_columns = ['location', 'tenant_id']
|
|
362
372
|
return osc_utils.get_osc_show_columns_for_sdk_resource(
|
|
363
373
|
item, {}, hidden_columns
|
|
364
374
|
)
|
|
365
375
|
|
|
366
376
|
|
|
367
|
-
def _get_attrs_for_trunk(
|
|
368
|
-
|
|
377
|
+
def _get_attrs_for_trunk(
|
|
378
|
+
network_client: Any, identity_client: Any, parsed_args: argparse.Namespace
|
|
379
|
+
) -> dict[str, Any]:
|
|
380
|
+
attrs: dict[str, Any] = {}
|
|
369
381
|
if parsed_args.name is not None:
|
|
370
382
|
attrs['name'] = str(parsed_args.name)
|
|
371
383
|
if parsed_args.description is not None:
|
|
@@ -392,12 +404,14 @@ def _get_attrs_for_trunk(network_client, identity_client, parsed_args):
|
|
|
392
404
|
parsed_args.project,
|
|
393
405
|
parsed_args.project_domain,
|
|
394
406
|
).id
|
|
395
|
-
attrs['
|
|
407
|
+
attrs['project_id'] = project_id
|
|
396
408
|
|
|
397
409
|
return attrs
|
|
398
410
|
|
|
399
411
|
|
|
400
|
-
def _format_subports(
|
|
412
|
+
def _format_subports(
|
|
413
|
+
network_client: Any, subports: list[dict[str, Any]]
|
|
414
|
+
) -> list[dict[str, Any]]:
|
|
401
415
|
attrs = []
|
|
402
416
|
for subport in subports:
|
|
403
417
|
subport_attrs = {}
|
|
@@ -424,7 +438,9 @@ def _format_subports(network_client, subports):
|
|
|
424
438
|
return attrs
|
|
425
439
|
|
|
426
440
|
|
|
427
|
-
def _get_attrs_for_subports(
|
|
441
|
+
def _get_attrs_for_subports(
|
|
442
|
+
network_client: Any, parsed_args: argparse.Namespace
|
|
443
|
+
) -> list[dict[str, Any]]:
|
|
428
444
|
attrs = []
|
|
429
445
|
if 'set_subports' in parsed_args and parsed_args.set_subports is not None:
|
|
430
446
|
attrs = _format_subports(network_client, parsed_args.set_subports)
|
|
@@ -14,10 +14,11 @@
|
|
|
14
14
|
"""Port action implementations"""
|
|
15
15
|
|
|
16
16
|
import argparse
|
|
17
|
+
from collections.abc import Iterable, Sequence
|
|
17
18
|
import copy
|
|
18
19
|
import json
|
|
19
20
|
import logging
|
|
20
|
-
|
|
21
|
+
from typing import Any
|
|
21
22
|
|
|
22
23
|
from cliff import columns as cliff_columns
|
|
23
24
|
from osc_lib.cli import format_columns
|
|
@@ -35,22 +36,22 @@ LOG = logging.getLogger(__name__)
|
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
|
|
38
|
-
def human_readable(self):
|
|
39
|
+
def human_readable(self) -> str:
|
|
39
40
|
return 'UP' if self._value else 'DOWN'
|
|
40
41
|
|
|
41
42
|
|
|
42
43
|
class SubPortColumn(format_columns.ListDictColumn):
|
|
43
|
-
_value:
|
|
44
|
+
_value: Any
|
|
44
45
|
|
|
45
|
-
def _retrieve_subports(self):
|
|
46
|
+
def _retrieve_subports(self) -> None:
|
|
46
47
|
if isinstance(self._value, dict):
|
|
47
48
|
self._value = self._value['sub_ports']
|
|
48
49
|
|
|
49
|
-
def human_readable(self):
|
|
50
|
+
def human_readable(self) -> str:
|
|
50
51
|
self._retrieve_subports()
|
|
51
52
|
return super().human_readable()
|
|
52
53
|
|
|
53
|
-
def machine_readable(self):
|
|
54
|
+
def machine_readable(self) -> Any:
|
|
54
55
|
self._retrieve_subports()
|
|
55
56
|
return super().machine_readable()
|
|
56
57
|
|
|
@@ -73,7 +74,7 @@ _list_formatters = copy.deepcopy(_formatters)
|
|
|
73
74
|
_list_formatters.update({'trunk_details': SubPortColumn})
|
|
74
75
|
|
|
75
76
|
|
|
76
|
-
def _get_columns(item):
|
|
77
|
+
def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
77
78
|
column_data_mapping = {
|
|
78
79
|
'admin_state_up': 'is_admin_state_up',
|
|
79
80
|
'allowed_address_pairs': 'allowed_address_pairs',
|
|
@@ -127,7 +128,13 @@ class JSONKeyValueAction(argparse.Action):
|
|
|
127
128
|
Ensures that ``dest`` is a dict
|
|
128
129
|
"""
|
|
129
130
|
|
|
130
|
-
def __call__(
|
|
131
|
+
def __call__(
|
|
132
|
+
self,
|
|
133
|
+
parser: argparse.ArgumentParser,
|
|
134
|
+
namespace: argparse.Namespace,
|
|
135
|
+
values: Any,
|
|
136
|
+
option_string: str | None = None,
|
|
137
|
+
) -> None:
|
|
131
138
|
# Make sure we have an empty dict rather than None
|
|
132
139
|
if getattr(namespace, self.dest, None) is None:
|
|
133
140
|
setattr(namespace, self.dest, {})
|
|
@@ -148,8 +155,10 @@ class JSONKeyValueAction(argparse.Action):
|
|
|
148
155
|
raise argparse.ArgumentError(self, msg)
|
|
149
156
|
|
|
150
157
|
|
|
151
|
-
def _get_attrs(
|
|
152
|
-
|
|
158
|
+
def _get_attrs(
|
|
159
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
160
|
+
) -> dict[str, Any]:
|
|
161
|
+
attrs: dict[str, Any] = {}
|
|
153
162
|
|
|
154
163
|
if parsed_args.description is not None:
|
|
155
164
|
attrs['description'] = parsed_args.description
|
|
@@ -250,7 +259,9 @@ def _get_attrs(client_manager, parsed_args):
|
|
|
250
259
|
return attrs
|
|
251
260
|
|
|
252
261
|
|
|
253
|
-
def _prepare_fixed_ips(
|
|
262
|
+
def _prepare_fixed_ips(
|
|
263
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
264
|
+
) -> None:
|
|
254
265
|
"""Fix and properly format fixed_ip option.
|
|
255
266
|
|
|
256
267
|
Appropriately convert any subnet names to their respective ids.
|
|
@@ -281,7 +292,9 @@ def _prepare_fixed_ips(client_manager, parsed_args):
|
|
|
281
292
|
parsed_args.fixed_ip = ips
|
|
282
293
|
|
|
283
294
|
|
|
284
|
-
def _prepare_filter_fixed_ips(
|
|
295
|
+
def _prepare_filter_fixed_ips(
|
|
296
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
297
|
+
) -> list[str]:
|
|
285
298
|
"""Fix and properly format fixed_ip option for filtering.
|
|
286
299
|
|
|
287
300
|
Appropriately convert any subnet names to their respective ids.
|
|
@@ -308,7 +321,9 @@ def _prepare_filter_fixed_ips(client_manager, parsed_args):
|
|
|
308
321
|
return ips
|
|
309
322
|
|
|
310
323
|
|
|
311
|
-
def _add_updatable_args(
|
|
324
|
+
def _add_updatable_args(
|
|
325
|
+
parser: argparse.ArgumentParser, create: bool = False
|
|
326
|
+
) -> None:
|
|
312
327
|
parser.add_argument(
|
|
313
328
|
'--description',
|
|
314
329
|
metavar='<description>',
|
|
@@ -434,7 +449,9 @@ def _add_updatable_args(parser, create=False):
|
|
|
434
449
|
|
|
435
450
|
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
|
|
436
451
|
# OSC minimum requirements include SDK 1.0.
|
|
437
|
-
def _convert_address_pairs(
|
|
452
|
+
def _convert_address_pairs(
|
|
453
|
+
parsed_args: argparse.Namespace,
|
|
454
|
+
) -> list[dict[str, Any]]:
|
|
438
455
|
ops = []
|
|
439
456
|
for opt in parsed_args.allowed_address_pairs:
|
|
440
457
|
addr = {}
|
|
@@ -445,7 +462,9 @@ def _convert_address_pairs(parsed_args):
|
|
|
445
462
|
return ops
|
|
446
463
|
|
|
447
464
|
|
|
448
|
-
def _convert_extra_dhcp_options(
|
|
465
|
+
def _convert_extra_dhcp_options(
|
|
466
|
+
parsed_args: argparse.Namespace,
|
|
467
|
+
) -> list[dict[str, Any]]:
|
|
449
468
|
dhcp_options = []
|
|
450
469
|
for opt in parsed_args.extra_dhcp_options:
|
|
451
470
|
option = {}
|
|
@@ -460,7 +479,7 @@ def _convert_extra_dhcp_options(parsed_args):
|
|
|
460
479
|
|
|
461
480
|
# When we have multiple hints, we'll need to refactor this to allow
|
|
462
481
|
# arbitrary combinations. But until then let's have it as simple as possible.
|
|
463
|
-
def _validate_port_hints(hints):
|
|
482
|
+
def _validate_port_hints(hints: dict[str, Any]) -> None:
|
|
464
483
|
if hints not in (
|
|
465
484
|
{},
|
|
466
485
|
# by hint alias
|
|
@@ -477,7 +496,7 @@ def _validate_port_hints(hints):
|
|
|
477
496
|
# When we have multiple hints, we'll need to refactor this to expand aliases
|
|
478
497
|
# without losing other hints. But until then let's have it as simple as
|
|
479
498
|
# possible.
|
|
480
|
-
def _expand_port_hint_aliases(hints):
|
|
499
|
+
def _expand_port_hint_aliases(hints: dict[str, Any]) -> dict[str, Any]:
|
|
481
500
|
if hints == {'ovs-tx-steering': 'thread'}:
|
|
482
501
|
return {'openvswitch': {'other_config': {'tx-steering': 'thread'}}}
|
|
483
502
|
elif hints == {'ovs-tx-steering': 'hash'}:
|
|
@@ -489,7 +508,7 @@ def _expand_port_hint_aliases(hints):
|
|
|
489
508
|
class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
490
509
|
_description = _("Create a new port")
|
|
491
510
|
|
|
492
|
-
def get_parser(self, prog_name):
|
|
511
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
493
512
|
parser = super().get_parser(prog_name)
|
|
494
513
|
|
|
495
514
|
parser.add_argument(
|
|
@@ -635,7 +654,9 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
635
654
|
_tag.add_tag_option_to_parser_for_create(parser, _('port'))
|
|
636
655
|
return parser
|
|
637
656
|
|
|
638
|
-
def take_action(
|
|
657
|
+
def take_action(
|
|
658
|
+
self, parsed_args: argparse.Namespace
|
|
659
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
639
660
|
network_client = self.app.client_manager.network
|
|
640
661
|
network = network_client.find_network(
|
|
641
662
|
parsed_args.network, ignore_missing=False
|
|
@@ -727,7 +748,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
727
748
|
class DeletePort(command.Command):
|
|
728
749
|
_description = _("Delete port(s)")
|
|
729
750
|
|
|
730
|
-
def get_parser(self, prog_name):
|
|
751
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
731
752
|
parser = super().get_parser(prog_name)
|
|
732
753
|
parser.add_argument(
|
|
733
754
|
'port',
|
|
@@ -737,7 +758,7 @@ class DeletePort(command.Command):
|
|
|
737
758
|
)
|
|
738
759
|
return parser
|
|
739
760
|
|
|
740
|
-
def take_action(self, parsed_args):
|
|
761
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
741
762
|
client = self.app.client_manager.network
|
|
742
763
|
result = 0
|
|
743
764
|
|
|
@@ -769,7 +790,7 @@ class DeletePort(command.Command):
|
|
|
769
790
|
class ListPort(command.Lister):
|
|
770
791
|
_description = _("List ports")
|
|
771
792
|
|
|
772
|
-
def get_parser(self, prog_name):
|
|
793
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
773
794
|
parser = super().get_parser(prog_name)
|
|
774
795
|
parser.add_argument(
|
|
775
796
|
'--device-owner',
|
|
@@ -867,7 +888,9 @@ class ListPort(command.Lister):
|
|
|
867
888
|
_tag.add_tag_filtering_option_to_parser(parser, _('ports'))
|
|
868
889
|
return parser
|
|
869
890
|
|
|
870
|
-
def take_action(
|
|
891
|
+
def take_action(
|
|
892
|
+
self, parsed_args: argparse.Namespace
|
|
893
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
871
894
|
network_client = self.app.client_manager.network
|
|
872
895
|
identity_client = self.app.client_manager.identity
|
|
873
896
|
|
|
@@ -966,7 +989,7 @@ class ListPort(command.Lister):
|
|
|
966
989
|
class SetPort(common.NeutronCommandWithExtraArgs):
|
|
967
990
|
_description = _("Set port properties")
|
|
968
991
|
|
|
969
|
-
def get_parser(self, prog_name):
|
|
992
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
970
993
|
parser = super().get_parser(prog_name)
|
|
971
994
|
_add_updatable_args(parser)
|
|
972
995
|
admin_group = parser.add_mutually_exclusive_group()
|
|
@@ -1120,7 +1143,7 @@ class SetPort(common.NeutronCommandWithExtraArgs):
|
|
|
1120
1143
|
|
|
1121
1144
|
return parser
|
|
1122
1145
|
|
|
1123
|
-
def take_action(self, parsed_args):
|
|
1146
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
1124
1147
|
client = self.app.client_manager.network
|
|
1125
1148
|
|
|
1126
1149
|
_prepare_fixed_ips(self.app.client_manager, parsed_args)
|
|
@@ -1222,14 +1245,16 @@ class SetPort(common.NeutronCommandWithExtraArgs):
|
|
|
1222
1245
|
class ShowPort(command.ShowOne):
|
|
1223
1246
|
_description = _("Display port details")
|
|
1224
1247
|
|
|
1225
|
-
def get_parser(self, prog_name):
|
|
1248
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1226
1249
|
parser = super().get_parser(prog_name)
|
|
1227
1250
|
parser.add_argument(
|
|
1228
1251
|
'port', metavar="<port>", help=_("Port to display (name or ID)")
|
|
1229
1252
|
)
|
|
1230
1253
|
return parser
|
|
1231
1254
|
|
|
1232
|
-
def take_action(
|
|
1255
|
+
def take_action(
|
|
1256
|
+
self, parsed_args: argparse.Namespace
|
|
1257
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
1233
1258
|
client = self.app.client_manager.network
|
|
1234
1259
|
obj = client.find_port(parsed_args.port, ignore_missing=False)
|
|
1235
1260
|
display_columns, columns = _get_columns(obj)
|
|
@@ -1242,7 +1267,7 @@ class ShowPort(command.ShowOne):
|
|
|
1242
1267
|
class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
|
|
1243
1268
|
_description = _("Unset port properties")
|
|
1244
1269
|
|
|
1245
|
-
def get_parser(self, prog_name):
|
|
1270
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1246
1271
|
parser = super().get_parser(prog_name)
|
|
1247
1272
|
parser.add_argument(
|
|
1248
1273
|
'--fixed-ip',
|
|
@@ -1339,7 +1364,7 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
|
|
|
1339
1364
|
|
|
1340
1365
|
return parser
|
|
1341
1366
|
|
|
1342
|
-
def take_action(self, parsed_args):
|
|
1367
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
1343
1368
|
client = self.app.client_manager.network
|
|
1344
1369
|
obj = client.find_port(parsed_args.port, ignore_missing=False)
|
|
1345
1370
|
# SDK ignores update() if it receives a modified obj and attrs
|