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
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
# Copyright (c) 2016 Juniper networks Inc.
|
|
2
|
+
# All Rights Reserved.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
5
|
+
# not use this file except in compliance with the License. You may obtain
|
|
6
|
+
# a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
13
|
+
# License for the specific language governing permissions and limitations
|
|
14
|
+
# under the License.
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
import logging
|
|
18
|
+
|
|
19
|
+
from osc_lib.cli import identity as osc_id
|
|
20
|
+
from osc_lib.cli import parseractions
|
|
21
|
+
from osc_lib import exceptions
|
|
22
|
+
from osc_lib import utils as osc_utils
|
|
23
|
+
from osc_lib.utils import columns as column_util
|
|
24
|
+
|
|
25
|
+
from openstackclient import command
|
|
26
|
+
from openstackclient.i18n import _
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
LOG = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
_attr_map = (
|
|
32
|
+
('id', 'ID', column_util.LIST_BOTH),
|
|
33
|
+
('project_id', 'Project', column_util.LIST_LONG_ONLY),
|
|
34
|
+
('router_id', 'Router ID', column_util.LIST_BOTH),
|
|
35
|
+
(
|
|
36
|
+
'advertise_extra_routes',
|
|
37
|
+
'Advertise extra routes',
|
|
38
|
+
column_util.LIST_LONG_ONLY,
|
|
39
|
+
),
|
|
40
|
+
)
|
|
41
|
+
_formatters: dict[str, osc_utils.FormatterT] = {}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _get_columns(item):
|
|
45
|
+
column_map: dict[str, str] = {}
|
|
46
|
+
hidden_columns = ['location', 'name', 'tenant_id']
|
|
47
|
+
return osc_utils.get_osc_show_columns_for_sdk_resource(
|
|
48
|
+
item, column_map, hidden_columns
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _get_common_parser(parser, action):
|
|
53
|
+
"""Adds to parser arguments common to create, set and unset commands.
|
|
54
|
+
|
|
55
|
+
:params ArgumentParser parser: argparse object contains all command's
|
|
56
|
+
arguments
|
|
57
|
+
:params string action: 'create', 'set' or 'unset'
|
|
58
|
+
"""
|
|
59
|
+
ADVERTISE_ROUTES = _("Routes will be advertised to the BGP VPN%s") % (
|
|
60
|
+
_(' (default)') if action == 'create' else ""
|
|
61
|
+
)
|
|
62
|
+
NOT_ADVERTISE_ROUTES = _(
|
|
63
|
+
"Routes from the router will not be advertised to the BGP VPN"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
group_advertise_extra_routes = parser.add_mutually_exclusive_group()
|
|
67
|
+
group_advertise_extra_routes.add_argument(
|
|
68
|
+
'--advertise_extra_routes',
|
|
69
|
+
action='store_true',
|
|
70
|
+
help=NOT_ADVERTISE_ROUTES if action == 'unset' else ADVERTISE_ROUTES,
|
|
71
|
+
)
|
|
72
|
+
group_advertise_extra_routes.add_argument(
|
|
73
|
+
'--no-advertise_extra_routes',
|
|
74
|
+
action='store_true',
|
|
75
|
+
help=ADVERTISE_ROUTES if action == 'unset' else NOT_ADVERTISE_ROUTES,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _args2body(action, args):
|
|
80
|
+
attrs = {'advertise_extra_routes': False}
|
|
81
|
+
if args.advertise_extra_routes:
|
|
82
|
+
attrs['advertise_extra_routes'] = action != 'unset'
|
|
83
|
+
elif args.no_advertise_extra_routes:
|
|
84
|
+
attrs['advertise_extra_routes'] = action == 'unset'
|
|
85
|
+
return attrs
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class CreateBgpvpnRouterAssoc(command.ShowOne):
|
|
89
|
+
_description = _("Create a BGP VPN router association")
|
|
90
|
+
|
|
91
|
+
def get_parser(self, prog_name):
|
|
92
|
+
parser = super().get_parser(prog_name)
|
|
93
|
+
osc_id.add_project_owner_option_to_parser(parser)
|
|
94
|
+
parser.add_argument(
|
|
95
|
+
'bgpvpn',
|
|
96
|
+
metavar="<bgpvpn>",
|
|
97
|
+
help=_("BGP VPN to apply the router association (name or ID)"),
|
|
98
|
+
)
|
|
99
|
+
parser.add_argument(
|
|
100
|
+
'resource',
|
|
101
|
+
metavar="<router>",
|
|
102
|
+
help=_("Router to associate the BGP VPN (name or ID)"),
|
|
103
|
+
)
|
|
104
|
+
_get_common_parser(parser, 'create')
|
|
105
|
+
return parser
|
|
106
|
+
|
|
107
|
+
def take_action(self, parsed_args):
|
|
108
|
+
client = self.app.client_manager.network
|
|
109
|
+
bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
|
|
110
|
+
router = client.find_router(parsed_args.resource, ignore_missing=False)
|
|
111
|
+
body = {'router_id': router['id']}
|
|
112
|
+
if 'project' in parsed_args and parsed_args.project is not None:
|
|
113
|
+
project_id = osc_id.find_project(
|
|
114
|
+
self.app.client_manager.sdk_connection,
|
|
115
|
+
parsed_args.project,
|
|
116
|
+
parsed_args.project_domain,
|
|
117
|
+
).id
|
|
118
|
+
body['project_id'] = project_id
|
|
119
|
+
|
|
120
|
+
body.update(_args2body('create', parsed_args))
|
|
121
|
+
|
|
122
|
+
obj = client.create_bgpvpn_router_association(bgpvpn['id'], **body)
|
|
123
|
+
display_columns, columns = _get_columns(obj)
|
|
124
|
+
data = osc_utils.get_dict_properties(
|
|
125
|
+
obj, columns, formatters=_formatters
|
|
126
|
+
)
|
|
127
|
+
return display_columns, data
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class SetBgpvpnRouterAssoc(command.Command):
|
|
131
|
+
_description = _("Set BGP VPN router association properties")
|
|
132
|
+
_action = 'set'
|
|
133
|
+
|
|
134
|
+
def get_parser(self, prog_name):
|
|
135
|
+
parser = super().get_parser(prog_name)
|
|
136
|
+
parser.add_argument(
|
|
137
|
+
'resource_association_id',
|
|
138
|
+
metavar="<router association ID>",
|
|
139
|
+
help=_("Router association ID to update"),
|
|
140
|
+
)
|
|
141
|
+
parser.add_argument(
|
|
142
|
+
'bgpvpn',
|
|
143
|
+
metavar="<bgpvpn>",
|
|
144
|
+
help=_("BGP VPN the router association belongs to (name or ID)"),
|
|
145
|
+
)
|
|
146
|
+
_get_common_parser(parser, self._action)
|
|
147
|
+
return parser
|
|
148
|
+
|
|
149
|
+
def take_action(self, parsed_args):
|
|
150
|
+
client = self.app.client_manager.network
|
|
151
|
+
bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
|
|
152
|
+
body = _args2body(self._action, parsed_args)
|
|
153
|
+
client.update_bgpvpn_router_association(
|
|
154
|
+
bgpvpn['id'], parsed_args.resource_association_id, **body
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class UnsetBgpvpnRouterAssoc(SetBgpvpnRouterAssoc):
|
|
159
|
+
_description = _("Unset BGP VPN router association properties")
|
|
160
|
+
_action = 'unset'
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class DeleteBgpvpnRouterAssoc(command.Command):
|
|
164
|
+
_description = _(
|
|
165
|
+
"Delete a BGP VPN router association(s) for a given BGP VPN"
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
def get_parser(self, prog_name):
|
|
169
|
+
parser = super().get_parser(prog_name)
|
|
170
|
+
parser.add_argument(
|
|
171
|
+
'resource_association_ids',
|
|
172
|
+
metavar="<router association ID>",
|
|
173
|
+
nargs="+",
|
|
174
|
+
help=_("Router association ID(s) to remove"),
|
|
175
|
+
)
|
|
176
|
+
parser.add_argument(
|
|
177
|
+
'bgpvpn',
|
|
178
|
+
metavar="<bgpvpn>",
|
|
179
|
+
help=_("BGP VPN the router association belongs to (name or ID)"),
|
|
180
|
+
)
|
|
181
|
+
return parser
|
|
182
|
+
|
|
183
|
+
def take_action(self, parsed_args):
|
|
184
|
+
client = self.app.client_manager.network
|
|
185
|
+
bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
|
|
186
|
+
fails = 0
|
|
187
|
+
for id in parsed_args.resource_association_ids:
|
|
188
|
+
try:
|
|
189
|
+
client.delete_bgpvpn_router_association(bgpvpn['id'], id)
|
|
190
|
+
LOG.warning(
|
|
191
|
+
"Router association %(id)s deleted",
|
|
192
|
+
{'id': id},
|
|
193
|
+
)
|
|
194
|
+
except Exception as e:
|
|
195
|
+
fails += 1
|
|
196
|
+
LOG.error(
|
|
197
|
+
"Failed to delete router "
|
|
198
|
+
"association with ID '%(id)s': %(e)s",
|
|
199
|
+
{'id': id, 'e': e},
|
|
200
|
+
)
|
|
201
|
+
if fails > 0:
|
|
202
|
+
msg = _(
|
|
203
|
+
"Failed to delete %(fails)s of %(total)s "
|
|
204
|
+
"router BGP VPN association(s)."
|
|
205
|
+
) % {
|
|
206
|
+
'fails': fails,
|
|
207
|
+
'total': len(parsed_args.resource_association_ids),
|
|
208
|
+
}
|
|
209
|
+
raise exceptions.CommandError(msg)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class ListBgpvpnRouterAssoc(command.Lister):
|
|
213
|
+
_description = _("List BGP VPN router associations for a given BGP VPN")
|
|
214
|
+
|
|
215
|
+
def get_parser(self, prog_name):
|
|
216
|
+
parser = super().get_parser(prog_name)
|
|
217
|
+
parser.add_argument(
|
|
218
|
+
'bgpvpn',
|
|
219
|
+
metavar="<bgpvpn>",
|
|
220
|
+
help=_("BGP VPN listed associations belong to (name or ID)"),
|
|
221
|
+
)
|
|
222
|
+
parser.add_argument(
|
|
223
|
+
'--long',
|
|
224
|
+
action='store_true',
|
|
225
|
+
help=_("List additional fields in output"),
|
|
226
|
+
)
|
|
227
|
+
parser.add_argument(
|
|
228
|
+
'--property',
|
|
229
|
+
metavar="<key=value>",
|
|
230
|
+
help=_(
|
|
231
|
+
"Filter property to apply on returned BGP VPNs (repeat to "
|
|
232
|
+
"filter on multiple properties)"
|
|
233
|
+
),
|
|
234
|
+
action=parseractions.KeyValueAction,
|
|
235
|
+
)
|
|
236
|
+
return parser
|
|
237
|
+
|
|
238
|
+
def take_action(self, parsed_args):
|
|
239
|
+
client = self.app.client_manager.network
|
|
240
|
+
bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
|
|
241
|
+
params = {}
|
|
242
|
+
if parsed_args.property:
|
|
243
|
+
params.update(parsed_args.property)
|
|
244
|
+
objs = client.bgpvpn_router_associations(
|
|
245
|
+
bgpvpn['id'], retrieve_all=True, **params
|
|
246
|
+
)
|
|
247
|
+
headers, columns = column_util.get_column_definitions(
|
|
248
|
+
list(_attr_map), long_listing=parsed_args.long
|
|
249
|
+
)
|
|
250
|
+
return (
|
|
251
|
+
headers,
|
|
252
|
+
(
|
|
253
|
+
osc_utils.get_dict_properties(
|
|
254
|
+
s, columns, formatters=_formatters
|
|
255
|
+
)
|
|
256
|
+
for s in objs
|
|
257
|
+
),
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class ShowBgpvpnRouterAssoc(command.ShowOne):
|
|
262
|
+
_description = _("Show information of a given BGP VPN router association")
|
|
263
|
+
|
|
264
|
+
def get_parser(self, prog_name):
|
|
265
|
+
parser = super().get_parser(prog_name)
|
|
266
|
+
parser.add_argument(
|
|
267
|
+
'resource_association_id',
|
|
268
|
+
metavar="<router association ID>",
|
|
269
|
+
help=_("Router association ID to look up"),
|
|
270
|
+
)
|
|
271
|
+
parser.add_argument(
|
|
272
|
+
'bgpvpn',
|
|
273
|
+
metavar="<bgpvpn>",
|
|
274
|
+
help=_("BGP VPN the association belongs to (name or ID)"),
|
|
275
|
+
)
|
|
276
|
+
return parser
|
|
277
|
+
|
|
278
|
+
def take_action(self, parsed_args):
|
|
279
|
+
client = self.app.client_manager.network
|
|
280
|
+
bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
|
|
281
|
+
obj = client.get_bgpvpn_router_association(
|
|
282
|
+
bgpvpn['id'], parsed_args.resource_association_id
|
|
283
|
+
)
|
|
284
|
+
display_columns, columns = _get_columns(obj)
|
|
285
|
+
data = osc_utils.get_dict_properties(
|
|
286
|
+
obj, columns, formatters=_formatters
|
|
287
|
+
)
|
|
288
|
+
return display_columns, data
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
|
|
14
14
|
"""Default Security Group Rule 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.cli import parseractions
|
|
19
22
|
from osc_lib import exceptions
|
|
@@ -27,7 +30,7 @@ from openstackclient.network import utils as network_utils
|
|
|
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', 'name', 'revision_number']
|
|
32
35
|
return utils.get_osc_show_columns_for_sdk_resource(
|
|
33
36
|
item, {}, hidden_columns
|
|
@@ -44,7 +47,7 @@ class CreateDefaultSecurityGroupRule(
|
|
|
44
47
|
groups.
|
|
45
48
|
"""
|
|
46
49
|
|
|
47
|
-
def get_parser(self, prog_name):
|
|
50
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
48
51
|
parser = super().get_parser(prog_name)
|
|
49
52
|
|
|
50
53
|
parser.add_argument(
|
|
@@ -149,7 +152,9 @@ class CreateDefaultSecurityGroupRule(
|
|
|
149
152
|
)
|
|
150
153
|
return parser
|
|
151
154
|
|
|
152
|
-
def take_action(
|
|
155
|
+
def take_action(
|
|
156
|
+
self, parsed_args: argparse.Namespace
|
|
157
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
153
158
|
client = self.app.client_manager.network
|
|
154
159
|
# Build the create attributes.
|
|
155
160
|
attrs = {}
|
|
@@ -236,7 +241,7 @@ class DeleteDefaultSecurityGroupRule(command.Command):
|
|
|
236
241
|
default security groups.
|
|
237
242
|
"""
|
|
238
243
|
|
|
239
|
-
def get_parser(self, prog_name):
|
|
244
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
240
245
|
parser = super().get_parser(prog_name)
|
|
241
246
|
parser.add_argument(
|
|
242
247
|
'rule',
|
|
@@ -246,7 +251,7 @@ class DeleteDefaultSecurityGroupRule(command.Command):
|
|
|
246
251
|
)
|
|
247
252
|
return parser
|
|
248
253
|
|
|
249
|
-
def take_action(self, parsed_args):
|
|
254
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
250
255
|
result = 0
|
|
251
256
|
client = self.app.client_manager.network
|
|
252
257
|
for r in parsed_args.rule:
|
|
@@ -281,7 +286,7 @@ class ListDefaultSecurityGroupRule(command.Lister):
|
|
|
281
286
|
security groups.
|
|
282
287
|
"""
|
|
283
288
|
|
|
284
|
-
def _format_network_security_group_rule(self, rule):
|
|
289
|
+
def _format_network_security_group_rule(self, rule: Any) -> Any:
|
|
285
290
|
"""Transform the SDK DefaultSecurityGroupRule object to a dict
|
|
286
291
|
|
|
287
292
|
The SDK object gets in the way of reformatting columns...
|
|
@@ -292,7 +297,7 @@ class ListDefaultSecurityGroupRule(command.Lister):
|
|
|
292
297
|
rule['remote_ip_prefix'] = network_utils.format_remote_ip_prefix(rule)
|
|
293
298
|
return rule
|
|
294
299
|
|
|
295
|
-
def get_parser(self, prog_name):
|
|
300
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
296
301
|
parser = super().get_parser(prog_name)
|
|
297
302
|
|
|
298
303
|
parser.add_argument(
|
|
@@ -334,7 +339,9 @@ class ListDefaultSecurityGroupRule(command.Lister):
|
|
|
334
339
|
)
|
|
335
340
|
return parser
|
|
336
341
|
|
|
337
|
-
def take_action(
|
|
342
|
+
def take_action(
|
|
343
|
+
self, parsed_args: argparse.Namespace
|
|
344
|
+
) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
|
|
338
345
|
client = self.app.client_manager.network
|
|
339
346
|
column_headers = (
|
|
340
347
|
'ID',
|
|
@@ -394,7 +401,7 @@ class ShowDefaultSecurityGroupRule(command.ShowOne):
|
|
|
394
401
|
created. This rule may not be present on existing default security groups.
|
|
395
402
|
"""
|
|
396
403
|
|
|
397
|
-
def get_parser(self, prog_name):
|
|
404
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
398
405
|
parser = super().get_parser(prog_name)
|
|
399
406
|
parser.add_argument(
|
|
400
407
|
'rule',
|
|
@@ -403,7 +410,9 @@ class ShowDefaultSecurityGroupRule(command.ShowOne):
|
|
|
403
410
|
)
|
|
404
411
|
return parser
|
|
405
412
|
|
|
406
|
-
def take_action(
|
|
413
|
+
def take_action(
|
|
414
|
+
self, parsed_args: argparse.Namespace
|
|
415
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
407
416
|
client = self.app.client_manager.network
|
|
408
417
|
obj = client.find_default_security_group_rule(
|
|
409
418
|
parsed_args.rule, ignore_missing=False
|