python-openstackclient 9.0.0__py3-none-any.whl → 10.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openstackclient/__init__.py +2 -6
- openstackclient/api/api.py +41 -23
- openstackclient/api/compute_v2.py +44 -25
- openstackclient/api/object_store_v1.py +75 -97
- openstackclient/api/volume_v2.py +2 -1
- openstackclient/api/volume_v3.py +2 -1
- openstackclient/common/availability_zone.py +58 -42
- openstackclient/common/clientmanager.py +56 -29
- openstackclient/common/configuration.py +10 -3
- openstackclient/common/envvars.py +2 -2
- openstackclient/common/extension.py +14 -5
- openstackclient/common/limits.py +10 -5
- openstackclient/common/module.py +14 -6
- openstackclient/common/pagination.py +8 -2
- openstackclient/common/progressbar.py +7 -6
- openstackclient/common/project_cleanup.py +13 -7
- openstackclient/common/quota.py +97 -99
- openstackclient/common/versions.py +8 -2
- openstackclient/compute/client.py +7 -3
- openstackclient/compute/v2/agent.py +17 -10
- openstackclient/compute/v2/aggregate.py +36 -22
- openstackclient/compute/v2/console.py +14 -8
- openstackclient/compute/v2/console_connection.py +11 -3
- openstackclient/compute/v2/flavor.py +39 -21
- openstackclient/compute/v2/host.py +14 -6
- openstackclient/compute/v2/hypervisor.py +14 -5
- openstackclient/compute/v2/hypervisor_stats.py +10 -2
- openstackclient/compute/v2/keypair.py +29 -14
- openstackclient/compute/v2/server.py +249 -169
- openstackclient/compute/v2/server_backup.py +10 -4
- openstackclient/compute/v2/server_event.py +21 -12
- openstackclient/compute/v2/server_group.py +21 -11
- openstackclient/compute/v2/server_image.py +19 -10
- openstackclient/compute/v2/server_migration.py +24 -10
- openstackclient/compute/v2/server_share.py +274 -0
- openstackclient/compute/v2/server_volume.py +10 -4
- openstackclient/compute/v2/service.py +14 -7
- openstackclient/compute/v2/usage.py +26 -21
- openstackclient/identity/client.py +8 -3
- openstackclient/identity/common.py +78 -47
- openstackclient/identity/v2_0/catalog.py +14 -7
- openstackclient/identity/v2_0/ec2creds.py +21 -10
- openstackclient/identity/v2_0/endpoint.py +23 -11
- openstackclient/identity/v2_0/project.py +25 -14
- openstackclient/identity/v2_0/role.py +28 -14
- openstackclient/identity/v2_0/role_assignment.py +9 -3
- openstackclient/identity/v2_0/service.py +23 -11
- openstackclient/identity/v2_0/token.py +12 -5
- openstackclient/identity/v2_0/user.py +26 -15
- openstackclient/identity/v3/access_rule.py +26 -12
- openstackclient/identity/v3/application_credential.py +59 -24
- openstackclient/identity/v3/catalog.py +14 -7
- openstackclient/identity/v3/consumer.py +22 -11
- openstackclient/identity/v3/credential.py +36 -16
- openstackclient/identity/v3/domain.py +37 -18
- openstackclient/identity/v3/ec2creds.py +25 -12
- openstackclient/identity/v3/endpoint.py +42 -20
- openstackclient/identity/v3/endpoint_group.py +28 -17
- openstackclient/identity/v3/federation_protocol.py +38 -16
- openstackclient/identity/v3/group.py +55 -32
- openstackclient/identity/v3/identity_provider.py +92 -57
- openstackclient/identity/v3/implied_role.py +21 -9
- openstackclient/identity/v3/limit.py +38 -16
- openstackclient/identity/v3/mapping.py +26 -13
- openstackclient/identity/v3/policy.py +23 -12
- openstackclient/identity/v3/project.py +43 -23
- openstackclient/identity/v3/region.py +36 -16
- openstackclient/identity/v3/registered_limit.py +40 -16
- openstackclient/identity/v3/role.py +61 -31
- openstackclient/identity/v3/role_assignment.py +23 -6
- openstackclient/identity/v3/service.py +36 -16
- openstackclient/identity/v3/service_provider.py +37 -15
- openstackclient/identity/v3/tag.py +23 -6
- openstackclient/identity/v3/token.py +30 -14
- openstackclient/identity/v3/trust.py +32 -14
- openstackclient/identity/v3/unscoped_saml.py +10 -2
- openstackclient/identity/v3/user.py +49 -26
- openstackclient/image/client.py +7 -3
- openstackclient/image/v1/image.py +33 -26
- openstackclient/image/v2/cache.py +14 -9
- openstackclient/image/v2/image.py +74 -48
- openstackclient/image/v2/info.py +7 -1
- openstackclient/image/v2/metadef_namespaces.py +109 -13
- openstackclient/image/v2/metadef_objects.py +28 -15
- openstackclient/image/v2/metadef_properties.py +24 -13
- openstackclient/image/v2/metadef_resource_type_association.py +14 -7
- openstackclient/image/v2/metadef_resource_types.py +7 -1
- openstackclient/image/v2/task.py +15 -6
- openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +7 -192
- openstackclient/network/client.py +7 -2
- openstackclient/network/common.py +16 -241
- openstackclient/network/utils.py +36 -22
- openstackclient/network/v2/address_group.py +27 -16
- openstackclient/network/v2/address_scope.py +24 -13
- openstackclient/network/v2/bgpvpn/bgpvpn.py +463 -0
- openstackclient/network/v2/bgpvpn/constants.py +30 -0
- openstackclient/network/v2/bgpvpn/network_association.py +214 -0
- openstackclient/network/v2/bgpvpn/port_association.py +490 -0
- openstackclient/network/v2/bgpvpn/router_association.py +288 -0
- openstackclient/network/v2/default_security_group_rule.py +19 -10
- openstackclient/network/v2/floating_ip.py +110 -159
- openstackclient/network/v2/floating_ip_port_forwarding.py +30 -18
- openstackclient/network/v2/fwaas/__init__.py +0 -0
- openstackclient/network/v2/fwaas/group.py +466 -0
- openstackclient/network/v2/fwaas/policy.py +518 -0
- openstackclient/network/v2/fwaas/rule.py +574 -0
- openstackclient/network/v2/ip_availability.py +13 -5
- openstackclient/network/v2/l3_conntrack_helper.py +22 -13
- openstackclient/network/v2/local_ip.py +24 -13
- openstackclient/network/v2/local_ip_association.py +14 -7
- openstackclient/network/v2/ndp_proxy.py +20 -11
- openstackclient/network/v2/network.py +129 -196
- openstackclient/network/v2/network_agent.py +46 -25
- openstackclient/network/v2/network_auto_allocated_topology.py +22 -11
- openstackclient/network/v2/network_flavor.py +27 -16
- openstackclient/network/v2/network_flavor_profile.py +23 -12
- openstackclient/network/v2/network_meter.py +21 -10
- openstackclient/network/v2/network_meter_rule.py +21 -11
- openstackclient/network/v2/network_qos_policy.py +25 -15
- openstackclient/network/v2/network_qos_rule.py +32 -17
- openstackclient/network/v2/network_qos_rule_type.py +13 -5
- openstackclient/network/v2/network_rbac.py +23 -12
- openstackclient/network/v2/network_segment.py +20 -11
- openstackclient/network/v2/network_segment_range.py +56 -29
- openstackclient/network/v2/network_service_provider.py +7 -1
- openstackclient/network/v2/network_trunk.py +38 -22
- openstackclient/network/v2/port.py +54 -29
- openstackclient/network/v2/router.py +75 -52
- openstackclient/network/v2/security_group.py +87 -157
- openstackclient/network/v2/security_group_rule.py +100 -280
- openstackclient/network/v2/subnet.py +49 -28
- openstackclient/network/v2/subnet_pool.py +30 -17
- openstackclient/network/v2/taas/tap_flow.py +22 -11
- openstackclient/network/v2/taas/tap_mirror.py +22 -11
- openstackclient/network/v2/taas/tap_service.py +23 -12
- openstackclient/object/client.py +7 -2
- openstackclient/object/v1/account.py +13 -6
- openstackclient/object/v1/container.py +25 -15
- openstackclient/object/v1/object.py +25 -15
- openstackclient/py.typed +0 -0
- openstackclient/shell.py +46 -10
- openstackclient/tests/functional/base.py +55 -20
- openstackclient/tests/functional/common/test_extension.py +4 -0
- openstackclient/tests/functional/common/test_quota.py +3 -1
- openstackclient/tests/functional/compute/v2/common.py +14 -13
- openstackclient/tests/functional/compute/v2/test_flavor.py +3 -1
- openstackclient/tests/functional/compute/v2/test_server.py +3 -0
- openstackclient/tests/functional/identity/v2/common.py +10 -6
- openstackclient/tests/functional/identity/v2/test_role.py +4 -4
- openstackclient/tests/functional/identity/v3/common.py +25 -19
- openstackclient/tests/functional/identity/v3/test_group.py +20 -20
- openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
- openstackclient/tests/functional/identity/v3/test_project.py +10 -10
- openstackclient/tests/functional/identity/v3/test_role.py +18 -18
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
- openstackclient/tests/functional/identity/v3/test_user.py +8 -8
- openstackclient/tests/functional/image/base.py +1 -6
- openstackclient/tests/functional/network/v2/common.py +5 -2
- openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
- openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
- openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
- openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
- openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
- openstackclient/tests/functional/object/v1/common.py +4 -0
- openstackclient/tests/functional/volume/v2/common.py +4 -0
- openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
- openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
- openstackclient/tests/functional/volume/v3/common.py +4 -0
- openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +11 -7
- openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
- openstackclient/tests/unit/common/test_availability_zone.py +35 -49
- openstackclient/tests/unit/common/test_extension.py +2 -2
- openstackclient/tests/unit/common/test_module.py +12 -7
- openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
- openstackclient/tests/unit/common/test_quota.py +6 -26
- openstackclient/tests/unit/compute/v2/fakes.py +25 -0
- openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
- openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
- openstackclient/tests/unit/compute/v2/test_server.py +11 -96
- openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
- openstackclient/tests/unit/identity/v3/fakes.py +3 -0
- openstackclient/tests/unit/identity/v3/test_group.py +4 -14
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
- openstackclient/tests/unit/identity/v3/test_user.py +4 -4
- openstackclient/tests/unit/image/v2/test_image.py +11 -11
- openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
- openstackclient/tests/unit/network/test_common.py +0 -155
- openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
- openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
- openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
- openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
- openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
- openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
- openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
- openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
- openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
- openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
- openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
- openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
- openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
- openstackclient/tests/unit/network/v2/test_router.py +8 -9
- openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
- openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
- openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
- openstackclient/tests/unit/object/v1/fakes.py +8 -7
- openstackclient/tests/unit/object/v1/test_container.py +65 -101
- openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
- openstackclient/tests/unit/object/v1/test_object.py +44 -84
- openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
- openstackclient/tests/unit/test_hacking.py +108 -0
- openstackclient/tests/unit/volume/v2/fakes.py +1 -0
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
- openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
- openstackclient/tests/unit/volume/v3/fakes.py +1 -0
- openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
- openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
- openstackclient/volume/client.py +7 -3
- openstackclient/volume/v2/backup_record.py +15 -6
- openstackclient/volume/v2/consistency_group.py +29 -17
- openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
- openstackclient/volume/v2/qos_specs.py +28 -17
- openstackclient/volume/v2/service.py +17 -6
- openstackclient/volume/v2/volume.py +57 -29
- openstackclient/volume/v2/volume_backend.py +19 -6
- openstackclient/volume/v2/volume_backup.py +46 -20
- openstackclient/volume/v2/volume_host.py +6 -4
- openstackclient/volume/v2/volume_snapshot.py +50 -24
- openstackclient/volume/v2/volume_transfer_request.py +31 -13
- openstackclient/volume/v2/volume_type.py +43 -24
- openstackclient/volume/v3/block_storage_cleanup.py +11 -3
- openstackclient/volume/v3/block_storage_cluster.py +19 -7
- openstackclient/volume/v3/block_storage_log_level.py +15 -6
- openstackclient/volume/v3/block_storage_manage.py +10 -4
- openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
- openstackclient/volume/v3/service.py +16 -6
- openstackclient/volume/v3/volume.py +89 -39
- openstackclient/volume/v3/volume_attachment.py +43 -21
- openstackclient/volume/v3/volume_backup.py +53 -24
- openstackclient/volume/v3/volume_group.py +23 -13
- openstackclient/volume/v3/volume_group_snapshot.py +32 -13
- openstackclient/volume/v3/volume_group_type.py +26 -13
- openstackclient/volume/v3/volume_message.py +15 -7
- openstackclient/volume/v3/volume_snapshot.py +69 -32
- openstackclient/volume/v3/volume_transfer_request.py +31 -13
- openstackclient/volume/v3/volume_type.py +42 -24
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +271 -260
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +4 -0
- python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
- openstackclient/api/image_v1.py +0 -69
- openstackclient/api/image_v2.py +0 -79
- openstackclient/network/v2/floating_ip_pool.py +0 -38
- openstackclient/tests/functional/image/v1/test_image.py +0 -97
- openstackclient/tests/unit/api/test_image_v1.py +0 -96
- openstackclient/tests/unit/api/test_image_v2.py +0 -96
- openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
- openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
- openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
- python_openstackclient-9.0.0.dist-info/pbr.json +0 -1
- /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
|
@@ -14,11 +14,12 @@
|
|
|
14
14
|
"""Router action implementations"""
|
|
15
15
|
|
|
16
16
|
import argparse
|
|
17
|
+
from collections.abc import Iterable, Sequence
|
|
17
18
|
import collections
|
|
18
19
|
import copy
|
|
19
20
|
import json
|
|
20
21
|
import logging
|
|
21
|
-
|
|
22
|
+
from typing import Any
|
|
22
23
|
|
|
23
24
|
from cliff import columns as cliff_columns
|
|
24
25
|
from osc_lib.cli import format_columns
|
|
@@ -36,25 +37,25 @@ LOG = logging.getLogger(__name__)
|
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
|
|
39
|
-
def human_readable(self):
|
|
40
|
+
def human_readable(self) -> str:
|
|
40
41
|
return 'UP' if self._value else 'DOWN'
|
|
41
42
|
|
|
42
43
|
|
|
43
|
-
class RouterInfoColumn(cliff_columns.FormattableColumn[
|
|
44
|
-
def human_readable(self):
|
|
44
|
+
class RouterInfoColumn(cliff_columns.FormattableColumn[Any]):
|
|
45
|
+
def human_readable(self) -> str:
|
|
45
46
|
try:
|
|
46
47
|
return json.dumps(self._value)
|
|
47
48
|
except (TypeError, KeyError):
|
|
48
49
|
return ''
|
|
49
50
|
|
|
50
51
|
|
|
51
|
-
class RoutesColumn(cliff_columns.FormattableColumn[
|
|
52
|
-
def human_readable(self):
|
|
52
|
+
class RoutesColumn(cliff_columns.FormattableColumn[Any]):
|
|
53
|
+
def human_readable(self) -> str:
|
|
53
54
|
# Map the route keys to match --route option.
|
|
54
55
|
for route in self._value or []:
|
|
55
56
|
if 'nexthop' in route:
|
|
56
57
|
route['gateway'] = route.pop('nexthop')
|
|
57
|
-
return utils.format_list_of_dicts(self._value)
|
|
58
|
+
return utils.format_list_of_dicts(self._value) or ""
|
|
58
59
|
|
|
59
60
|
|
|
60
61
|
_formatters = {
|
|
@@ -68,7 +69,7 @@ _formatters = {
|
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
|
|
71
|
-
def _get_columns(item):
|
|
72
|
+
def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
72
73
|
column_map = {
|
|
73
74
|
'is_ha': 'ha',
|
|
74
75
|
'is_distributed': 'distributed',
|
|
@@ -76,19 +77,19 @@ def _get_columns(item):
|
|
|
76
77
|
}
|
|
77
78
|
if hasattr(item, 'interfaces_info'):
|
|
78
79
|
column_map['interfaces_info'] = 'interfaces_info'
|
|
79
|
-
|
|
80
|
+
hidden_columns = ['location', 'tenant_id']
|
|
80
81
|
if item.is_ha is None:
|
|
81
|
-
|
|
82
|
+
hidden_columns.append('is_ha')
|
|
82
83
|
column_map.pop('is_ha')
|
|
83
84
|
if item.is_distributed is None:
|
|
84
|
-
|
|
85
|
+
hidden_columns.append('is_distributed')
|
|
85
86
|
column_map.pop('is_distributed')
|
|
86
87
|
return utils.get_osc_show_columns_for_sdk_resource(
|
|
87
|
-
item, column_map,
|
|
88
|
+
item, column_map, hidden_columns
|
|
88
89
|
)
|
|
89
90
|
|
|
90
91
|
|
|
91
|
-
def is_multiple_gateways_supported(n_client):
|
|
92
|
+
def is_multiple_gateways_supported(n_client: Any) -> bool:
|
|
92
93
|
return (
|
|
93
94
|
n_client.find_extension(
|
|
94
95
|
"external-gateway-multihoming", ignore_missing=True
|
|
@@ -97,7 +98,9 @@ def is_multiple_gateways_supported(n_client):
|
|
|
97
98
|
)
|
|
98
99
|
|
|
99
100
|
|
|
100
|
-
def _passed_multiple_gateways(
|
|
101
|
+
def _passed_multiple_gateways(
|
|
102
|
+
extension_supported: bool, external_gateways: list[Any]
|
|
103
|
+
) -> bool:
|
|
101
104
|
passed_multiple_gws = len(external_gateways) > 1
|
|
102
105
|
if passed_multiple_gws and not extension_supported:
|
|
103
106
|
msg = _(
|
|
@@ -109,13 +112,15 @@ def _passed_multiple_gateways(extension_supported, external_gateways):
|
|
|
109
112
|
return passed_multiple_gws
|
|
110
113
|
|
|
111
114
|
|
|
112
|
-
def _get_external_gateway_attrs(
|
|
113
|
-
|
|
115
|
+
def _get_external_gateway_attrs(
|
|
116
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
117
|
+
) -> dict[str, Any]:
|
|
118
|
+
attrs: dict[str, Any] = {}
|
|
114
119
|
|
|
115
120
|
if parsed_args.external_gateways:
|
|
116
|
-
external_gateways: collections.defaultdict[
|
|
117
|
-
|
|
118
|
-
)
|
|
121
|
+
external_gateways: collections.defaultdict[
|
|
122
|
+
str, list[dict[str, Any]]
|
|
123
|
+
] = collections.defaultdict(list)
|
|
119
124
|
n_client = client_manager.network
|
|
120
125
|
first_network_id = ''
|
|
121
126
|
|
|
@@ -206,8 +211,10 @@ def _get_external_gateway_attrs(client_manager, parsed_args):
|
|
|
206
211
|
return attrs
|
|
207
212
|
|
|
208
213
|
|
|
209
|
-
def _get_attrs(
|
|
210
|
-
|
|
214
|
+
def _get_attrs(
|
|
215
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
216
|
+
) -> dict[str, Any]:
|
|
217
|
+
attrs: dict[str, Any] = {}
|
|
211
218
|
n_client = client_manager.network
|
|
212
219
|
|
|
213
220
|
if parsed_args.name is not None:
|
|
@@ -257,7 +264,7 @@ def _get_attrs(client_manager, parsed_args):
|
|
|
257
264
|
return attrs
|
|
258
265
|
|
|
259
266
|
|
|
260
|
-
def _parser_add_bfd_ecmp_arguments(parser):
|
|
267
|
+
def _parser_add_bfd_ecmp_arguments(parser: argparse.ArgumentParser) -> None:
|
|
261
268
|
"""Helper to add BFD and ECMP args for CreateRouter and SetRouter."""
|
|
262
269
|
parser.add_argument(
|
|
263
270
|
'--enable-default-route-bfd',
|
|
@@ -298,7 +305,9 @@ def _parser_add_bfd_ecmp_arguments(parser):
|
|
|
298
305
|
)
|
|
299
306
|
|
|
300
307
|
|
|
301
|
-
def _command_check_bfd_ecmp_supported(
|
|
308
|
+
def _command_check_bfd_ecmp_supported(
|
|
309
|
+
attrs: dict[str, Any], client: Any
|
|
310
|
+
) -> None:
|
|
302
311
|
"""Helper to check for server side support when bfd/ecmp attrs provided.
|
|
303
312
|
|
|
304
313
|
:raises: exceptions.CommandError
|
|
@@ -318,7 +327,7 @@ def _command_check_bfd_ecmp_supported(attrs, client):
|
|
|
318
327
|
class AddPortToRouter(command.Command):
|
|
319
328
|
_description = _("Add a port to a router")
|
|
320
329
|
|
|
321
|
-
def get_parser(self, prog_name):
|
|
330
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
322
331
|
parser = super().get_parser(prog_name)
|
|
323
332
|
parser.add_argument(
|
|
324
333
|
'router',
|
|
@@ -330,7 +339,7 @@ class AddPortToRouter(command.Command):
|
|
|
330
339
|
)
|
|
331
340
|
return parser
|
|
332
341
|
|
|
333
|
-
def take_action(self, parsed_args):
|
|
342
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
334
343
|
client = self.app.client_manager.network
|
|
335
344
|
port = client.find_port(parsed_args.port, ignore_missing=False)
|
|
336
345
|
client.add_interface_to_router(
|
|
@@ -342,7 +351,7 @@ class AddPortToRouter(command.Command):
|
|
|
342
351
|
class AddSubnetToRouter(command.Command):
|
|
343
352
|
_description = _("Add a subnet to a router")
|
|
344
353
|
|
|
345
|
-
def get_parser(self, prog_name):
|
|
354
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
346
355
|
parser = super().get_parser(prog_name)
|
|
347
356
|
parser.add_argument(
|
|
348
357
|
'router',
|
|
@@ -356,7 +365,7 @@ class AddSubnetToRouter(command.Command):
|
|
|
356
365
|
)
|
|
357
366
|
return parser
|
|
358
367
|
|
|
359
|
-
def take_action(self, parsed_args):
|
|
368
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
360
369
|
client = self.app.client_manager.network
|
|
361
370
|
subnet = client.find_subnet(parsed_args.subnet, ignore_missing=False)
|
|
362
371
|
client.add_interface_to_router(
|
|
@@ -368,7 +377,7 @@ class AddSubnetToRouter(command.Command):
|
|
|
368
377
|
class AddExtraRoutesToRouter(command.ShowOne):
|
|
369
378
|
_description = _("Add extra static routes to a router's routing table.")
|
|
370
379
|
|
|
371
|
-
def get_parser(self, prog_name):
|
|
380
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
372
381
|
parser = super().get_parser(prog_name)
|
|
373
382
|
parser.add_argument(
|
|
374
383
|
'router',
|
|
@@ -398,7 +407,9 @@ class AddExtraRoutesToRouter(command.ShowOne):
|
|
|
398
407
|
)
|
|
399
408
|
return parser
|
|
400
409
|
|
|
401
|
-
def take_action(
|
|
410
|
+
def take_action(
|
|
411
|
+
self, parsed_args: argparse.Namespace
|
|
412
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
402
413
|
if parsed_args.routes is not None:
|
|
403
414
|
for route in parsed_args.routes:
|
|
404
415
|
route['nexthop'] = route.pop('gateway')
|
|
@@ -419,7 +430,7 @@ class RemoveExtraRoutesFromRouter(command.ShowOne):
|
|
|
419
430
|
"Remove extra static routes from a router's routing table."
|
|
420
431
|
)
|
|
421
432
|
|
|
422
|
-
def get_parser(self, prog_name):
|
|
433
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
423
434
|
parser = super().get_parser(prog_name)
|
|
424
435
|
parser.add_argument(
|
|
425
436
|
'router',
|
|
@@ -449,7 +460,9 @@ class RemoveExtraRoutesFromRouter(command.ShowOne):
|
|
|
449
460
|
)
|
|
450
461
|
return parser
|
|
451
462
|
|
|
452
|
-
def take_action(
|
|
463
|
+
def take_action(
|
|
464
|
+
self, parsed_args: argparse.Namespace
|
|
465
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
453
466
|
if parsed_args.routes is not None:
|
|
454
467
|
for route in parsed_args.routes:
|
|
455
468
|
route['nexthop'] = route.pop('gateway')
|
|
@@ -470,7 +483,7 @@ class RemoveExtraRoutesFromRouter(command.ShowOne):
|
|
|
470
483
|
class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
471
484
|
_description = _("Create a new router")
|
|
472
485
|
|
|
473
|
-
def get_parser(self, prog_name):
|
|
486
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
474
487
|
parser = super().get_parser(prog_name)
|
|
475
488
|
parser.add_argument(
|
|
476
489
|
'name', metavar='<name>', help=_("New router name")
|
|
@@ -597,7 +610,9 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
597
610
|
|
|
598
611
|
return parser
|
|
599
612
|
|
|
600
|
-
def take_action(
|
|
613
|
+
def take_action(
|
|
614
|
+
self, parsed_args: argparse.Namespace
|
|
615
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
601
616
|
client = self.app.client_manager.network
|
|
602
617
|
|
|
603
618
|
attrs = _get_attrs(self.app.client_manager, parsed_args)
|
|
@@ -661,7 +676,7 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
661
676
|
class DeleteRouter(command.Command):
|
|
662
677
|
_description = _("Delete router(s)")
|
|
663
678
|
|
|
664
|
-
def get_parser(self, prog_name):
|
|
679
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
665
680
|
parser = super().get_parser(prog_name)
|
|
666
681
|
parser.add_argument(
|
|
667
682
|
'router',
|
|
@@ -671,7 +686,7 @@ class DeleteRouter(command.Command):
|
|
|
671
686
|
)
|
|
672
687
|
return parser
|
|
673
688
|
|
|
674
|
-
def take_action(self, parsed_args):
|
|
689
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
675
690
|
client = self.app.client_manager.network
|
|
676
691
|
result = 0
|
|
677
692
|
|
|
@@ -703,7 +718,7 @@ class DeleteRouter(command.Command):
|
|
|
703
718
|
class ListRouter(command.Lister):
|
|
704
719
|
_description = _("List routers")
|
|
705
720
|
|
|
706
|
-
def get_parser(self, prog_name):
|
|
721
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
707
722
|
parser = super().get_parser(prog_name)
|
|
708
723
|
parser.add_argument(
|
|
709
724
|
'--name',
|
|
@@ -742,7 +757,9 @@ class ListRouter(command.Lister):
|
|
|
742
757
|
|
|
743
758
|
return parser
|
|
744
759
|
|
|
745
|
-
def take_action(
|
|
760
|
+
def take_action(
|
|
761
|
+
self, parsed_args: argparse.Namespace
|
|
762
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
746
763
|
identity_client = self.app.client_manager.identity
|
|
747
764
|
client = self.app.client_manager.network
|
|
748
765
|
|
|
@@ -834,7 +851,7 @@ class ListRouter(command.Lister):
|
|
|
834
851
|
)
|
|
835
852
|
|
|
836
853
|
@staticmethod
|
|
837
|
-
def _filter_match(data, conditions):
|
|
854
|
+
def _filter_match(data: Any, conditions: dict[str, Any]) -> bool:
|
|
838
855
|
for key, value in conditions.items():
|
|
839
856
|
try:
|
|
840
857
|
if getattr(data, key) != value:
|
|
@@ -851,7 +868,7 @@ class ListRouter(command.Lister):
|
|
|
851
868
|
class RemovePortFromRouter(command.Command):
|
|
852
869
|
_description = _("Remove a port from a router")
|
|
853
870
|
|
|
854
|
-
def get_parser(self, prog_name):
|
|
871
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
855
872
|
parser = super().get_parser(prog_name)
|
|
856
873
|
parser.add_argument(
|
|
857
874
|
'router',
|
|
@@ -865,7 +882,7 @@ class RemovePortFromRouter(command.Command):
|
|
|
865
882
|
)
|
|
866
883
|
return parser
|
|
867
884
|
|
|
868
|
-
def take_action(self, parsed_args):
|
|
885
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
869
886
|
client = self.app.client_manager.network
|
|
870
887
|
port = client.find_port(parsed_args.port, ignore_missing=False)
|
|
871
888
|
client.remove_interface_from_router(
|
|
@@ -877,7 +894,7 @@ class RemovePortFromRouter(command.Command):
|
|
|
877
894
|
class RemoveSubnetFromRouter(command.Command):
|
|
878
895
|
_description = _("Remove a subnet from a router")
|
|
879
896
|
|
|
880
|
-
def get_parser(self, prog_name):
|
|
897
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
881
898
|
parser = super().get_parser(prog_name)
|
|
882
899
|
parser.add_argument(
|
|
883
900
|
'router',
|
|
@@ -893,7 +910,7 @@ class RemoveSubnetFromRouter(command.Command):
|
|
|
893
910
|
)
|
|
894
911
|
return parser
|
|
895
912
|
|
|
896
|
-
def take_action(self, parsed_args):
|
|
913
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
897
914
|
client = self.app.client_manager.network
|
|
898
915
|
subnet = client.find_subnet(parsed_args.subnet, ignore_missing=False)
|
|
899
916
|
client.remove_interface_from_router(
|
|
@@ -907,7 +924,7 @@ class RemoveSubnetFromRouter(command.Command):
|
|
|
907
924
|
class SetRouter(common.NeutronCommandWithExtraArgs):
|
|
908
925
|
_description = _("Set router properties")
|
|
909
926
|
|
|
910
|
-
def get_parser(self, prog_name):
|
|
927
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
911
928
|
parser = super().get_parser(prog_name)
|
|
912
929
|
parser.add_argument(
|
|
913
930
|
'router',
|
|
@@ -1051,7 +1068,7 @@ class SetRouter(common.NeutronCommandWithExtraArgs):
|
|
|
1051
1068
|
_parser_add_bfd_ecmp_arguments(parser)
|
|
1052
1069
|
return parser
|
|
1053
1070
|
|
|
1054
|
-
def take_action(self, parsed_args):
|
|
1071
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
1055
1072
|
client = self.app.client_manager.network
|
|
1056
1073
|
obj = client.find_router(parsed_args.router, ignore_missing=False)
|
|
1057
1074
|
|
|
@@ -1141,7 +1158,7 @@ class SetRouter(common.NeutronCommandWithExtraArgs):
|
|
|
1141
1158
|
class ShowRouter(command.ShowOne):
|
|
1142
1159
|
_description = _("Display router details")
|
|
1143
1160
|
|
|
1144
|
-
def get_parser(self, prog_name):
|
|
1161
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1145
1162
|
parser = super().get_parser(prog_name)
|
|
1146
1163
|
parser.add_argument(
|
|
1147
1164
|
'router',
|
|
@@ -1150,7 +1167,9 @@ class ShowRouter(command.ShowOne):
|
|
|
1150
1167
|
)
|
|
1151
1168
|
return parser
|
|
1152
1169
|
|
|
1153
|
-
def take_action(
|
|
1170
|
+
def take_action(
|
|
1171
|
+
self, parsed_args: argparse.Namespace
|
|
1172
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
1154
1173
|
client = self.app.client_manager.network
|
|
1155
1174
|
obj = client.find_router(parsed_args.router, ignore_missing=False)
|
|
1156
1175
|
interfaces_info = []
|
|
@@ -1177,7 +1196,7 @@ class ShowRouter(command.ShowOne):
|
|
|
1177
1196
|
class UnsetRouter(common.NeutronUnsetCommandWithExtraArgs):
|
|
1178
1197
|
_description = _("Unset router properties")
|
|
1179
1198
|
|
|
1180
|
-
def get_parser(self, prog_name):
|
|
1199
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1181
1200
|
parser = super().get_parser(prog_name)
|
|
1182
1201
|
parser.add_argument(
|
|
1183
1202
|
'--route',
|
|
@@ -1217,7 +1236,7 @@ class UnsetRouter(common.NeutronUnsetCommandWithExtraArgs):
|
|
|
1217
1236
|
_tag.add_tag_option_to_parser_for_unset(parser, _('router'))
|
|
1218
1237
|
return parser
|
|
1219
1238
|
|
|
1220
|
-
def take_action(self, parsed_args):
|
|
1239
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
1221
1240
|
client = self.app.client_manager.network
|
|
1222
1241
|
obj = client.find_router(parsed_args.router, ignore_missing=False)
|
|
1223
1242
|
tmp_routes = copy.deepcopy(obj.routes)
|
|
@@ -1272,7 +1291,7 @@ class UnsetRouter(common.NeutronUnsetCommandWithExtraArgs):
|
|
|
1272
1291
|
class AddGatewayToRouter(command.ShowOne):
|
|
1273
1292
|
_description = _("Add router gateway")
|
|
1274
1293
|
|
|
1275
|
-
def get_parser(self, prog_name):
|
|
1294
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1276
1295
|
parser = super().get_parser(prog_name)
|
|
1277
1296
|
parser.add_argument(
|
|
1278
1297
|
'router',
|
|
@@ -1304,7 +1323,9 @@ class AddGatewayToRouter(command.ShowOne):
|
|
|
1304
1323
|
)
|
|
1305
1324
|
return parser
|
|
1306
1325
|
|
|
1307
|
-
def take_action(
|
|
1326
|
+
def take_action(
|
|
1327
|
+
self, parsed_args: argparse.Namespace
|
|
1328
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
1308
1329
|
client = self.app.client_manager.network
|
|
1309
1330
|
if not is_multiple_gateways_supported(client):
|
|
1310
1331
|
msg = _(
|
|
@@ -1339,7 +1360,7 @@ class AddGatewayToRouter(command.ShowOne):
|
|
|
1339
1360
|
class RemoveGatewayFromRouter(command.ShowOne):
|
|
1340
1361
|
_description = _("Remove router gateway")
|
|
1341
1362
|
|
|
1342
|
-
def get_parser(self, prog_name):
|
|
1363
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1343
1364
|
parser = super().get_parser(prog_name)
|
|
1344
1365
|
parser.add_argument(
|
|
1345
1366
|
'router',
|
|
@@ -1371,7 +1392,9 @@ class RemoveGatewayFromRouter(command.ShowOne):
|
|
|
1371
1392
|
)
|
|
1372
1393
|
return parser
|
|
1373
1394
|
|
|
1374
|
-
def take_action(
|
|
1395
|
+
def take_action(
|
|
1396
|
+
self, parsed_args: argparse.Namespace
|
|
1397
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
1375
1398
|
client = self.app.client_manager.network
|
|
1376
1399
|
if not is_multiple_gateways_supported(client):
|
|
1377
1400
|
msg = _(
|