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
openstackclient/network/utils.py
CHANGED
|
@@ -11,13 +11,18 @@
|
|
|
11
11
|
# under the License.
|
|
12
12
|
#
|
|
13
13
|
|
|
14
|
+
from collections.abc import Iterable, Sequence
|
|
15
|
+
from typing import Any, cast
|
|
16
|
+
|
|
14
17
|
from osc_lib import exceptions
|
|
15
18
|
|
|
16
19
|
from openstackclient.i18n import _
|
|
17
20
|
|
|
18
21
|
|
|
19
22
|
# Transform compute security group rule for display.
|
|
20
|
-
def transform_compute_security_group_rule(
|
|
23
|
+
def transform_compute_security_group_rule(
|
|
24
|
+
sg_rule: dict[str, Any],
|
|
25
|
+
) -> dict[str, Any]:
|
|
21
26
|
info = {}
|
|
22
27
|
info.update(sg_rule)
|
|
23
28
|
from_port = info.pop('from_port')
|
|
@@ -45,14 +50,14 @@ def transform_compute_security_group_rule(sg_rule):
|
|
|
45
50
|
return info
|
|
46
51
|
|
|
47
52
|
|
|
48
|
-
def str2bool(strbool):
|
|
53
|
+
def str2bool(strbool: str | None) -> bool | None:
|
|
49
54
|
if strbool is None:
|
|
50
55
|
return None
|
|
51
56
|
return strbool.lower() == 'true'
|
|
52
57
|
|
|
53
58
|
|
|
54
|
-
def str2list(strlist):
|
|
55
|
-
result = []
|
|
59
|
+
def str2list(strlist: str | None) -> list[str]:
|
|
60
|
+
result: list[str] = []
|
|
56
61
|
if strlist:
|
|
57
62
|
result = strlist.split(';')
|
|
58
63
|
return result
|
|
@@ -78,17 +83,20 @@ def str2dict(strdict: str) -> dict[str, str]:
|
|
|
78
83
|
else:
|
|
79
84
|
kvlist[i - 1] = f"{kvlist[i - 1]};{kv}"
|
|
80
85
|
for kv in kvlist:
|
|
81
|
-
key,
|
|
86
|
+
key, value = kv.split(':', 1)
|
|
82
87
|
result[key] = value
|
|
83
88
|
return result
|
|
84
89
|
|
|
85
90
|
|
|
86
|
-
def format_security_group_rule_show(
|
|
91
|
+
def format_security_group_rule_show(
|
|
92
|
+
obj: dict[str, Any],
|
|
93
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
87
94
|
data = transform_compute_security_group_rule(obj)
|
|
88
|
-
|
|
95
|
+
col_headers, col_data = zip(*sorted(data.items()))
|
|
96
|
+
return col_headers, col_data
|
|
89
97
|
|
|
90
98
|
|
|
91
|
-
def format_network_port_range(rule):
|
|
99
|
+
def format_network_port_range(rule: dict[str, Any]) -> str:
|
|
92
100
|
# Display port range or ICMP type and code. For example:
|
|
93
101
|
# - ICMP type: 'type=3'
|
|
94
102
|
# - ICMP type and code: 'type=3:code=0'
|
|
@@ -114,8 +122,8 @@ def format_network_port_range(rule):
|
|
|
114
122
|
return port_range
|
|
115
123
|
|
|
116
124
|
|
|
117
|
-
def format_remote_ip_prefix(rule):
|
|
118
|
-
remote_ip_prefix = rule['remote_ip_prefix']
|
|
125
|
+
def format_remote_ip_prefix(rule: dict[str, Any]) -> str | None:
|
|
126
|
+
remote_ip_prefix = cast(str | None, rule['remote_ip_prefix'])
|
|
119
127
|
if remote_ip_prefix is None:
|
|
120
128
|
ethertype = rule['ether_type']
|
|
121
129
|
if ethertype == 'IPv4':
|
|
@@ -125,7 +133,7 @@ def format_remote_ip_prefix(rule):
|
|
|
125
133
|
return remote_ip_prefix
|
|
126
134
|
|
|
127
135
|
|
|
128
|
-
def convert_ipvx_case(string):
|
|
136
|
+
def convert_ipvx_case(string: str) -> str:
|
|
129
137
|
if string.lower() == 'ipv4':
|
|
130
138
|
return 'IPv4'
|
|
131
139
|
if string.lower() == 'ipv6':
|
|
@@ -133,7 +141,7 @@ def convert_ipvx_case(string):
|
|
|
133
141
|
return string
|
|
134
142
|
|
|
135
143
|
|
|
136
|
-
def is_icmp_protocol(protocol):
|
|
144
|
+
def is_icmp_protocol(protocol: str | None) -> bool:
|
|
137
145
|
# NOTE(rtheis): Neutron has deprecated protocol icmpv6.
|
|
138
146
|
# However, while the OSC CLI doesn't document the protocol,
|
|
139
147
|
# the code must still handle it. In addition, handle both
|
|
@@ -144,12 +152,14 @@ def is_icmp_protocol(protocol):
|
|
|
144
152
|
return False
|
|
145
153
|
|
|
146
154
|
|
|
147
|
-
def convert_to_lowercase(string):
|
|
155
|
+
def convert_to_lowercase(string: str) -> str:
|
|
148
156
|
return string.lower()
|
|
149
157
|
|
|
150
158
|
|
|
151
|
-
def get_protocol(
|
|
152
|
-
|
|
159
|
+
def get_protocol(
|
|
160
|
+
parsed_args: Any, default_protocol: str = 'any'
|
|
161
|
+
) -> str | None:
|
|
162
|
+
protocol: str | None = default_protocol
|
|
153
163
|
if parsed_args.protocol is not None:
|
|
154
164
|
protocol = parsed_args.protocol
|
|
155
165
|
if hasattr(parsed_args, "proto") and parsed_args.proto is not None:
|
|
@@ -159,7 +169,7 @@ def get_protocol(parsed_args, default_protocol='any'):
|
|
|
159
169
|
return protocol
|
|
160
170
|
|
|
161
171
|
|
|
162
|
-
def get_ethertype(parsed_args, protocol):
|
|
172
|
+
def get_ethertype(parsed_args: Any, protocol: str | None) -> str:
|
|
163
173
|
ethertype = 'IPv4'
|
|
164
174
|
if parsed_args.ethertype is not None:
|
|
165
175
|
ethertype = parsed_args.ethertype
|
|
@@ -168,16 +178,20 @@ def get_ethertype(parsed_args, protocol):
|
|
|
168
178
|
return ethertype
|
|
169
179
|
|
|
170
180
|
|
|
171
|
-
def is_ipv6_protocol(protocol):
|
|
181
|
+
def is_ipv6_protocol(protocol: str | None) -> bool:
|
|
172
182
|
# NOTE(rtheis): Neutron has deprecated protocol icmpv6.
|
|
173
183
|
# However, while the OSC CLI doesn't document the protocol,
|
|
174
184
|
# the code must still handle it. In addition, handle both
|
|
175
185
|
# protocol names and numbers.
|
|
176
|
-
if (
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
186
|
+
if (protocol is not None and protocol.startswith('ipv6-')) or protocol in [
|
|
187
|
+
'icmpv6',
|
|
188
|
+
'41',
|
|
189
|
+
'43',
|
|
190
|
+
'44',
|
|
191
|
+
'58',
|
|
192
|
+
'59',
|
|
193
|
+
'60',
|
|
194
|
+
]:
|
|
181
195
|
return True
|
|
182
196
|
else:
|
|
183
197
|
return False
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
|
|
14
14
|
"""Address group action implementations"""
|
|
15
15
|
|
|
16
|
+
import argparse
|
|
16
17
|
import logging
|
|
18
|
+
from collections.abc import Iterable, Sequence
|
|
19
|
+
from typing import Any
|
|
17
20
|
|
|
18
21
|
import netaddr
|
|
19
22
|
from osc_lib import exceptions
|
|
@@ -27,19 +30,21 @@ from openstackclient.network import common
|
|
|
27
30
|
LOG = logging.getLogger(__name__)
|
|
28
31
|
|
|
29
32
|
|
|
30
|
-
def _get_columns(item):
|
|
33
|
+
def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
31
34
|
hidden_columns = ['location', 'tenant_id']
|
|
32
35
|
return utils.get_osc_show_columns_for_sdk_resource(
|
|
33
36
|
item, {}, hidden_columns
|
|
34
37
|
)
|
|
35
38
|
|
|
36
39
|
|
|
37
|
-
def _format_addresses(addresses):
|
|
40
|
+
def _format_addresses(addresses: list[str]) -> list[str]:
|
|
38
41
|
return [str(netaddr.IPNetwork(addr)) for addr in addresses]
|
|
39
42
|
|
|
40
43
|
|
|
41
|
-
def _get_attrs(
|
|
42
|
-
|
|
44
|
+
def _get_attrs(
|
|
45
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
46
|
+
) -> dict[str, Any]:
|
|
47
|
+
attrs: dict[str, Any] = {}
|
|
43
48
|
attrs['name'] = parsed_args.name
|
|
44
49
|
if parsed_args.description:
|
|
45
50
|
attrs['description'] = parsed_args.description
|
|
@@ -59,7 +64,7 @@ def _get_attrs(client_manager, parsed_args):
|
|
|
59
64
|
class CreateAddressGroup(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
60
65
|
_description = _("Create a new Address Group")
|
|
61
66
|
|
|
62
|
-
def get_parser(self, prog_name):
|
|
67
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
63
68
|
parser = super().get_parser(prog_name)
|
|
64
69
|
parser.add_argument(
|
|
65
70
|
'name', metavar="<name>", help=_("New address group name")
|
|
@@ -87,7 +92,9 @@ class CreateAddressGroup(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
87
92
|
|
|
88
93
|
return parser
|
|
89
94
|
|
|
90
|
-
def take_action(
|
|
95
|
+
def take_action(
|
|
96
|
+
self, parsed_args: argparse.Namespace
|
|
97
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
91
98
|
client = self.app.client_manager.network
|
|
92
99
|
attrs = _get_attrs(self.app.client_manager, parsed_args)
|
|
93
100
|
|
|
@@ -105,7 +112,7 @@ class CreateAddressGroup(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
105
112
|
class DeleteAddressGroup(command.Command):
|
|
106
113
|
_description = _("Delete address group(s)")
|
|
107
114
|
|
|
108
|
-
def get_parser(self, prog_name):
|
|
115
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
109
116
|
parser = super().get_parser(prog_name)
|
|
110
117
|
parser.add_argument(
|
|
111
118
|
'address_group',
|
|
@@ -116,7 +123,7 @@ class DeleteAddressGroup(command.Command):
|
|
|
116
123
|
|
|
117
124
|
return parser
|
|
118
125
|
|
|
119
|
-
def take_action(self, parsed_args):
|
|
126
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
120
127
|
client = self.app.client_manager.network
|
|
121
128
|
result = 0
|
|
122
129
|
|
|
@@ -145,7 +152,7 @@ class DeleteAddressGroup(command.Command):
|
|
|
145
152
|
class ListAddressGroup(command.Lister):
|
|
146
153
|
_description = _("List address groups")
|
|
147
154
|
|
|
148
|
-
def get_parser(self, prog_name):
|
|
155
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
149
156
|
parser = super().get_parser(prog_name)
|
|
150
157
|
|
|
151
158
|
parser.add_argument(
|
|
@@ -165,7 +172,9 @@ class ListAddressGroup(command.Lister):
|
|
|
165
172
|
|
|
166
173
|
return parser
|
|
167
174
|
|
|
168
|
-
def take_action(
|
|
175
|
+
def take_action(
|
|
176
|
+
self, parsed_args: argparse.Namespace
|
|
177
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
169
178
|
client = self.app.client_manager.network
|
|
170
179
|
columns = (
|
|
171
180
|
'id',
|
|
@@ -210,7 +219,7 @@ class ListAddressGroup(command.Lister):
|
|
|
210
219
|
class SetAddressGroup(common.NeutronCommandWithExtraArgs):
|
|
211
220
|
_description = _("Set address group properties")
|
|
212
221
|
|
|
213
|
-
def get_parser(self, prog_name):
|
|
222
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
214
223
|
parser = super().get_parser(prog_name)
|
|
215
224
|
parser.add_argument(
|
|
216
225
|
'address_group',
|
|
@@ -236,7 +245,7 @@ class SetAddressGroup(common.NeutronCommandWithExtraArgs):
|
|
|
236
245
|
)
|
|
237
246
|
return parser
|
|
238
247
|
|
|
239
|
-
def take_action(self, parsed_args):
|
|
248
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
240
249
|
client = self.app.client_manager.network
|
|
241
250
|
obj = client.find_address_group(
|
|
242
251
|
parsed_args.address_group, ignore_missing=False
|
|
@@ -261,7 +270,7 @@ class SetAddressGroup(common.NeutronCommandWithExtraArgs):
|
|
|
261
270
|
class ShowAddressGroup(command.ShowOne):
|
|
262
271
|
_description = _("Display address group details")
|
|
263
272
|
|
|
264
|
-
def get_parser(self, prog_name):
|
|
273
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
265
274
|
parser = super().get_parser(prog_name)
|
|
266
275
|
parser.add_argument(
|
|
267
276
|
'address_group',
|
|
@@ -271,7 +280,9 @@ class ShowAddressGroup(command.ShowOne):
|
|
|
271
280
|
|
|
272
281
|
return parser
|
|
273
282
|
|
|
274
|
-
def take_action(
|
|
283
|
+
def take_action(
|
|
284
|
+
self, parsed_args: argparse.Namespace
|
|
285
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
275
286
|
client = self.app.client_manager.network
|
|
276
287
|
obj = client.find_address_group(
|
|
277
288
|
parsed_args.address_group, ignore_missing=False
|
|
@@ -285,7 +296,7 @@ class ShowAddressGroup(command.ShowOne):
|
|
|
285
296
|
class UnsetAddressGroup(command.Command):
|
|
286
297
|
_description = _("Unset address group properties")
|
|
287
298
|
|
|
288
|
-
def get_parser(self, prog_name):
|
|
299
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
289
300
|
parser = super().get_parser(prog_name)
|
|
290
301
|
parser.add_argument(
|
|
291
302
|
'address_group',
|
|
@@ -304,7 +315,7 @@ class UnsetAddressGroup(command.Command):
|
|
|
304
315
|
)
|
|
305
316
|
return parser
|
|
306
317
|
|
|
307
|
-
def take_action(self, parsed_args):
|
|
318
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
308
319
|
client = self.app.client_manager.network
|
|
309
320
|
obj = client.find_address_group(
|
|
310
321
|
parsed_args.address_group, ignore_missing=False
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
|
|
14
14
|
"""Address scope action implementations"""
|
|
15
15
|
|
|
16
|
+
import argparse
|
|
16
17
|
import logging
|
|
18
|
+
from collections.abc import Iterable, Sequence
|
|
19
|
+
from typing import Any
|
|
17
20
|
|
|
18
21
|
from osc_lib import exceptions
|
|
19
22
|
from osc_lib import utils
|
|
@@ -26,7 +29,7 @@ from openstackclient.network import common
|
|
|
26
29
|
LOG = logging.getLogger(__name__)
|
|
27
30
|
|
|
28
31
|
|
|
29
|
-
def _get_columns(item):
|
|
32
|
+
def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
30
33
|
column_map = {
|
|
31
34
|
'is_shared': 'shared',
|
|
32
35
|
}
|
|
@@ -36,8 +39,10 @@ def _get_columns(item):
|
|
|
36
39
|
)
|
|
37
40
|
|
|
38
41
|
|
|
39
|
-
def _get_attrs(
|
|
40
|
-
|
|
42
|
+
def _get_attrs(
|
|
43
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
44
|
+
) -> dict[str, Any]:
|
|
45
|
+
attrs: dict[str, Any] = {}
|
|
41
46
|
attrs['name'] = parsed_args.name
|
|
42
47
|
attrs['ip_version'] = parsed_args.ip_version
|
|
43
48
|
if parsed_args.share:
|
|
@@ -61,7 +66,7 @@ def _get_attrs(client_manager, parsed_args):
|
|
|
61
66
|
class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
62
67
|
_description = _("Create a new Address Scope")
|
|
63
68
|
|
|
64
|
-
def get_parser(self, prog_name):
|
|
69
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
65
70
|
parser = super().get_parser(prog_name)
|
|
66
71
|
parser.add_argument(
|
|
67
72
|
'name', metavar="<name>", help=_("New address scope name")
|
|
@@ -96,7 +101,9 @@ class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
96
101
|
|
|
97
102
|
return parser
|
|
98
103
|
|
|
99
|
-
def take_action(
|
|
104
|
+
def take_action(
|
|
105
|
+
self, parsed_args: argparse.Namespace
|
|
106
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
100
107
|
client = self.app.client_manager.network
|
|
101
108
|
attrs = _get_attrs(self.app.client_manager, parsed_args)
|
|
102
109
|
attrs.update(
|
|
@@ -112,7 +119,7 @@ class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
112
119
|
class DeleteAddressScope(command.Command):
|
|
113
120
|
_description = _("Delete address scope(s)")
|
|
114
121
|
|
|
115
|
-
def get_parser(self, prog_name):
|
|
122
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
116
123
|
parser = super().get_parser(prog_name)
|
|
117
124
|
parser.add_argument(
|
|
118
125
|
'address_scope',
|
|
@@ -123,7 +130,7 @@ class DeleteAddressScope(command.Command):
|
|
|
123
130
|
|
|
124
131
|
return parser
|
|
125
132
|
|
|
126
|
-
def take_action(self, parsed_args):
|
|
133
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
127
134
|
client = self.app.client_manager.network
|
|
128
135
|
result = 0
|
|
129
136
|
|
|
@@ -154,7 +161,7 @@ class DeleteAddressScope(command.Command):
|
|
|
154
161
|
class ListAddressScope(command.Lister):
|
|
155
162
|
_description = _("List address scopes")
|
|
156
163
|
|
|
157
|
-
def get_parser(self, prog_name):
|
|
164
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
158
165
|
parser = super().get_parser(prog_name)
|
|
159
166
|
|
|
160
167
|
parser.add_argument(
|
|
@@ -196,7 +203,9 @@ class ListAddressScope(command.Lister):
|
|
|
196
203
|
)
|
|
197
204
|
return parser
|
|
198
205
|
|
|
199
|
-
def take_action(
|
|
206
|
+
def take_action(
|
|
207
|
+
self, parsed_args: argparse.Namespace
|
|
208
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
200
209
|
client = self.app.client_manager.network
|
|
201
210
|
columns = (
|
|
202
211
|
'id',
|
|
@@ -249,7 +258,7 @@ class ListAddressScope(command.Lister):
|
|
|
249
258
|
class SetAddressScope(common.NeutronCommandWithExtraArgs):
|
|
250
259
|
_description = _("Set address scope properties")
|
|
251
260
|
|
|
252
|
-
def get_parser(self, prog_name):
|
|
261
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
253
262
|
parser = super().get_parser(prog_name)
|
|
254
263
|
parser.add_argument(
|
|
255
264
|
'address_scope',
|
|
@@ -273,7 +282,7 @@ class SetAddressScope(common.NeutronCommandWithExtraArgs):
|
|
|
273
282
|
|
|
274
283
|
return parser
|
|
275
284
|
|
|
276
|
-
def take_action(self, parsed_args):
|
|
285
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
277
286
|
client = self.app.client_manager.network
|
|
278
287
|
obj = client.find_address_scope(
|
|
279
288
|
parsed_args.address_scope, ignore_missing=False
|
|
@@ -294,7 +303,7 @@ class SetAddressScope(common.NeutronCommandWithExtraArgs):
|
|
|
294
303
|
class ShowAddressScope(command.ShowOne):
|
|
295
304
|
_description = _("Display address scope details")
|
|
296
305
|
|
|
297
|
-
def get_parser(self, prog_name):
|
|
306
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
298
307
|
parser = super().get_parser(prog_name)
|
|
299
308
|
parser.add_argument(
|
|
300
309
|
'address_scope',
|
|
@@ -304,7 +313,9 @@ class ShowAddressScope(command.ShowOne):
|
|
|
304
313
|
|
|
305
314
|
return parser
|
|
306
315
|
|
|
307
|
-
def take_action(
|
|
316
|
+
def take_action(
|
|
317
|
+
self, parsed_args: argparse.Namespace
|
|
318
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
308
319
|
client = self.app.client_manager.network
|
|
309
320
|
obj = client.find_address_scope(
|
|
310
321
|
parsed_args.address_scope, ignore_missing=False
|