python-openstackclient 9.0.0__py3-none-any.whl → 10.1.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 +59 -43
- 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 +36 -34
- openstackclient/common/pagination.py +50 -6
- openstackclient/common/progressbar.py +7 -6
- openstackclient/common/project_cleanup.py +11 -6
- openstackclient/common/quota.py +105 -103
- 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 +42 -22
- openstackclient/compute/v2/host.py +14 -6
- openstackclient/compute/v2/hypervisor.py +16 -5
- openstackclient/compute/v2/hypervisor_stats.py +10 -2
- openstackclient/compute/v2/keypair.py +35 -16
- openstackclient/compute/v2/server.py +268 -179
- openstackclient/compute/v2/server_backup.py +10 -4
- openstackclient/compute/v2/server_event.py +28 -12
- openstackclient/compute/v2/server_group.py +23 -11
- openstackclient/compute/v2/server_image.py +19 -10
- openstackclient/compute/v2/server_migration.py +27 -10
- openstackclient/compute/v2/server_share.py +274 -0
- openstackclient/compute/v2/server_volume.py +13 -5
- openstackclient/compute/v2/service.py +17 -8
- openstackclient/compute/v2/usage.py +28 -23
- openstackclient/identity/client.py +8 -3
- openstackclient/identity/common.py +82 -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 +32 -12
- openstackclient/identity/v3/application_credential.py +66 -24
- openstackclient/identity/v3/catalog.py +14 -7
- openstackclient/identity/v3/consumer.py +22 -11
- openstackclient/identity/v3/credential.py +39 -17
- openstackclient/identity/v3/domain.py +40 -19
- openstackclient/identity/v3/ec2creds.py +25 -12
- openstackclient/identity/v3/endpoint.py +98 -64
- openstackclient/identity/v3/endpoint_group.py +28 -17
- openstackclient/identity/v3/federation_protocol.py +44 -20
- openstackclient/identity/v3/group.py +64 -40
- openstackclient/identity/v3/identity_provider.py +95 -57
- openstackclient/identity/v3/implied_role.py +21 -9
- openstackclient/identity/v3/limit.py +42 -17
- openstackclient/identity/v3/mapping.py +58 -28
- openstackclient/identity/v3/policy.py +23 -12
- openstackclient/identity/v3/project.py +59 -26
- openstackclient/identity/v3/region.py +39 -17
- openstackclient/identity/v3/registered_limit.py +41 -16
- openstackclient/identity/v3/role.py +62 -31
- openstackclient/identity/v3/role_assignment.py +25 -7
- openstackclient/identity/v3/service.py +39 -17
- openstackclient/identity/v3/service_provider.py +40 -16
- openstackclient/identity/v3/tag.py +23 -6
- openstackclient/identity/v3/token.py +30 -14
- openstackclient/identity/v3/trust.py +39 -18
- openstackclient/identity/v3/unscoped_saml.py +10 -2
- openstackclient/identity/v3/user.py +86 -36
- openstackclient/image/client.py +7 -3
- openstackclient/image/v1/image.py +33 -26
- openstackclient/image/v2/cache.py +16 -11
- openstackclient/image/v2/image.py +88 -56
- openstackclient/image/v2/info.py +7 -1
- openstackclient/image/v2/metadef_namespaces.py +117 -20
- openstackclient/image/v2/metadef_objects.py +32 -19
- openstackclient/image/v2/metadef_properties.py +30 -16
- openstackclient/image/v2/metadef_resource_type_association.py +14 -7
- openstackclient/image/v2/metadef_resource_types.py +7 -1
- openstackclient/image/v2/task.py +25 -27
- 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 +27 -54
- openstackclient/network/v2/address_group.py +39 -16
- openstackclient/network/v2/address_scope.py +36 -20
- openstackclient/network/v2/bgpvpn/bgpvpn.py +477 -0
- openstackclient/network/v2/bgpvpn/constants.py +30 -0
- openstackclient/network/v2/bgpvpn/network_association.py +226 -0
- openstackclient/network/v2/bgpvpn/port_association.py +504 -0
- openstackclient/network/v2/bgpvpn/router_association.py +301 -0
- openstackclient/network/v2/default_security_group_rule.py +31 -14
- openstackclient/network/v2/floating_ip.py +121 -162
- openstackclient/network/v2/floating_ip_port_forwarding.py +41 -19
- openstackclient/network/v2/fwaas/__init__.py +0 -0
- openstackclient/network/v2/fwaas/group.py +499 -0
- openstackclient/network/v2/fwaas/policy.py +518 -0
- openstackclient/network/v2/fwaas/rule.py +610 -0
- openstackclient/network/v2/ip_availability.py +25 -8
- openstackclient/network/v2/l3_conntrack_helper.py +35 -13
- openstackclient/network/v2/local_ip.py +27 -13
- openstackclient/network/v2/local_ip_association.py +17 -7
- openstackclient/network/v2/ndp_proxy.py +23 -11
- openstackclient/network/v2/network.py +213 -213
- openstackclient/network/v2/network_agent.py +77 -34
- openstackclient/network/v2/network_auto_allocated_topology.py +27 -15
- openstackclient/network/v2/network_flavor.py +45 -21
- openstackclient/network/v2/network_flavor_profile.py +42 -17
- openstackclient/network/v2/network_meter.py +39 -15
- openstackclient/network/v2/network_meter_rule.py +40 -12
- openstackclient/network/v2/network_qos_policy.py +39 -21
- openstackclient/network/v2/network_qos_rule.py +48 -18
- openstackclient/network/v2/network_qos_rule_type.py +28 -9
- openstackclient/network/v2/network_rbac.py +34 -16
- openstackclient/network/v2/network_segment.py +32 -11
- openstackclient/network/v2/network_segment_range.py +70 -31
- openstackclient/network/v2/network_service_provider.py +7 -1
- openstackclient/network/v2/network_trunk.py +41 -22
- openstackclient/network/v2/port.py +141 -40
- openstackclient/network/v2/router.py +101 -67
- openstackclient/network/v2/security_group.py +97 -198
- openstackclient/network/v2/security_group_rule.py +115 -282
- openstackclient/network/v2/subnet.py +63 -34
- openstackclient/network/v2/subnet_pool.py +42 -24
- openstackclient/network/v2/taas/tap_flow.py +35 -14
- openstackclient/network/v2/taas/tap_mirror.py +28 -14
- openstackclient/network/v2/taas/tap_service.py +26 -12
- openstackclient/object/client.py +7 -2
- openstackclient/object/v1/account.py +13 -6
- openstackclient/object/v1/container.py +28 -16
- openstackclient/object/v1/object.py +28 -16
- 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 +59 -19
- openstackclient/tests/functional/identity/v3/test_application_credential.py +1 -1
- 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_mapping.py +81 -0
- openstackclient/tests/functional/identity/v3/test_project.py +10 -10
- openstackclient/tests/functional/identity/v3/test_role.py +18 -18
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
- openstackclient/tests/functional/identity/v3/test_user.py +8 -8
- openstackclient/tests/functional/image/base.py +1 -6
- openstackclient/tests/functional/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_group.py +163 -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_limits.py +1 -1
- openstackclient/tests/unit/common/test_module.py +82 -44
- openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
- openstackclient/tests/unit/common/test_quota.py +15 -26
- openstackclient/tests/unit/compute/v2/fakes.py +26 -57
- openstackclient/tests/unit/compute/v2/test_agent.py +4 -4
- openstackclient/tests/unit/compute/v2/test_aggregate.py +1 -1
- openstackclient/tests/unit/compute/v2/test_console.py +2 -2
- openstackclient/tests/unit/compute/v2/test_console_connection.py +1 -1
- openstackclient/tests/unit/compute/v2/test_flavor.py +29 -3
- openstackclient/tests/unit/compute/v2/test_host.py +3 -3
- openstackclient/tests/unit/compute/v2/test_hypervisor.py +2 -2
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -1
- openstackclient/tests/unit/compute/v2/test_keypair.py +7 -7
- openstackclient/tests/unit/compute/v2/test_server.py +26 -111
- openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -1
- openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
- openstackclient/tests/unit/compute/v2/test_server_group.py +1 -1
- openstackclient/tests/unit/compute/v2/test_server_image.py +1 -1
- openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
- openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
- openstackclient/tests/unit/compute/v2/test_server_volume.py +2 -2
- openstackclient/tests/unit/compute/v2/test_service.py +3 -3
- openstackclient/tests/unit/compute/v2/test_usage.py +1 -1
- openstackclient/tests/unit/identity/v2_0/fakes.py +3 -7
- openstackclient/tests/unit/identity/v2_0/test_endpoint.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_project.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_role.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_role_assignment.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_service.py +1 -1
- openstackclient/tests/unit/identity/v2_0/test_token.py +2 -2
- openstackclient/tests/unit/identity/v2_0/test_user.py +1 -1
- openstackclient/tests/unit/identity/v3/fakes.py +8 -38
- openstackclient/tests/unit/identity/v3/test_access_rule.py +3 -3
- openstackclient/tests/unit/identity/v3/test_application_credential.py +4 -4
- openstackclient/tests/unit/identity/v3/test_credential.py +5 -5
- openstackclient/tests/unit/identity/v3/test_domain.py +5 -5
- openstackclient/tests/unit/identity/v3/test_endpoint.py +6 -6
- openstackclient/tests/unit/identity/v3/test_endpoint_group.py +1 -1
- openstackclient/tests/unit/identity/v3/test_group.py +12 -22
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
- openstackclient/tests/unit/identity/v3/test_implied_role.py +1 -1
- openstackclient/tests/unit/identity/v3/test_limit.py +5 -5
- openstackclient/tests/unit/identity/v3/test_mappings.py +163 -79
- openstackclient/tests/unit/identity/v3/test_project.py +28 -5
- openstackclient/tests/unit/identity/v3/test_protocol.py +3 -3
- openstackclient/tests/unit/identity/v3/test_region.py +5 -5
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +5 -5
- openstackclient/tests/unit/identity/v3/test_role.py +8 -8
- openstackclient/tests/unit/identity/v3/test_role_assignment.py +1 -1
- openstackclient/tests/unit/identity/v3/test_service.py +5 -5
- openstackclient/tests/unit/identity/v3/test_token.py +2 -2
- openstackclient/tests/unit/identity/v3/test_trust.py +4 -4
- openstackclient/tests/unit/identity/v3/test_user.py +77 -10
- 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/fakes.py +5 -77
- openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/fwaas/test_group.py +923 -0
- openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
- openstackclient/tests/unit/network/v2/fwaas/test_rule.py +1005 -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 +26 -2
- openstackclient/tests/unit/network/v2/test_address_scope.py +24 -0
- openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +27 -2
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +37 -13
- openstackclient/tests/unit/network/v2/test_ip_availability.py +25 -0
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +29 -3
- openstackclient/tests/unit/network/v2/test_network.py +74 -12
- openstackclient/tests/unit/network/v2/test_network_agent.py +58 -5
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
- openstackclient/tests/unit/network/v2/test_network_flavor.py +26 -2
- openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +24 -0
- openstackclient/tests/unit/network/v2/test_network_meter.py +24 -0
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +25 -1
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +24 -0
- openstackclient/tests/unit/network/v2/test_network_rbac.py +25 -1
- openstackclient/tests/unit/network/v2/test_network_segment.py +25 -1
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +31 -10
- openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
- openstackclient/tests/unit/network/v2/test_port.py +166 -0
- openstackclient/tests/unit/network/v2/test_router.py +36 -16
- openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +11 -8
- openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +28 -37
- openstackclient/tests/unit/network/v2/test_subnet.py +30 -5
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +26 -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 +21 -140
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +6 -14
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +8 -1
- openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
- openstackclient/tests/unit/volume/v3/fakes.py +205 -100
- openstackclient/tests/unit/volume/v3/test_backup_record.py +114 -0
- openstackclient/tests/unit/volume/v3/test_consistency_group.py +720 -0
- openstackclient/tests/unit/volume/v3/test_consistency_group_snapshot.py +354 -0
- openstackclient/tests/unit/volume/v3/test_qos_specs.py +455 -0
- openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume_backend.py +158 -0
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +6 -14
- openstackclient/tests/unit/volume/v3/test_volume_group_type.py +65 -0
- openstackclient/tests/unit/volume/v3/test_volume_host.py +115 -0
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +61 -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 +60 -30
- openstackclient/volume/v2/volume_backend.py +19 -6
- openstackclient/volume/v2/volume_backup.py +48 -23
- openstackclient/volume/v2/volume_host.py +6 -4
- openstackclient/volume/v2/volume_snapshot.py +49 -24
- openstackclient/volume/v2/volume_transfer_request.py +31 -13
- openstackclient/volume/v2/volume_type.py +43 -24
- openstackclient/volume/v3/backup_record.py +94 -0
- 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/consistency_group.py +400 -0
- openstackclient/volume/v3/consistency_group_snapshot.py +225 -0
- openstackclient/volume/v3/qos_specs.py +389 -0
- openstackclient/volume/v3/service.py +16 -6
- openstackclient/volume/v3/volume.py +92 -40
- openstackclient/volume/v3/volume_attachment.py +47 -21
- openstackclient/volume/v3/volume_backend.py +130 -0
- openstackclient/volume/v3/volume_backup.py +55 -27
- openstackclient/volume/v3/volume_group.py +23 -13
- openstackclient/volume/v3/volume_group_snapshot.py +34 -17
- openstackclient/volume/v3/volume_group_type.py +27 -14
- openstackclient/volume/v3/volume_host.py +74 -0
- openstackclient/volume/v3/volume_message.py +18 -8
- openstackclient/volume/v3/volume_snapshot.py +70 -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.1.0.dist-info}/METADATA +7 -8
- python_openstackclient-10.1.0.dist-info/RECORD +524 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/entry_points.txt +77 -25
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/AUTHORS +9 -0
- python_openstackclient-10.1.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/RECORD +0 -499
- 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.1.0.dist-info}/licenses/LICENSE +0 -0
- {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/top_level.txt +0 -0
|
@@ -14,12 +14,14 @@
|
|
|
14
14
|
"""Port action implementations"""
|
|
15
15
|
|
|
16
16
|
import argparse
|
|
17
|
+
from collections.abc import Iterable, Sequence
|
|
17
18
|
import copy
|
|
18
19
|
import json
|
|
19
20
|
import logging
|
|
20
|
-
|
|
21
|
+
from typing import Any
|
|
21
22
|
|
|
22
23
|
from cliff import columns as cliff_columns
|
|
24
|
+
from openstack.network.v2 import port as _port
|
|
23
25
|
from osc_lib.cli import format_columns
|
|
24
26
|
from osc_lib.cli import parseractions
|
|
25
27
|
from osc_lib import exceptions
|
|
@@ -27,6 +29,7 @@ from osc_lib import utils
|
|
|
27
29
|
from osc_lib.utils import tags as _tag
|
|
28
30
|
|
|
29
31
|
from openstackclient import command
|
|
32
|
+
from openstackclient.common import pagination
|
|
30
33
|
from openstackclient.i18n import _
|
|
31
34
|
from openstackclient.identity import common as identity_common
|
|
32
35
|
from openstackclient.network import common
|
|
@@ -35,22 +38,22 @@ LOG = logging.getLogger(__name__)
|
|
|
35
38
|
|
|
36
39
|
|
|
37
40
|
class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
|
|
38
|
-
def human_readable(self):
|
|
41
|
+
def human_readable(self) -> str:
|
|
39
42
|
return 'UP' if self._value else 'DOWN'
|
|
40
43
|
|
|
41
44
|
|
|
42
45
|
class SubPortColumn(format_columns.ListDictColumn):
|
|
43
|
-
_value:
|
|
46
|
+
_value: Any
|
|
44
47
|
|
|
45
|
-
def _retrieve_subports(self):
|
|
48
|
+
def _retrieve_subports(self) -> None:
|
|
46
49
|
if isinstance(self._value, dict):
|
|
47
50
|
self._value = self._value['sub_ports']
|
|
48
51
|
|
|
49
|
-
def human_readable(self):
|
|
52
|
+
def human_readable(self) -> str:
|
|
50
53
|
self._retrieve_subports()
|
|
51
54
|
return super().human_readable()
|
|
52
55
|
|
|
53
|
-
def machine_readable(self):
|
|
56
|
+
def machine_readable(self) -> Any:
|
|
54
57
|
self._retrieve_subports()
|
|
55
58
|
return super().machine_readable()
|
|
56
59
|
|
|
@@ -73,7 +76,9 @@ _list_formatters = copy.deepcopy(_formatters)
|
|
|
73
76
|
_list_formatters.update({'trunk_details': SubPortColumn})
|
|
74
77
|
|
|
75
78
|
|
|
76
|
-
def _get_columns(
|
|
79
|
+
def _get_columns(
|
|
80
|
+
item: _port.Port,
|
|
81
|
+
) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
77
82
|
column_data_mapping = {
|
|
78
83
|
'admin_state_up': 'is_admin_state_up',
|
|
79
84
|
'allowed_address_pairs': 'allowed_address_pairs',
|
|
@@ -104,6 +109,8 @@ def _get_columns(item):
|
|
|
104
109
|
'port_security_enabled': 'is_port_security_enabled',
|
|
105
110
|
'project_id': 'project_id',
|
|
106
111
|
'propagate_uplink_status': 'propagate_uplink_status',
|
|
112
|
+
'pvlan_type': 'pvlan_type',
|
|
113
|
+
'pvlan_community': 'pvlan_community',
|
|
107
114
|
'resource_request': 'resource_request',
|
|
108
115
|
'revision_number': 'revision_number',
|
|
109
116
|
'qos_network_policy_id': 'qos_network_policy_id',
|
|
@@ -127,7 +134,13 @@ class JSONKeyValueAction(argparse.Action):
|
|
|
127
134
|
Ensures that ``dest`` is a dict
|
|
128
135
|
"""
|
|
129
136
|
|
|
130
|
-
def __call__(
|
|
137
|
+
def __call__(
|
|
138
|
+
self,
|
|
139
|
+
parser: argparse.ArgumentParser,
|
|
140
|
+
namespace: argparse.Namespace,
|
|
141
|
+
values: Any,
|
|
142
|
+
option_string: str | None = None,
|
|
143
|
+
) -> None:
|
|
131
144
|
# Make sure we have an empty dict rather than None
|
|
132
145
|
if getattr(namespace, self.dest, None) is None:
|
|
133
146
|
setattr(namespace, self.dest, {})
|
|
@@ -148,8 +161,10 @@ class JSONKeyValueAction(argparse.Action):
|
|
|
148
161
|
raise argparse.ArgumentError(self, msg)
|
|
149
162
|
|
|
150
163
|
|
|
151
|
-
def _get_attrs(
|
|
152
|
-
|
|
164
|
+
def _get_attrs(
|
|
165
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
166
|
+
) -> dict[str, Any]:
|
|
167
|
+
attrs: dict[str, Any] = {}
|
|
153
168
|
|
|
154
169
|
if parsed_args.description is not None:
|
|
155
170
|
attrs['description'] = parsed_args.description
|
|
@@ -180,8 +195,6 @@ def _get_attrs(client_manager, parsed_args):
|
|
|
180
195
|
if 'network' in parsed_args and parsed_args.network is not None:
|
|
181
196
|
attrs['network_id'] = parsed_args.network
|
|
182
197
|
if 'project' in parsed_args and parsed_args.project is not None:
|
|
183
|
-
# TODO(singhj): since 'project' logic is common among
|
|
184
|
-
# router, network, port etc., maybe move it to a common file.
|
|
185
198
|
identity_client = client_manager.identity
|
|
186
199
|
project_id = identity_common.find_project(
|
|
187
200
|
identity_client,
|
|
@@ -247,10 +260,51 @@ def _get_attrs(client_manager, parsed_args):
|
|
|
247
260
|
if parsed_args.trusted:
|
|
248
261
|
attrs['trusted'] = True
|
|
249
262
|
|
|
263
|
+
if 'pvlan_type' in parsed_args and parsed_args.pvlan_type is not None:
|
|
264
|
+
attrs['pvlan_type'] = parsed_args.pvlan_type
|
|
265
|
+
if (
|
|
266
|
+
'pvlan_community' in parsed_args
|
|
267
|
+
and parsed_args.pvlan_community is not None
|
|
268
|
+
):
|
|
269
|
+
attrs['pvlan_community'] = parsed_args.pvlan_community
|
|
270
|
+
|
|
271
|
+
_validate_pvlan_port(attrs)
|
|
272
|
+
|
|
250
273
|
return attrs
|
|
251
274
|
|
|
252
275
|
|
|
253
|
-
def
|
|
276
|
+
def _validate_pvlan_port(attrs: dict[str, Any]) -> None:
|
|
277
|
+
if (attrs.get('pvlan_type') or attrs.get('pvlan_community')) and attrs.get(
|
|
278
|
+
'port_security_enabled'
|
|
279
|
+
) is False:
|
|
280
|
+
msg = _(
|
|
281
|
+
"PVLAN attributes cannot be set when port security is disabled."
|
|
282
|
+
)
|
|
283
|
+
raise exceptions.CommandError(msg)
|
|
284
|
+
|
|
285
|
+
if attrs.get('pvlan_type') == 'community' and not attrs.get(
|
|
286
|
+
'pvlan_community'
|
|
287
|
+
):
|
|
288
|
+
msg = _(
|
|
289
|
+
"--pvlan-community is required when --pvlan-type is 'community'."
|
|
290
|
+
)
|
|
291
|
+
raise exceptions.CommandError(msg)
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def _validate_pvlan_network_port(attrs: dict[str, Any], network: Any) -> None:
|
|
295
|
+
if not (attrs.get('pvlan_type') or attrs.get('pvlan_community')):
|
|
296
|
+
return
|
|
297
|
+
if not network.pvlan:
|
|
298
|
+
msg = _(
|
|
299
|
+
"PVLAN attributes cannot be set on a port whose "
|
|
300
|
+
"network does not have PVLAN enabled."
|
|
301
|
+
)
|
|
302
|
+
raise exceptions.CommandError(msg)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def _prepare_fixed_ips(
|
|
306
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
307
|
+
) -> None:
|
|
254
308
|
"""Fix and properly format fixed_ip option.
|
|
255
309
|
|
|
256
310
|
Appropriately convert any subnet names to their respective ids.
|
|
@@ -281,7 +335,9 @@ def _prepare_fixed_ips(client_manager, parsed_args):
|
|
|
281
335
|
parsed_args.fixed_ip = ips
|
|
282
336
|
|
|
283
337
|
|
|
284
|
-
def _prepare_filter_fixed_ips(
|
|
338
|
+
def _prepare_filter_fixed_ips(
|
|
339
|
+
client_manager: Any, parsed_args: argparse.Namespace
|
|
340
|
+
) -> list[str]:
|
|
285
341
|
"""Fix and properly format fixed_ip option for filtering.
|
|
286
342
|
|
|
287
343
|
Appropriately convert any subnet names to their respective ids.
|
|
@@ -308,7 +364,9 @@ def _prepare_filter_fixed_ips(client_manager, parsed_args):
|
|
|
308
364
|
return ips
|
|
309
365
|
|
|
310
366
|
|
|
311
|
-
def _add_updatable_args(
|
|
367
|
+
def _add_updatable_args(
|
|
368
|
+
parser: argparse.ArgumentParser, create: bool = False
|
|
369
|
+
) -> None:
|
|
312
370
|
parser.add_argument(
|
|
313
371
|
'--description',
|
|
314
372
|
metavar='<description>',
|
|
@@ -430,11 +488,31 @@ def _add_updatable_args(parser, create=False):
|
|
|
430
488
|
"which expect it in this dictionary (for example, Nova)."
|
|
431
489
|
),
|
|
432
490
|
)
|
|
491
|
+
parser.add_argument(
|
|
492
|
+
'--pvlan-type',
|
|
493
|
+
metavar='<type>',
|
|
494
|
+
choices=['promiscuous', 'isolated', 'community'],
|
|
495
|
+
dest='pvlan_type',
|
|
496
|
+
help=_(
|
|
497
|
+
"Set Private VLAN type for this port. Requires PVLAN service "
|
|
498
|
+
"plugin. Default: promiscuous."
|
|
499
|
+
),
|
|
500
|
+
)
|
|
501
|
+
parser.add_argument(
|
|
502
|
+
'--pvlan-community',
|
|
503
|
+
metavar='<community>',
|
|
504
|
+
dest='pvlan_community',
|
|
505
|
+
help=_(
|
|
506
|
+
"Set PVLAN community name for this port. "
|
|
507
|
+
"Only applies when pvlan-type is 'community'. "
|
|
508
|
+
"Requires PVLAN service plugin. Default: None."
|
|
509
|
+
),
|
|
510
|
+
)
|
|
433
511
|
|
|
434
512
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
513
|
+
def _convert_address_pairs(
|
|
514
|
+
parsed_args: argparse.Namespace,
|
|
515
|
+
) -> list[dict[str, Any]]:
|
|
438
516
|
ops = []
|
|
439
517
|
for opt in parsed_args.allowed_address_pairs:
|
|
440
518
|
addr = {}
|
|
@@ -445,7 +523,9 @@ def _convert_address_pairs(parsed_args):
|
|
|
445
523
|
return ops
|
|
446
524
|
|
|
447
525
|
|
|
448
|
-
def _convert_extra_dhcp_options(
|
|
526
|
+
def _convert_extra_dhcp_options(
|
|
527
|
+
parsed_args: argparse.Namespace,
|
|
528
|
+
) -> list[dict[str, Any]]:
|
|
449
529
|
dhcp_options = []
|
|
450
530
|
for opt in parsed_args.extra_dhcp_options:
|
|
451
531
|
option = {}
|
|
@@ -460,7 +540,7 @@ def _convert_extra_dhcp_options(parsed_args):
|
|
|
460
540
|
|
|
461
541
|
# When we have multiple hints, we'll need to refactor this to allow
|
|
462
542
|
# arbitrary combinations. But until then let's have it as simple as possible.
|
|
463
|
-
def _validate_port_hints(hints):
|
|
543
|
+
def _validate_port_hints(hints: dict[str, Any]) -> None:
|
|
464
544
|
if hints not in (
|
|
465
545
|
{},
|
|
466
546
|
# by hint alias
|
|
@@ -477,7 +557,7 @@ def _validate_port_hints(hints):
|
|
|
477
557
|
# When we have multiple hints, we'll need to refactor this to expand aliases
|
|
478
558
|
# without losing other hints. But until then let's have it as simple as
|
|
479
559
|
# possible.
|
|
480
|
-
def _expand_port_hint_aliases(hints):
|
|
560
|
+
def _expand_port_hint_aliases(hints: dict[str, Any]) -> dict[str, Any]:
|
|
481
561
|
if hints == {'ovs-tx-steering': 'thread'}:
|
|
482
562
|
return {'openvswitch': {'other_config': {'tx-steering': 'thread'}}}
|
|
483
563
|
elif hints == {'ovs-tx-steering': 'hash'}:
|
|
@@ -489,7 +569,7 @@ def _expand_port_hint_aliases(hints):
|
|
|
489
569
|
class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
490
570
|
_description = _("Create a new port")
|
|
491
571
|
|
|
492
|
-
def get_parser(self, prog_name):
|
|
572
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
493
573
|
parser = super().get_parser(prog_name)
|
|
494
574
|
|
|
495
575
|
parser.add_argument(
|
|
@@ -635,7 +715,9 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
635
715
|
_tag.add_tag_option_to_parser_for_create(parser, _('port'))
|
|
636
716
|
return parser
|
|
637
717
|
|
|
638
|
-
def take_action(
|
|
718
|
+
def take_action(
|
|
719
|
+
self, parsed_args: argparse.Namespace
|
|
720
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
639
721
|
network_client = self.app.client_manager.network
|
|
640
722
|
network = network_client.find_network(
|
|
641
723
|
parsed_args.network, ignore_missing=False
|
|
@@ -711,6 +793,8 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
711
793
|
self._parse_extra_properties(parsed_args.extra_properties)
|
|
712
794
|
)
|
|
713
795
|
|
|
796
|
+
_validate_pvlan_network_port(attrs, network)
|
|
797
|
+
|
|
714
798
|
with common.check_missing_extension_if_error(network_client, attrs):
|
|
715
799
|
obj = network_client.create_port(**attrs)
|
|
716
800
|
|
|
@@ -727,7 +811,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
727
811
|
class DeletePort(command.Command):
|
|
728
812
|
_description = _("Delete port(s)")
|
|
729
813
|
|
|
730
|
-
def get_parser(self, prog_name):
|
|
814
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
731
815
|
parser = super().get_parser(prog_name)
|
|
732
816
|
parser.add_argument(
|
|
733
817
|
'port',
|
|
@@ -737,7 +821,7 @@ class DeletePort(command.Command):
|
|
|
737
821
|
)
|
|
738
822
|
return parser
|
|
739
823
|
|
|
740
|
-
def take_action(self, parsed_args):
|
|
824
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
741
825
|
client = self.app.client_manager.network
|
|
742
826
|
result = 0
|
|
743
827
|
|
|
@@ -764,12 +848,10 @@ class DeletePort(command.Command):
|
|
|
764
848
|
raise exceptions.CommandError(msg)
|
|
765
849
|
|
|
766
850
|
|
|
767
|
-
# TODO(abhiraut): Use only the SDK resource mapped attribute names once the
|
|
768
|
-
# OSC minimum requirements include SDK 1.0.
|
|
769
851
|
class ListPort(command.Lister):
|
|
770
852
|
_description = _("List ports")
|
|
771
853
|
|
|
772
|
-
def get_parser(self, prog_name):
|
|
854
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
773
855
|
parser = super().get_parser(prog_name)
|
|
774
856
|
parser.add_argument(
|
|
775
857
|
'--device-owner',
|
|
@@ -865,9 +947,12 @@ class ListPort(command.Lister):
|
|
|
865
947
|
),
|
|
866
948
|
)
|
|
867
949
|
_tag.add_tag_filtering_option_to_parser(parser, _('ports'))
|
|
950
|
+
pagination.add_marker_pagination_option_to_parser(parser)
|
|
868
951
|
return parser
|
|
869
952
|
|
|
870
|
-
def take_action(
|
|
953
|
+
def take_action(
|
|
954
|
+
self, parsed_args: argparse.Namespace
|
|
955
|
+
) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
|
|
871
956
|
network_client = self.app.client_manager.network
|
|
872
957
|
identity_client = self.app.client_manager.identity
|
|
873
958
|
|
|
@@ -894,7 +979,6 @@ class ListPort(command.Lister):
|
|
|
894
979
|
column_headers.extend(
|
|
895
980
|
['Security Groups', 'Device Owner', 'Tags', 'Trunk subports']
|
|
896
981
|
)
|
|
897
|
-
|
|
898
982
|
if parsed_args.device_owner is not None:
|
|
899
983
|
filters['device_owner'] = parsed_args.device_owner
|
|
900
984
|
if parsed_args.device_id is not None:
|
|
@@ -937,6 +1021,12 @@ class ListPort(command.Lister):
|
|
|
937
1021
|
)
|
|
938
1022
|
if parsed_args.security_groups:
|
|
939
1023
|
filters['security_group_ids'] = parsed_args.security_groups
|
|
1024
|
+
if parsed_args.marker is not None:
|
|
1025
|
+
filters['marker'] = parsed_args.marker
|
|
1026
|
+
if parsed_args.limit is not None:
|
|
1027
|
+
filters['limit'] = parsed_args.limit
|
|
1028
|
+
if parsed_args.max_items is not None:
|
|
1029
|
+
filters['max_items'] = parsed_args.max_items
|
|
940
1030
|
|
|
941
1031
|
_tag.get_tag_filtering_args(parsed_args, filters)
|
|
942
1032
|
|
|
@@ -961,12 +1051,10 @@ class ListPort(command.Lister):
|
|
|
961
1051
|
)
|
|
962
1052
|
|
|
963
1053
|
|
|
964
|
-
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
|
|
965
|
-
# OSC minimum requirements include SDK 1.0.
|
|
966
1054
|
class SetPort(common.NeutronCommandWithExtraArgs):
|
|
967
1055
|
_description = _("Set port properties")
|
|
968
1056
|
|
|
969
|
-
def get_parser(self, prog_name):
|
|
1057
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
970
1058
|
parser = super().get_parser(prog_name)
|
|
971
1059
|
_add_updatable_args(parser)
|
|
972
1060
|
admin_group = parser.add_mutually_exclusive_group()
|
|
@@ -1120,7 +1208,7 @@ class SetPort(common.NeutronCommandWithExtraArgs):
|
|
|
1120
1208
|
|
|
1121
1209
|
return parser
|
|
1122
1210
|
|
|
1123
|
-
def take_action(self, parsed_args):
|
|
1211
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
1124
1212
|
client = self.app.client_manager.network
|
|
1125
1213
|
|
|
1126
1214
|
_prepare_fixed_ips(self.app.client_manager, parsed_args)
|
|
@@ -1209,6 +1297,10 @@ class SetPort(common.NeutronCommandWithExtraArgs):
|
|
|
1209
1297
|
self._parse_extra_properties(parsed_args.extra_properties)
|
|
1210
1298
|
)
|
|
1211
1299
|
|
|
1300
|
+
if attrs.get('pvlan_type') or attrs.get('pvlan_community'):
|
|
1301
|
+
network = client.find_network(obj.network_id, ignore_missing=False)
|
|
1302
|
+
_validate_pvlan_network_port(attrs, network)
|
|
1303
|
+
|
|
1212
1304
|
if attrs:
|
|
1213
1305
|
with common.check_missing_extension_if_error(
|
|
1214
1306
|
self.app.client_manager.network, attrs
|
|
@@ -1222,14 +1314,16 @@ class SetPort(common.NeutronCommandWithExtraArgs):
|
|
|
1222
1314
|
class ShowPort(command.ShowOne):
|
|
1223
1315
|
_description = _("Display port details")
|
|
1224
1316
|
|
|
1225
|
-
def get_parser(self, prog_name):
|
|
1317
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1226
1318
|
parser = super().get_parser(prog_name)
|
|
1227
1319
|
parser.add_argument(
|
|
1228
1320
|
'port', metavar="<port>", help=_("Port to display (name or ID)")
|
|
1229
1321
|
)
|
|
1230
1322
|
return parser
|
|
1231
1323
|
|
|
1232
|
-
def take_action(
|
|
1324
|
+
def take_action(
|
|
1325
|
+
self, parsed_args: argparse.Namespace
|
|
1326
|
+
) -> tuple[Sequence[str], Iterable[Any]]:
|
|
1233
1327
|
client = self.app.client_manager.network
|
|
1234
1328
|
obj = client.find_port(parsed_args.port, ignore_missing=False)
|
|
1235
1329
|
display_columns, columns = _get_columns(obj)
|
|
@@ -1237,12 +1331,10 @@ class ShowPort(command.ShowOne):
|
|
|
1237
1331
|
return (display_columns, data)
|
|
1238
1332
|
|
|
1239
1333
|
|
|
1240
|
-
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
|
|
1241
|
-
# OSC minimum requirements include SDK 1.0.
|
|
1242
1334
|
class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
|
|
1243
1335
|
_description = _("Unset port properties")
|
|
1244
1336
|
|
|
1245
|
-
def get_parser(self, prog_name):
|
|
1337
|
+
def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
|
|
1246
1338
|
parser = super().get_parser(prog_name)
|
|
1247
1339
|
parser.add_argument(
|
|
1248
1340
|
'--fixed-ip',
|
|
@@ -1330,6 +1422,13 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
|
|
|
1330
1422
|
default=False,
|
|
1331
1423
|
help=_("Clear device owner for the port."),
|
|
1332
1424
|
)
|
|
1425
|
+
parser.add_argument(
|
|
1426
|
+
'--pvlan-community',
|
|
1427
|
+
action='store_true',
|
|
1428
|
+
default=False,
|
|
1429
|
+
dest='pvlan_community',
|
|
1430
|
+
help=_("Clear PVLAN community name for the port."),
|
|
1431
|
+
)
|
|
1333
1432
|
_tag.add_tag_option_to_parser_for_unset(parser, _('port'))
|
|
1334
1433
|
parser.add_argument(
|
|
1335
1434
|
'port',
|
|
@@ -1339,7 +1438,7 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
|
|
|
1339
1438
|
|
|
1340
1439
|
return parser
|
|
1341
1440
|
|
|
1342
|
-
def take_action(self, parsed_args):
|
|
1441
|
+
def take_action(self, parsed_args: argparse.Namespace) -> None:
|
|
1343
1442
|
client = self.app.client_manager.network
|
|
1344
1443
|
obj = client.find_port(parsed_args.port, ignore_missing=False)
|
|
1345
1444
|
# SDK ignores update() if it receives a modified obj and attrs
|
|
@@ -1400,6 +1499,8 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
|
|
|
1400
1499
|
attrs['device_id'] = ''
|
|
1401
1500
|
if parsed_args.device_owner:
|
|
1402
1501
|
attrs['device_owner'] = ''
|
|
1502
|
+
if parsed_args.pvlan_community:
|
|
1503
|
+
attrs['pvlan_community'] = None
|
|
1403
1504
|
|
|
1404
1505
|
attrs.update(
|
|
1405
1506
|
self._parse_extra_properties(parsed_args.extra_properties)
|