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,463 @@
|
|
|
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
|
+
import typing as ty
|
|
19
|
+
|
|
20
|
+
from osc_lib.cli import format_columns
|
|
21
|
+
from osc_lib.cli import identity as osc_id
|
|
22
|
+
from osc_lib.cli.parseractions import KeyValueAction
|
|
23
|
+
from osc_lib import exceptions
|
|
24
|
+
from osc_lib import utils as osc_utils
|
|
25
|
+
from osc_lib.utils import columns as column_util
|
|
26
|
+
|
|
27
|
+
from openstackclient import command
|
|
28
|
+
from openstackclient.i18n import _
|
|
29
|
+
|
|
30
|
+
LOG = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
_attr_map = (
|
|
33
|
+
('id', 'ID', column_util.LIST_BOTH),
|
|
34
|
+
('project_id', 'Project', column_util.LIST_LONG_ONLY),
|
|
35
|
+
('name', 'Name', column_util.LIST_BOTH),
|
|
36
|
+
('type', 'Type', column_util.LIST_BOTH),
|
|
37
|
+
('route_targets', 'Route Targets', column_util.LIST_LONG_ONLY),
|
|
38
|
+
('import_targets', 'Import Targets', column_util.LIST_LONG_ONLY),
|
|
39
|
+
('export_targets', 'Export Targets', column_util.LIST_LONG_ONLY),
|
|
40
|
+
(
|
|
41
|
+
'route_distinguishers',
|
|
42
|
+
'Route Distinguishers',
|
|
43
|
+
column_util.LIST_LONG_ONLY,
|
|
44
|
+
),
|
|
45
|
+
('networks', 'Associated Networks', column_util.LIST_LONG_ONLY),
|
|
46
|
+
('routers', 'Associated Routers', column_util.LIST_LONG_ONLY),
|
|
47
|
+
('ports', 'Associated Ports', column_util.LIST_LONG_ONLY),
|
|
48
|
+
('vni', 'VNI', column_util.LIST_LONG_ONLY),
|
|
49
|
+
('local_pref', 'Local Pref', column_util.LIST_LONG_ONLY),
|
|
50
|
+
)
|
|
51
|
+
_formatters = {
|
|
52
|
+
'route_targets': format_columns.ListColumn,
|
|
53
|
+
'import_targets': format_columns.ListColumn,
|
|
54
|
+
'export_targets': format_columns.ListColumn,
|
|
55
|
+
'route_distinguishers': format_columns.ListColumn,
|
|
56
|
+
'networks': format_columns.ListColumn,
|
|
57
|
+
'routers': format_columns.ListColumn,
|
|
58
|
+
'ports': format_columns.ListColumn,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _get_columns(item):
|
|
63
|
+
column_map: dict[str, str] = {}
|
|
64
|
+
hidden_columns = ['location', 'tenant_id']
|
|
65
|
+
return osc_utils.get_osc_show_columns_for_sdk_resource(
|
|
66
|
+
item, column_map, hidden_columns
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _get_common_parser(parser, update=None):
|
|
71
|
+
"""Adds to parser arguments common to create, set and unset commands.
|
|
72
|
+
|
|
73
|
+
:params ArgumentParser parser: argparse object contains all command's
|
|
74
|
+
arguments
|
|
75
|
+
:params string update: Determines if it is a create command (value: None),
|
|
76
|
+
it is a set command (value: 'set') or if it is an unset command (value:
|
|
77
|
+
'unset')
|
|
78
|
+
"""
|
|
79
|
+
ADD_RT = _("Add Route Target to import/export list")
|
|
80
|
+
REMOVE_RT = _("Remove Route Target from import/export list")
|
|
81
|
+
ADD_IMPORT_RT = _("Add Route Target to import list")
|
|
82
|
+
DEL_IMPORT_RT = _("Remove Route Target from import list")
|
|
83
|
+
ADD_EXPORT_RT = _("Add Route Target to export list")
|
|
84
|
+
DEL_EXPORT_RT = _("Remove Route Target from export list")
|
|
85
|
+
ADD_RD = _(
|
|
86
|
+
"Add Route Distinguisher to the list of Route Distinguishers "
|
|
87
|
+
"from which a Route Distinguishers will be picked from to "
|
|
88
|
+
"advertise a VPN route"
|
|
89
|
+
)
|
|
90
|
+
REMOVE_RD = _(
|
|
91
|
+
"Remove Route Distinguisher from the list of Route "
|
|
92
|
+
"Distinguishers from which a Route Distinguishers will be "
|
|
93
|
+
"picked from to advertise a VPN route"
|
|
94
|
+
)
|
|
95
|
+
REPEAT_RT = _("repeat option for multiple Route Targets")
|
|
96
|
+
REPEAT_RD = _("repeat option for multiple Route Distinguishers")
|
|
97
|
+
|
|
98
|
+
def is_appended():
|
|
99
|
+
return update is None or update == 'set'
|
|
100
|
+
|
|
101
|
+
if update is None or update == 'set':
|
|
102
|
+
parser.add_argument(
|
|
103
|
+
'--name',
|
|
104
|
+
metavar="<name>",
|
|
105
|
+
help=_("Name of the BGP VPN"),
|
|
106
|
+
)
|
|
107
|
+
parser.add_argument(
|
|
108
|
+
'--route-target',
|
|
109
|
+
dest='route_targets',
|
|
110
|
+
action='append',
|
|
111
|
+
metavar="<route-target>",
|
|
112
|
+
help=f"{ADD_RT if is_appended() else REMOVE_RT} ({REPEAT_RT})",
|
|
113
|
+
)
|
|
114
|
+
if update:
|
|
115
|
+
parser.add_argument(
|
|
116
|
+
'--no-route-target' if update == 'set' else '--all-route-target',
|
|
117
|
+
dest='purge_route_target',
|
|
118
|
+
action='store_true',
|
|
119
|
+
help=_('Empty route target list'),
|
|
120
|
+
)
|
|
121
|
+
import_target_action = ADD_IMPORT_RT if is_appended() else DEL_IMPORT_RT
|
|
122
|
+
parser.add_argument(
|
|
123
|
+
'--import-target',
|
|
124
|
+
dest='import_targets',
|
|
125
|
+
action='append',
|
|
126
|
+
metavar="<import-target>",
|
|
127
|
+
help=f"{import_target_action} ({REPEAT_RT})",
|
|
128
|
+
)
|
|
129
|
+
if update:
|
|
130
|
+
parser.add_argument(
|
|
131
|
+
'--no-import-target' if update == 'set' else '--all-import-target',
|
|
132
|
+
dest='purge_import_target',
|
|
133
|
+
action='store_true',
|
|
134
|
+
help=_('Empty import route target list'),
|
|
135
|
+
)
|
|
136
|
+
export_target_action = ADD_EXPORT_RT if is_appended() else DEL_EXPORT_RT
|
|
137
|
+
parser.add_argument(
|
|
138
|
+
'--export-target',
|
|
139
|
+
dest='export_targets',
|
|
140
|
+
action='append',
|
|
141
|
+
metavar="<export-target>",
|
|
142
|
+
help=f"{export_target_action} ({REPEAT_RT})",
|
|
143
|
+
)
|
|
144
|
+
if update:
|
|
145
|
+
parser.add_argument(
|
|
146
|
+
'--no-export-target' if update == 'set' else '--all-export-target',
|
|
147
|
+
dest='purge_export_target',
|
|
148
|
+
action='store_true',
|
|
149
|
+
help=_('Empty export route target list'),
|
|
150
|
+
)
|
|
151
|
+
parser.add_argument(
|
|
152
|
+
'--route-distinguisher',
|
|
153
|
+
dest='route_distinguishers',
|
|
154
|
+
action='append',
|
|
155
|
+
metavar="<route-distinguisher>",
|
|
156
|
+
help=f"{ADD_RD if is_appended() else REMOVE_RD} ({REPEAT_RD})",
|
|
157
|
+
)
|
|
158
|
+
if update:
|
|
159
|
+
parser.add_argument(
|
|
160
|
+
'--no-route-distinguisher'
|
|
161
|
+
if update == 'set'
|
|
162
|
+
else '--all-route-distinguisher',
|
|
163
|
+
dest='purge_route_distinguisher',
|
|
164
|
+
action='store_true',
|
|
165
|
+
help=_('Empty route distinguisher list'),
|
|
166
|
+
)
|
|
167
|
+
parser.add_argument(
|
|
168
|
+
'--vni',
|
|
169
|
+
type=int,
|
|
170
|
+
help=_(
|
|
171
|
+
'VXLAN Network Identifier to be used for this BGPVPN '
|
|
172
|
+
'when a VXLAN encapsulation is used'
|
|
173
|
+
),
|
|
174
|
+
)
|
|
175
|
+
parser.add_argument(
|
|
176
|
+
'--local-pref',
|
|
177
|
+
type=int,
|
|
178
|
+
dest='local_pref',
|
|
179
|
+
help=_(
|
|
180
|
+
'Default BGP LOCAL_PREF to use in route advertisements'
|
|
181
|
+
'towards this BGPVPN.'
|
|
182
|
+
),
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _args2body(client_manager, id, action, args):
|
|
187
|
+
|
|
188
|
+
if not (
|
|
189
|
+
args.purge_route_target
|
|
190
|
+
and args.purge_import_target
|
|
191
|
+
and args.purge_export_target
|
|
192
|
+
and args.purge_route_distinguisher
|
|
193
|
+
) and (
|
|
194
|
+
args.route_targets
|
|
195
|
+
or args.import_targets
|
|
196
|
+
or args.export_targets
|
|
197
|
+
or args.route_distinguishers
|
|
198
|
+
):
|
|
199
|
+
bgpvpn = client_manager.network.get_bgpvpn(id)
|
|
200
|
+
|
|
201
|
+
attrs: dict[str, ty.Any] = {}
|
|
202
|
+
|
|
203
|
+
if 'name' in args and args.name is not None:
|
|
204
|
+
attrs['name'] = str(args.name)
|
|
205
|
+
|
|
206
|
+
if 'vni' in args and args.vni is not None:
|
|
207
|
+
attrs['vni'] = args.vni
|
|
208
|
+
|
|
209
|
+
if 'local_pref' in args and args.local_pref is not None:
|
|
210
|
+
attrs['local_pref'] = args.local_pref
|
|
211
|
+
|
|
212
|
+
if args.purge_route_target:
|
|
213
|
+
attrs['route_targets'] = []
|
|
214
|
+
elif args.route_targets:
|
|
215
|
+
if action == 'set':
|
|
216
|
+
attrs['route_targets'] = list(
|
|
217
|
+
set(bgpvpn['route_targets']) | set(args.route_targets)
|
|
218
|
+
)
|
|
219
|
+
elif action == 'unset':
|
|
220
|
+
attrs['route_targets'] = list(
|
|
221
|
+
set(bgpvpn['route_targets']) - set(args.route_targets)
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
if args.purge_import_target:
|
|
225
|
+
attrs['import_targets'] = []
|
|
226
|
+
elif args.import_targets:
|
|
227
|
+
if action == 'set':
|
|
228
|
+
attrs['import_targets'] = list(
|
|
229
|
+
set(bgpvpn['import_targets']) | set(args.import_targets)
|
|
230
|
+
)
|
|
231
|
+
elif action == 'unset':
|
|
232
|
+
attrs['import_targets'] = list(
|
|
233
|
+
set(bgpvpn['import_targets']) - set(args.import_targets)
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
if args.purge_export_target:
|
|
237
|
+
attrs['export_targets'] = []
|
|
238
|
+
elif args.export_targets:
|
|
239
|
+
if action == 'set':
|
|
240
|
+
attrs['export_targets'] = list(
|
|
241
|
+
set(bgpvpn['export_targets']) | set(args.export_targets)
|
|
242
|
+
)
|
|
243
|
+
elif action == 'unset':
|
|
244
|
+
attrs['export_targets'] = list(
|
|
245
|
+
set(bgpvpn['export_targets']) - set(args.export_targets)
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
if args.purge_route_distinguisher:
|
|
249
|
+
attrs['route_distinguishers'] = []
|
|
250
|
+
elif args.route_distinguishers:
|
|
251
|
+
if action == 'set':
|
|
252
|
+
attrs['route_distinguishers'] = list(
|
|
253
|
+
set(bgpvpn['route_distinguishers'])
|
|
254
|
+
| set(args.route_distinguishers)
|
|
255
|
+
)
|
|
256
|
+
elif action == 'unset':
|
|
257
|
+
attrs['route_distinguishers'] = list(
|
|
258
|
+
set(bgpvpn['route_distinguishers'])
|
|
259
|
+
- set(args.route_distinguishers)
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
return attrs
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class CreateBgpvpn(command.ShowOne):
|
|
266
|
+
_description = _("Create BGP VPN resource")
|
|
267
|
+
|
|
268
|
+
def get_parser(self, prog_name):
|
|
269
|
+
parser = super().get_parser(prog_name)
|
|
270
|
+
osc_id.add_project_owner_option_to_parser(parser)
|
|
271
|
+
_get_common_parser(parser)
|
|
272
|
+
parser.add_argument(
|
|
273
|
+
'--type',
|
|
274
|
+
default='l3',
|
|
275
|
+
choices=['l2', 'l3'],
|
|
276
|
+
help=_(
|
|
277
|
+
"BGP VPN type selection between IP VPN (l3) and Ethernet "
|
|
278
|
+
"VPN (l2) (default: l3)"
|
|
279
|
+
),
|
|
280
|
+
)
|
|
281
|
+
return parser
|
|
282
|
+
|
|
283
|
+
def take_action(self, parsed_args):
|
|
284
|
+
client = self.app.client_manager.network
|
|
285
|
+
attrs = {}
|
|
286
|
+
if parsed_args.name is not None:
|
|
287
|
+
attrs['name'] = str(parsed_args.name)
|
|
288
|
+
if parsed_args.type is not None:
|
|
289
|
+
attrs['type'] = parsed_args.type
|
|
290
|
+
if parsed_args.route_targets is not None:
|
|
291
|
+
attrs['route_targets'] = parsed_args.route_targets
|
|
292
|
+
if parsed_args.import_targets is not None:
|
|
293
|
+
attrs['import_targets'] = parsed_args.import_targets
|
|
294
|
+
if parsed_args.export_targets is not None:
|
|
295
|
+
attrs['export_targets'] = parsed_args.export_targets
|
|
296
|
+
if parsed_args.route_distinguishers is not None:
|
|
297
|
+
attrs['route_distinguishers'] = parsed_args.route_distinguishers
|
|
298
|
+
if parsed_args.vni is not None:
|
|
299
|
+
attrs['vni'] = parsed_args.vni
|
|
300
|
+
if parsed_args.local_pref is not None:
|
|
301
|
+
attrs['local_pref'] = parsed_args.local_pref
|
|
302
|
+
if 'project' in parsed_args and parsed_args.project is not None:
|
|
303
|
+
project_id = osc_id.find_project(
|
|
304
|
+
self.app.client_manager.sdk_connection,
|
|
305
|
+
parsed_args.project,
|
|
306
|
+
parsed_args.project_domain,
|
|
307
|
+
).id
|
|
308
|
+
attrs['project_id'] = project_id
|
|
309
|
+
obj = client.create_bgpvpn(**attrs)
|
|
310
|
+
display_columns, columns = _get_columns(obj)
|
|
311
|
+
data = osc_utils.get_dict_properties(
|
|
312
|
+
obj, columns, formatters=_formatters
|
|
313
|
+
)
|
|
314
|
+
return display_columns, data
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
class SetBgpvpn(command.Command):
|
|
318
|
+
_description = _("Set BGP VPN properties")
|
|
319
|
+
|
|
320
|
+
def get_parser(self, prog_name):
|
|
321
|
+
parser = super().get_parser(prog_name)
|
|
322
|
+
parser.add_argument(
|
|
323
|
+
'bgpvpn',
|
|
324
|
+
metavar="<bgpvpn>",
|
|
325
|
+
help=_("BGP VPN to update (name or ID)"),
|
|
326
|
+
)
|
|
327
|
+
_get_common_parser(parser, update='set')
|
|
328
|
+
return parser
|
|
329
|
+
|
|
330
|
+
def take_action(self, parsed_args):
|
|
331
|
+
client = self.app.client_manager.network
|
|
332
|
+
id = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)['id']
|
|
333
|
+
body = _args2body(self.app.client_manager, id, 'set', parsed_args)
|
|
334
|
+
client.update_bgpvpn(id, **body)
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class UnsetBgpvpn(command.Command):
|
|
338
|
+
_description = _("Unset BGP VPN properties")
|
|
339
|
+
|
|
340
|
+
def get_parser(self, prog_name):
|
|
341
|
+
parser = super().get_parser(prog_name)
|
|
342
|
+
parser.add_argument(
|
|
343
|
+
'bgpvpn',
|
|
344
|
+
metavar="<bgpvpn>",
|
|
345
|
+
help=_("BGP VPN to update (name or ID)"),
|
|
346
|
+
)
|
|
347
|
+
_get_common_parser(parser, update='unset')
|
|
348
|
+
return parser
|
|
349
|
+
|
|
350
|
+
def take_action(self, parsed_args):
|
|
351
|
+
client = self.app.client_manager.network
|
|
352
|
+
id = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)['id']
|
|
353
|
+
body = _args2body(self.app.client_manager, id, 'unset', parsed_args)
|
|
354
|
+
client.update_bgpvpn(id, **body)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
class DeleteBgpvpn(command.Command):
|
|
358
|
+
_description = _("Delete BGP VPN resource(s)")
|
|
359
|
+
|
|
360
|
+
def get_parser(self, prog_name):
|
|
361
|
+
parser = super().get_parser(prog_name)
|
|
362
|
+
parser.add_argument(
|
|
363
|
+
'bgpvpns',
|
|
364
|
+
metavar="<bgpvpn>",
|
|
365
|
+
nargs="+",
|
|
366
|
+
help=_("BGP VPN(s) to delete (name or ID)"),
|
|
367
|
+
)
|
|
368
|
+
return parser
|
|
369
|
+
|
|
370
|
+
def take_action(self, parsed_args):
|
|
371
|
+
client = self.app.client_manager.network
|
|
372
|
+
fails = 0
|
|
373
|
+
for id_or_name in parsed_args.bgpvpns:
|
|
374
|
+
try:
|
|
375
|
+
id = client.find_bgpvpn(id_or_name, ignore_missing=False)['id']
|
|
376
|
+
client.delete_bgpvpn(id)
|
|
377
|
+
LOG.warning("BGP VPN %(id)s deleted", {'id': id})
|
|
378
|
+
except Exception as e:
|
|
379
|
+
fails += 1
|
|
380
|
+
LOG.error(
|
|
381
|
+
"Failed to delete BGP VPN with name or ID "
|
|
382
|
+
"'%(id_or_name)s': %(e)s",
|
|
383
|
+
{'id_or_name': id_or_name, 'e': e},
|
|
384
|
+
)
|
|
385
|
+
if fails > 0:
|
|
386
|
+
msg = _("Failed to delete %(fails)s of %(total)s BGP VPN.") % {
|
|
387
|
+
'fails': fails,
|
|
388
|
+
'total': len(parsed_args.bgpvpns),
|
|
389
|
+
}
|
|
390
|
+
raise exceptions.CommandError(msg)
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
class ListBgpvpn(command.Lister):
|
|
394
|
+
_description = _("List BGP VPN resources")
|
|
395
|
+
|
|
396
|
+
def get_parser(self, prog_name):
|
|
397
|
+
parser = super().get_parser(prog_name)
|
|
398
|
+
osc_id.add_project_owner_option_to_parser(parser)
|
|
399
|
+
parser.add_argument(
|
|
400
|
+
'--long',
|
|
401
|
+
action='store_true',
|
|
402
|
+
help=_("List additional fields in output"),
|
|
403
|
+
)
|
|
404
|
+
parser.add_argument(
|
|
405
|
+
'--property',
|
|
406
|
+
metavar="<key=value>",
|
|
407
|
+
default=dict(),
|
|
408
|
+
help=_(
|
|
409
|
+
"Filter property to apply on returned BGP VPNs (repeat to "
|
|
410
|
+
"filter on multiple properties)"
|
|
411
|
+
),
|
|
412
|
+
action=KeyValueAction,
|
|
413
|
+
)
|
|
414
|
+
return parser
|
|
415
|
+
|
|
416
|
+
def take_action(self, parsed_args):
|
|
417
|
+
client = self.app.client_manager.network
|
|
418
|
+
params = {}
|
|
419
|
+
if parsed_args.project is not None:
|
|
420
|
+
project_id = osc_id.find_project(
|
|
421
|
+
self.app.client_manager.sdk_connection,
|
|
422
|
+
parsed_args.project,
|
|
423
|
+
parsed_args.project_domain,
|
|
424
|
+
).id
|
|
425
|
+
params['project_id'] = project_id
|
|
426
|
+
if parsed_args.property:
|
|
427
|
+
params.update(parsed_args.property)
|
|
428
|
+
objs = client.bgpvpns(**params)
|
|
429
|
+
headers, columns = column_util.get_column_definitions(
|
|
430
|
+
list(_attr_map), long_listing=parsed_args.long
|
|
431
|
+
)
|
|
432
|
+
return (
|
|
433
|
+
headers,
|
|
434
|
+
(
|
|
435
|
+
osc_utils.get_dict_properties(
|
|
436
|
+
s, columns, formatters=_formatters
|
|
437
|
+
)
|
|
438
|
+
for s in objs
|
|
439
|
+
),
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
class ShowBgpvpn(command.ShowOne):
|
|
444
|
+
_description = _("Show information of a given BGP VPN")
|
|
445
|
+
|
|
446
|
+
def get_parser(self, prog_name):
|
|
447
|
+
parser = super().get_parser(prog_name)
|
|
448
|
+
parser.add_argument(
|
|
449
|
+
'bgpvpn',
|
|
450
|
+
metavar="<bgpvpn>",
|
|
451
|
+
help=_("BGP VPN to display (name or ID)"),
|
|
452
|
+
)
|
|
453
|
+
return parser
|
|
454
|
+
|
|
455
|
+
def take_action(self, parsed_args):
|
|
456
|
+
client = self.app.client_manager.network
|
|
457
|
+
id = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)['id']
|
|
458
|
+
obj = client.get_bgpvpn(id)
|
|
459
|
+
display_columns, columns = _get_columns(obj)
|
|
460
|
+
data = osc_utils.get_dict_properties(
|
|
461
|
+
obj, columns, formatters=_formatters
|
|
462
|
+
)
|
|
463
|
+
return display_columns, data
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
BGPVPN = 'bgpvpn'
|
|
18
|
+
BGPVPNS = f'{BGPVPN}s'
|
|
19
|
+
|
|
20
|
+
NETWORK_RESOURCE_NAME = 'network'
|
|
21
|
+
NETWORK_ASSOCIATION = f'{NETWORK_RESOURCE_NAME}_association'
|
|
22
|
+
NETWORK_ASSOCIATIONS = f'{NETWORK_ASSOCIATION}s'
|
|
23
|
+
|
|
24
|
+
ROUTER_RESOURCE_NAME = 'router'
|
|
25
|
+
ROUTER_ASSOCIATION = f'{ROUTER_RESOURCE_NAME}_association'
|
|
26
|
+
ROUTER_ASSOCIATIONS = f'{ROUTER_ASSOCIATION}s'
|
|
27
|
+
|
|
28
|
+
PORT_RESOURCE_NAME = 'port'
|
|
29
|
+
PORT_ASSOCIATION = f'{PORT_RESOURCE_NAME}_association'
|
|
30
|
+
PORT_ASSOCIATIONS = f'{PORT_ASSOCIATION}s'
|