python-openstackclient 8.2.0__py3-none-any.whl → 9.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/api/object_store_v1.py +4 -1
- openstackclient/command.py +27 -0
- openstackclient/common/availability_zone.py +1 -1
- openstackclient/common/clientmanager.py +59 -21
- openstackclient/common/configuration.py +1 -1
- openstackclient/common/extension.py +1 -1
- openstackclient/common/limits.py +1 -1
- openstackclient/common/module.py +5 -3
- openstackclient/common/project_cleanup.py +10 -8
- openstackclient/common/quota.py +54 -23
- openstackclient/common/versions.py +1 -2
- openstackclient/compute/v2/agent.py +1 -1
- openstackclient/compute/v2/aggregate.py +6 -5
- openstackclient/compute/v2/console.py +5 -3
- openstackclient/compute/v2/console_connection.py +1 -1
- openstackclient/compute/v2/flavor.py +1 -1
- openstackclient/compute/v2/host.py +1 -1
- openstackclient/compute/v2/hypervisor.py +1 -1
- openstackclient/compute/v2/hypervisor_stats.py +1 -1
- openstackclient/compute/v2/keypair.py +1 -1
- openstackclient/compute/v2/server.py +78 -29
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_event.py +1 -1
- openstackclient/compute/v2/server_group.py +4 -2
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +1 -1
- openstackclient/compute/v2/server_volume.py +1 -1
- openstackclient/compute/v2/service.py +1 -1
- openstackclient/compute/v2/usage.py +6 -4
- openstackclient/identity/common.py +33 -1
- openstackclient/identity/v2_0/catalog.py +3 -2
- openstackclient/identity/v2_0/ec2creds.py +1 -1
- openstackclient/identity/v2_0/endpoint.py +1 -1
- openstackclient/identity/v2_0/project.py +17 -7
- openstackclient/identity/v2_0/role.py +1 -1
- openstackclient/identity/v2_0/role_assignment.py +3 -3
- openstackclient/identity/v2_0/service.py +4 -2
- openstackclient/identity/v2_0/token.py +1 -1
- openstackclient/identity/v2_0/user.py +2 -2
- openstackclient/identity/v3/access_rule.py +16 -4
- openstackclient/identity/v3/application_credential.py +30 -10
- openstackclient/identity/v3/catalog.py +3 -3
- openstackclient/identity/v3/consumer.py +1 -1
- openstackclient/identity/v3/credential.py +1 -1
- openstackclient/identity/v3/domain.py +10 -4
- openstackclient/identity/v3/ec2creds.py +1 -1
- openstackclient/identity/v3/endpoint.py +33 -12
- openstackclient/identity/v3/endpoint_group.py +1 -1
- openstackclient/identity/v3/federation_protocol.py +40 -41
- openstackclient/identity/v3/group.py +11 -5
- openstackclient/identity/v3/identity_provider.py +12 -10
- openstackclient/identity/v3/implied_role.py +1 -1
- openstackclient/identity/v3/limit.py +86 -85
- openstackclient/identity/v3/mapping.py +1 -1
- openstackclient/identity/v3/policy.py +1 -1
- openstackclient/identity/v3/project.py +191 -115
- openstackclient/identity/v3/region.py +1 -1
- openstackclient/identity/v3/registered_limit.py +97 -109
- openstackclient/identity/v3/role.py +20 -39
- openstackclient/identity/v3/role_assignment.py +12 -23
- openstackclient/identity/v3/service.py +1 -1
- openstackclient/identity/v3/service_provider.py +1 -1
- openstackclient/identity/v3/tag.py +1 -11
- openstackclient/identity/v3/token.py +3 -2
- openstackclient/identity/v3/trust.py +4 -2
- openstackclient/identity/v3/unscoped_saml.py +1 -1
- openstackclient/identity/v3/user.py +22 -13
- openstackclient/image/v1/image.py +19 -16
- openstackclient/image/v2/cache.py +1 -1
- openstackclient/image/v2/image.py +16 -12
- openstackclient/image/v2/info.py +1 -1
- openstackclient/image/v2/metadef_namespaces.py +1 -1
- openstackclient/image/v2/metadef_objects.py +1 -1
- openstackclient/image/v2/metadef_properties.py +3 -2
- openstackclient/image/v2/metadef_resource_type_association.py +1 -1
- openstackclient/image/v2/metadef_resource_types.py +1 -1
- openstackclient/image/v2/task.py +1 -1
- openstackclient/network/common.py +10 -9
- openstackclient/network/v2/address_group.py +4 -3
- openstackclient/network/v2/address_scope.py +8 -6
- openstackclient/network/v2/default_security_group_rule.py +9 -8
- openstackclient/network/v2/floating_ip.py +16 -9
- openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
- openstackclient/network/v2/ip_availability.py +7 -4
- openstackclient/network/v2/l3_conntrack_helper.py +11 -4
- openstackclient/network/v2/local_ip.py +13 -7
- openstackclient/network/v2/local_ip_association.py +7 -4
- openstackclient/network/v2/ndp_proxy.py +13 -6
- openstackclient/network/v2/network.py +33 -16
- openstackclient/network/v2/network_agent.py +5 -5
- openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
- openstackclient/network/v2/network_flavor.py +1 -1
- openstackclient/network/v2/network_flavor_profile.py +1 -1
- openstackclient/network/v2/network_meter.py +1 -1
- openstackclient/network/v2/network_meter_rule.py +1 -1
- openstackclient/network/v2/network_qos_policy.py +7 -5
- openstackclient/network/v2/network_qos_rule.py +1 -1
- openstackclient/network/v2/network_qos_rule_type.py +1 -1
- openstackclient/network/v2/network_rbac.py +8 -5
- openstackclient/network/v2/network_segment.py +2 -2
- openstackclient/network/v2/network_segment_range.py +13 -6
- openstackclient/network/v2/network_service_provider.py +1 -1
- openstackclient/network/v2/network_trunk.py +65 -42
- openstackclient/network/v2/port.py +22 -20
- openstackclient/network/v2/router.py +19 -8
- openstackclient/network/v2/security_group.py +10 -6
- openstackclient/network/v2/security_group_rule.py +11 -5
- openstackclient/network/v2/subnet.py +17 -18
- openstackclient/network/v2/subnet_pool.py +11 -9
- openstackclient/network/v2/taas/__init__.py +0 -0
- openstackclient/network/v2/taas/tap_flow.py +245 -0
- openstackclient/network/v2/taas/tap_mirror.py +237 -0
- openstackclient/network/v2/taas/tap_service.py +211 -0
- openstackclient/object/v1/account.py +1 -1
- openstackclient/object/v1/container.py +1 -1
- openstackclient/object/v1/object.py +1 -1
- openstackclient/shell.py +18 -8
- openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
- openstackclient/tests/functional/identity/v3/test_limit.py +47 -0
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
- openstackclient/tests/functional/image/v2/test_cache.py +54 -0
- openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
- openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
- openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +46 -132
- openstackclient/tests/unit/common/test_command.py +1 -1
- openstackclient/tests/unit/common/test_extension.py +2 -3
- openstackclient/tests/unit/common/test_module.py +14 -7
- openstackclient/tests/unit/common/test_quota.py +79 -0
- openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
- openstackclient/tests/unit/compute/v2/test_console.py +1 -4
- openstackclient/tests/unit/compute/v2/test_flavor.py +1 -3
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
- openstackclient/tests/unit/compute/v2/test_server.py +370 -38
- openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
- openstackclient/tests/unit/compute/v2/test_service.py +1 -3
- openstackclient/tests/unit/fakes.py +35 -134
- openstackclient/tests/unit/identity/test_common.py +100 -0
- openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
- openstackclient/tests/unit/identity/v3/fakes.py +10 -2
- openstackclient/tests/unit/identity/v3/test_application_credential.py +3 -3
- openstackclient/tests/unit/identity/v3/test_domain.py +1 -1
- openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
- openstackclient/tests/unit/identity/v3/test_group.py +4 -2
- openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
- openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
- openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
- openstackclient/tests/unit/identity/v3/test_project.py +832 -513
- openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +356 -221
- openstackclient/tests/unit/identity/v3/test_role.py +1 -82
- openstackclient/tests/unit/identity/v3/test_user.py +7 -51
- openstackclient/tests/unit/image/v2/test_image.py +116 -5
- openstackclient/tests/unit/network/test_common.py +9 -13
- openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
- openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
- openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
- openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
- openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
- openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
- openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
- openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
- openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +11 -21
- openstackclient/tests/unit/network/v2/test_network.py +41 -37
- openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
- openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
- openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
- openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
- openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
- openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
- openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
- openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
- openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
- openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
- openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
- openstackclient/tests/unit/network/v2/test_port.py +75 -86
- openstackclient/tests/unit/network/v2/test_router.py +104 -126
- openstackclient/tests/unit/network/v2/test_security_group_network.py +19 -26
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +17 -18
- openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
- openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
- openstackclient/tests/unit/volume/test_find_resource.py +4 -13
- openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
- openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume.py +38 -12
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
- openstackclient/volume/client.py +7 -17
- openstackclient/volume/v2/backup_record.py +1 -1
- openstackclient/volume/v2/consistency_group.py +9 -9
- openstackclient/volume/v2/consistency_group_snapshot.py +3 -3
- openstackclient/volume/v2/qos_specs.py +3 -3
- openstackclient/volume/v2/service.py +1 -1
- openstackclient/volume/v2/volume.py +14 -7
- openstackclient/volume/v2/volume_backend.py +1 -1
- openstackclient/volume/v2/volume_backup.py +7 -5
- openstackclient/volume/v2/volume_host.py +1 -2
- openstackclient/volume/v2/volume_snapshot.py +4 -4
- openstackclient/volume/v2/volume_transfer_request.py +3 -3
- openstackclient/volume/v2/volume_type.py +16 -11
- openstackclient/volume/v3/block_storage_cleanup.py +1 -1
- openstackclient/volume/v3/block_storage_cluster.py +1 -1
- openstackclient/volume/v3/block_storage_log_level.py +1 -1
- openstackclient/volume/v3/block_storage_manage.py +1 -1
- openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
- openstackclient/volume/v3/service.py +1 -1
- openstackclient/volume/v3/volume.py +16 -9
- openstackclient/volume/v3/volume_attachment.py +6 -5
- openstackclient/volume/v3/volume_backup.py +20 -5
- openstackclient/volume/v3/volume_group.py +1 -1
- openstackclient/volume/v3/volume_group_snapshot.py +1 -1
- openstackclient/volume/v3/volume_group_type.py +1 -1
- openstackclient/volume/v3/volume_message.py +1 -1
- openstackclient/volume/v3/volume_snapshot.py +4 -4
- openstackclient/volume/v3/volume_transfer_request.py +3 -3
- openstackclient/volume/v3/volume_type.py +20 -14
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/METADATA +15 -13
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/RECORD +231 -219
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/entry_points.txt +15 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/AUTHORS +15 -0
- python_openstackclient-9.0.0.dist-info/pbr.json +1 -0
- openstackclient/tests/unit/common/test_logs.py +0 -221
- python_openstackclient-8.2.0.dist-info/pbr.json +0 -1
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/LICENSE +0 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/top_level.txt +0 -0
|
@@ -14,12 +14,13 @@
|
|
|
14
14
|
# under the License.
|
|
15
15
|
|
|
16
16
|
import logging
|
|
17
|
+
import typing as ty
|
|
17
18
|
|
|
18
19
|
from cliff import columns as cliff_columns
|
|
19
|
-
from osc_lib.command import command
|
|
20
20
|
from osc_lib import exceptions
|
|
21
21
|
from osc_lib import utils
|
|
22
22
|
|
|
23
|
+
from openstackclient import command
|
|
23
24
|
from openstackclient.i18n import _
|
|
24
25
|
from openstackclient.identity import common as identity_common
|
|
25
26
|
from openstackclient.network import common
|
|
@@ -27,7 +28,7 @@ from openstackclient.network import common
|
|
|
27
28
|
LOG = logging.getLogger(__name__)
|
|
28
29
|
|
|
29
30
|
|
|
30
|
-
class RulesColumn(cliff_columns.FormattableColumn):
|
|
31
|
+
class RulesColumn(cliff_columns.FormattableColumn[ty.Any]):
|
|
31
32
|
def human_readable(self):
|
|
32
33
|
return '\n'.join(str(v) for v in self._value)
|
|
33
34
|
|
|
@@ -190,7 +191,8 @@ class ListNetworkQosPolicy(command.Lister):
|
|
|
190
191
|
'--project',
|
|
191
192
|
metavar='<project>',
|
|
192
193
|
help=_(
|
|
193
|
-
"List QoS policies
|
|
194
|
+
"List only QoS policies with the specified project "
|
|
195
|
+
"(name or ID)"
|
|
194
196
|
),
|
|
195
197
|
)
|
|
196
198
|
identity_common.add_project_domain_option_to_parser(parser)
|
|
@@ -198,12 +200,12 @@ class ListNetworkQosPolicy(command.Lister):
|
|
|
198
200
|
shared_group.add_argument(
|
|
199
201
|
'--share',
|
|
200
202
|
action='store_true',
|
|
201
|
-
help=_("List QoS policies shared between projects"),
|
|
203
|
+
help=_("List only QoS policies shared between projects"),
|
|
202
204
|
)
|
|
203
205
|
shared_group.add_argument(
|
|
204
206
|
'--no-share',
|
|
205
207
|
action='store_true',
|
|
206
|
-
help=_("List QoS policies not shared between projects"),
|
|
208
|
+
help=_("List only QoS policies not shared between projects"),
|
|
207
209
|
)
|
|
208
210
|
return parser
|
|
209
211
|
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
import itertools
|
|
17
17
|
|
|
18
|
-
from osc_lib.command import command
|
|
19
18
|
from osc_lib import exceptions
|
|
20
19
|
from osc_lib import utils
|
|
21
20
|
|
|
21
|
+
from openstackclient import command
|
|
22
22
|
from openstackclient.i18n import _
|
|
23
23
|
from openstackclient.network import common
|
|
24
24
|
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
# License for the specific language governing permissions and limitations
|
|
14
14
|
# under the License.
|
|
15
15
|
|
|
16
|
-
from osc_lib.command import command
|
|
17
16
|
from osc_lib import utils
|
|
18
17
|
|
|
18
|
+
from openstackclient import command
|
|
19
19
|
from openstackclient.i18n import _
|
|
20
20
|
|
|
21
21
|
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
import logging
|
|
17
17
|
|
|
18
|
-
from osc_lib.command import command
|
|
19
18
|
from osc_lib import exceptions
|
|
20
19
|
from osc_lib import utils
|
|
21
20
|
|
|
21
|
+
from openstackclient import command
|
|
22
22
|
from openstackclient.i18n import _
|
|
23
23
|
from openstackclient.identity import common as identity_common
|
|
24
24
|
from openstackclient.network import common
|
|
@@ -234,8 +234,8 @@ class ListNetworkRBAC(command.Lister):
|
|
|
234
234
|
'network',
|
|
235
235
|
],
|
|
236
236
|
help=_(
|
|
237
|
-
'List network RBAC policies
|
|
238
|
-
'
|
|
237
|
+
'List only network RBAC policies with the specified '
|
|
238
|
+
'object type ("address_group", "address_scope", '
|
|
239
239
|
'"security_group", "subnetpool", "qos_policy" or '
|
|
240
240
|
'"network")'
|
|
241
241
|
),
|
|
@@ -245,14 +245,17 @@ class ListNetworkRBAC(command.Lister):
|
|
|
245
245
|
metavar='<action>',
|
|
246
246
|
choices=['access_as_external', 'access_as_shared'],
|
|
247
247
|
help=_(
|
|
248
|
-
'List network RBAC policies
|
|
248
|
+
'List only network RBAC policies with the specified '
|
|
249
249
|
'action ("access_as_external" or "access_as_shared")'
|
|
250
250
|
),
|
|
251
251
|
)
|
|
252
252
|
parser.add_argument(
|
|
253
253
|
'--target-project',
|
|
254
254
|
metavar='<target-project>',
|
|
255
|
-
help=_(
|
|
255
|
+
help=_(
|
|
256
|
+
'List only network RBAC policies with the specified '
|
|
257
|
+
'target project (name or ID)'
|
|
258
|
+
),
|
|
256
259
|
)
|
|
257
260
|
parser.add_argument(
|
|
258
261
|
'--long',
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
import logging
|
|
17
17
|
|
|
18
|
-
from osc_lib.command import command
|
|
19
18
|
from osc_lib import exceptions
|
|
20
19
|
from osc_lib import utils
|
|
21
20
|
|
|
21
|
+
from openstackclient import command
|
|
22
22
|
from openstackclient.i18n import _
|
|
23
23
|
from openstackclient.network import common
|
|
24
24
|
|
|
@@ -160,7 +160,7 @@ class ListNetworkSegment(command.Lister):
|
|
|
160
160
|
'--network',
|
|
161
161
|
metavar='<network>',
|
|
162
162
|
help=_(
|
|
163
|
-
'List network segments
|
|
163
|
+
'List only network segments associated with the specified '
|
|
164
164
|
'network (name or ID)'
|
|
165
165
|
),
|
|
166
166
|
)
|
|
@@ -20,10 +20,10 @@ import itertools
|
|
|
20
20
|
import logging
|
|
21
21
|
import typing as ty
|
|
22
22
|
|
|
23
|
-
from osc_lib.command import command
|
|
24
23
|
from osc_lib import exceptions
|
|
25
24
|
from osc_lib import utils
|
|
26
25
|
|
|
26
|
+
from openstackclient import command
|
|
27
27
|
from openstackclient.i18n import _
|
|
28
28
|
from openstackclient.identity import common as identity_common
|
|
29
29
|
from openstackclient.network import common
|
|
@@ -315,25 +315,32 @@ class ListNetworkSegmentRange(command.Lister):
|
|
|
315
315
|
used_group.add_argument(
|
|
316
316
|
'--used',
|
|
317
317
|
action='store_true',
|
|
318
|
-
help=_(
|
|
318
|
+
help=_(
|
|
319
|
+
'List only network segment ranges that have segments in use'
|
|
320
|
+
),
|
|
319
321
|
)
|
|
320
322
|
used_group.add_argument(
|
|
321
323
|
'--unused',
|
|
322
324
|
action='store_true',
|
|
323
325
|
help=_(
|
|
324
|
-
'List network segment ranges that have segments
|
|
326
|
+
'List only network segment ranges that have segments '
|
|
327
|
+
'not in use'
|
|
325
328
|
),
|
|
326
329
|
)
|
|
327
330
|
available_group = parser.add_mutually_exclusive_group()
|
|
328
331
|
available_group.add_argument(
|
|
329
332
|
'--available',
|
|
330
333
|
action='store_true',
|
|
331
|
-
help=_(
|
|
334
|
+
help=_(
|
|
335
|
+
'List only network segment ranges that have available segments'
|
|
336
|
+
),
|
|
332
337
|
)
|
|
333
338
|
available_group.add_argument(
|
|
334
339
|
'--unavailable',
|
|
335
340
|
action='store_true',
|
|
336
|
-
help=_(
|
|
341
|
+
help=_(
|
|
342
|
+
'List only network segment ranges without available segments'
|
|
343
|
+
),
|
|
337
344
|
)
|
|
338
345
|
return parser
|
|
339
346
|
|
|
@@ -395,7 +402,7 @@ class ListNetworkSegmentRange(command.Lister):
|
|
|
395
402
|
'available',
|
|
396
403
|
)
|
|
397
404
|
|
|
398
|
-
display_props: tuple[
|
|
405
|
+
display_props: tuple[ty.Any, ...] = tuple()
|
|
399
406
|
for s in data:
|
|
400
407
|
props = utils.get_item_properties(s, columns)
|
|
401
408
|
if (
|
|
@@ -23,10 +23,10 @@ from cliff import columns as cliff_columns
|
|
|
23
23
|
from osc_lib.cli import format_columns
|
|
24
24
|
from osc_lib.cli import identity as identity_utils
|
|
25
25
|
from osc_lib.cli import parseractions
|
|
26
|
-
from osc_lib.command import command
|
|
27
26
|
from osc_lib import exceptions
|
|
28
27
|
from osc_lib import utils as osc_utils
|
|
29
28
|
|
|
29
|
+
from openstackclient import command
|
|
30
30
|
from openstackclient.i18n import _
|
|
31
31
|
|
|
32
32
|
LOG = logging.getLogger(__name__)
|
|
@@ -36,7 +36,7 @@ TRUNKS = 'trunks'
|
|
|
36
36
|
SUB_PORTS = 'sub_ports'
|
|
37
37
|
|
|
38
38
|
|
|
39
|
-
class AdminStateColumn(cliff_columns.FormattableColumn):
|
|
39
|
+
class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
|
|
40
40
|
def human_readable(self):
|
|
41
41
|
return 'UP' if self._value else 'DOWN'
|
|
42
42
|
|
|
@@ -88,9 +88,12 @@ class CreateNetworkTrunk(command.ShowOne):
|
|
|
88
88
|
return parser
|
|
89
89
|
|
|
90
90
|
def take_action(self, parsed_args):
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
network_client = self.app.client_manager.network
|
|
92
|
+
identity_client = self.app.client_manager.identity
|
|
93
|
+
attrs = _get_attrs_for_trunk(
|
|
94
|
+
network_client, identity_client, parsed_args
|
|
95
|
+
)
|
|
96
|
+
obj = network_client.create_trunk(**attrs)
|
|
94
97
|
display_columns, columns = _get_columns(obj)
|
|
95
98
|
data = osc_utils.get_dict_properties(
|
|
96
99
|
obj, columns, formatters=_formatters
|
|
@@ -112,12 +115,15 @@ class DeleteNetworkTrunk(command.Command):
|
|
|
112
115
|
return parser
|
|
113
116
|
|
|
114
117
|
def take_action(self, parsed_args):
|
|
115
|
-
|
|
118
|
+
network_client = self.app.client_manager.network
|
|
116
119
|
result = 0
|
|
117
120
|
for trunk in parsed_args.trunk:
|
|
118
121
|
try:
|
|
119
|
-
trunk_id =
|
|
120
|
-
|
|
122
|
+
trunk_id = network_client.find_trunk(
|
|
123
|
+
trunk,
|
|
124
|
+
ignore_missing=False,
|
|
125
|
+
).id
|
|
126
|
+
network_client.delete_trunk(trunk_id)
|
|
121
127
|
except Exception as e:
|
|
122
128
|
result += 1
|
|
123
129
|
LOG.error(
|
|
@@ -150,8 +156,8 @@ class ListNetworkTrunk(command.Lister):
|
|
|
150
156
|
return parser
|
|
151
157
|
|
|
152
158
|
def take_action(self, parsed_args):
|
|
153
|
-
|
|
154
|
-
data =
|
|
159
|
+
network_client = self.app.client_manager.network
|
|
160
|
+
data = network_client.trunks()
|
|
155
161
|
headers: tuple[str, ...] = ('ID', 'Name', 'Parent Port', 'Description')
|
|
156
162
|
columns: tuple[str, ...] = ('id', 'name', 'port_id', 'description')
|
|
157
163
|
if parsed_args.long:
|
|
@@ -215,11 +221,17 @@ class SetNetworkTrunk(command.Command):
|
|
|
215
221
|
return parser
|
|
216
222
|
|
|
217
223
|
def take_action(self, parsed_args):
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
224
|
+
network_client = self.app.client_manager.network
|
|
225
|
+
identity_client = self.app.client_manager.identity
|
|
226
|
+
trunk_id = network_client.find_trunk(
|
|
227
|
+
parsed_args.trunk,
|
|
228
|
+
ignore_missing=False,
|
|
229
|
+
)
|
|
230
|
+
attrs = _get_attrs_for_trunk(
|
|
231
|
+
network_client, identity_client, parsed_args
|
|
232
|
+
)
|
|
221
233
|
try:
|
|
222
|
-
|
|
234
|
+
network_client.update_trunk(trunk_id, **attrs)
|
|
223
235
|
except Exception as e:
|
|
224
236
|
msg = _("Failed to set trunk '%(t)s': %(e)s") % {
|
|
225
237
|
't': parsed_args.trunk,
|
|
@@ -228,10 +240,10 @@ class SetNetworkTrunk(command.Command):
|
|
|
228
240
|
raise exceptions.CommandError(msg)
|
|
229
241
|
if parsed_args.set_subports:
|
|
230
242
|
subport_attrs = _get_attrs_for_subports(
|
|
231
|
-
|
|
243
|
+
network_client, parsed_args
|
|
232
244
|
)
|
|
233
245
|
try:
|
|
234
|
-
|
|
246
|
+
network_client.add_trunk_subports(trunk_id, subport_attrs)
|
|
235
247
|
except Exception as e:
|
|
236
248
|
msg = _("Failed to add subports to trunk '%(t)s': %(e)s") % {
|
|
237
249
|
't': parsed_args.trunk,
|
|
@@ -251,9 +263,12 @@ class ShowNetworkTrunk(command.ShowOne):
|
|
|
251
263
|
return parser
|
|
252
264
|
|
|
253
265
|
def take_action(self, parsed_args):
|
|
254
|
-
|
|
255
|
-
trunk_id =
|
|
256
|
-
|
|
266
|
+
network_client = self.app.client_manager.network
|
|
267
|
+
trunk_id = network_client.find_trunk(
|
|
268
|
+
parsed_args.trunk,
|
|
269
|
+
ignore_missing=False,
|
|
270
|
+
).id
|
|
271
|
+
obj = network_client.get_trunk(trunk_id)
|
|
257
272
|
display_columns, columns = _get_columns(obj)
|
|
258
273
|
data = osc_utils.get_dict_properties(
|
|
259
274
|
obj, columns, formatters=_formatters
|
|
@@ -270,14 +285,17 @@ class ListNetworkSubport(command.Lister):
|
|
|
270
285
|
'--trunk',
|
|
271
286
|
required=True,
|
|
272
287
|
metavar="<trunk>",
|
|
273
|
-
help=_("List subports belonging to this trunk (name or ID)"),
|
|
288
|
+
help=_("List only subports belonging to this trunk (name or ID)"),
|
|
274
289
|
)
|
|
275
290
|
return parser
|
|
276
291
|
|
|
277
292
|
def take_action(self, parsed_args):
|
|
278
|
-
|
|
279
|
-
trunk_id =
|
|
280
|
-
|
|
293
|
+
network_client = self.app.client_manager.network
|
|
294
|
+
trunk_id = network_client.find_trunk(
|
|
295
|
+
parsed_args.trunk,
|
|
296
|
+
ignore_missing=False,
|
|
297
|
+
)
|
|
298
|
+
data = network_client.get_trunk_subports(trunk_id)
|
|
281
299
|
headers: tuple[str, ...] = (
|
|
282
300
|
'Port',
|
|
283
301
|
'Segmentation Type',
|
|
@@ -324,10 +342,13 @@ class UnsetNetworkTrunk(command.Command):
|
|
|
324
342
|
return parser
|
|
325
343
|
|
|
326
344
|
def take_action(self, parsed_args):
|
|
327
|
-
|
|
328
|
-
attrs = _get_attrs_for_subports(
|
|
329
|
-
trunk_id =
|
|
330
|
-
|
|
345
|
+
network_client = self.app.client_manager.network
|
|
346
|
+
attrs = _get_attrs_for_subports(network_client, parsed_args)
|
|
347
|
+
trunk_id = network_client.find_trunk(
|
|
348
|
+
parsed_args.trunk,
|
|
349
|
+
ignore_missing=False,
|
|
350
|
+
)
|
|
351
|
+
network_client.delete_trunk_subports(trunk_id, attrs)
|
|
331
352
|
|
|
332
353
|
|
|
333
354
|
_formatters = {
|
|
@@ -343,7 +364,7 @@ def _get_columns(item):
|
|
|
343
364
|
)
|
|
344
365
|
|
|
345
366
|
|
|
346
|
-
def _get_attrs_for_trunk(
|
|
367
|
+
def _get_attrs_for_trunk(network_client, identity_client, parsed_args):
|
|
347
368
|
attrs: dict[str, ty.Any] = {}
|
|
348
369
|
if parsed_args.name is not None:
|
|
349
370
|
attrs['name'] = str(parsed_args.name)
|
|
@@ -354,18 +375,18 @@ def _get_attrs_for_trunk(client_manager, parsed_args):
|
|
|
354
375
|
if parsed_args.disable:
|
|
355
376
|
attrs['admin_state_up'] = False
|
|
356
377
|
if 'parent_port' in parsed_args and parsed_args.parent_port is not None:
|
|
357
|
-
port_id =
|
|
358
|
-
|
|
359
|
-
|
|
378
|
+
port_id = network_client.find_port(
|
|
379
|
+
parsed_args.parent_port,
|
|
380
|
+
ignore_missing=False,
|
|
381
|
+
).id
|
|
360
382
|
attrs['port_id'] = port_id
|
|
361
383
|
if 'add_subports' in parsed_args and parsed_args.add_subports is not None:
|
|
362
384
|
attrs[SUB_PORTS] = _format_subports(
|
|
363
|
-
|
|
385
|
+
network_client, parsed_args.add_subports
|
|
364
386
|
)
|
|
365
387
|
|
|
366
388
|
# "trunk set" command doesn't support setting project.
|
|
367
389
|
if 'project' in parsed_args and parsed_args.project is not None:
|
|
368
|
-
identity_client = client_manager.identity
|
|
369
390
|
project_id = identity_utils.find_project(
|
|
370
391
|
identity_client,
|
|
371
392
|
parsed_args.project,
|
|
@@ -376,12 +397,15 @@ def _get_attrs_for_trunk(client_manager, parsed_args):
|
|
|
376
397
|
return attrs
|
|
377
398
|
|
|
378
399
|
|
|
379
|
-
def _format_subports(
|
|
400
|
+
def _format_subports(network_client, subports):
|
|
380
401
|
attrs = []
|
|
381
402
|
for subport in subports:
|
|
382
403
|
subport_attrs = {}
|
|
383
404
|
if subport.get('port'):
|
|
384
|
-
port_id =
|
|
405
|
+
port_id = network_client.find_port(
|
|
406
|
+
subport['port'],
|
|
407
|
+
ignore_missing=False,
|
|
408
|
+
).id
|
|
385
409
|
subport_attrs['port_id'] = port_id
|
|
386
410
|
if subport.get('segmentation-id'):
|
|
387
411
|
try:
|
|
@@ -400,21 +424,20 @@ def _format_subports(client_manager, subports):
|
|
|
400
424
|
return attrs
|
|
401
425
|
|
|
402
426
|
|
|
403
|
-
def _get_attrs_for_subports(
|
|
427
|
+
def _get_attrs_for_subports(network_client, parsed_args):
|
|
404
428
|
attrs = []
|
|
405
429
|
if 'set_subports' in parsed_args and parsed_args.set_subports is not None:
|
|
406
|
-
attrs = _format_subports(
|
|
430
|
+
attrs = _format_subports(network_client, parsed_args.set_subports)
|
|
407
431
|
if (
|
|
408
432
|
'unset_subports' in parsed_args
|
|
409
433
|
and parsed_args.unset_subports is not None
|
|
410
434
|
):
|
|
411
435
|
subports_list = []
|
|
412
436
|
for subport in parsed_args.unset_subports:
|
|
413
|
-
port_id =
|
|
437
|
+
port_id = network_client.find_port(
|
|
438
|
+
subport,
|
|
439
|
+
ignore_missing=False,
|
|
440
|
+
)['id']
|
|
414
441
|
subports_list.append({'port_id': port_id})
|
|
415
442
|
attrs = subports_list
|
|
416
443
|
return attrs
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
def _get_id(client, id_or_name, resource):
|
|
420
|
-
return client.find_resource(resource, str(id_or_name))['id']
|
|
@@ -22,11 +22,11 @@ import typing as ty
|
|
|
22
22
|
from cliff import columns as cliff_columns
|
|
23
23
|
from osc_lib.cli import format_columns
|
|
24
24
|
from osc_lib.cli import parseractions
|
|
25
|
-
from osc_lib.command import command
|
|
26
25
|
from osc_lib import exceptions
|
|
27
26
|
from osc_lib import utils
|
|
28
27
|
from osc_lib.utils import tags as _tag
|
|
29
28
|
|
|
29
|
+
from openstackclient import command
|
|
30
30
|
from openstackclient.i18n import _
|
|
31
31
|
from openstackclient.identity import common as identity_common
|
|
32
32
|
from openstackclient.network import common
|
|
@@ -34,7 +34,7 @@ from openstackclient.network import common
|
|
|
34
34
|
LOG = logging.getLogger(__name__)
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
class AdminStateColumn(cliff_columns.FormattableColumn):
|
|
37
|
+
class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
|
|
38
38
|
def human_readable(self):
|
|
39
39
|
return 'UP' if self._value else 'DOWN'
|
|
40
40
|
|
|
@@ -636,11 +636,11 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
636
636
|
return parser
|
|
637
637
|
|
|
638
638
|
def take_action(self, parsed_args):
|
|
639
|
-
|
|
640
|
-
|
|
639
|
+
network_client = self.app.client_manager.network
|
|
640
|
+
network = network_client.find_network(
|
|
641
641
|
parsed_args.network, ignore_missing=False
|
|
642
642
|
)
|
|
643
|
-
parsed_args.network =
|
|
643
|
+
parsed_args.network = network.id
|
|
644
644
|
_prepare_fixed_ips(self.app.client_manager, parsed_args)
|
|
645
645
|
attrs = _get_attrs(self.app.client_manager, parsed_args)
|
|
646
646
|
|
|
@@ -654,7 +654,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
654
654
|
|
|
655
655
|
if parsed_args.security_groups is not None:
|
|
656
656
|
attrs['security_group_ids'] = [
|
|
657
|
-
|
|
657
|
+
network_client.find_security_group(sg, ignore_missing=False).id
|
|
658
658
|
for sg in parsed_args.security_groups
|
|
659
659
|
]
|
|
660
660
|
|
|
@@ -667,7 +667,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
667
667
|
attrs["extra_dhcp_opts"] = _convert_extra_dhcp_options(parsed_args)
|
|
668
668
|
|
|
669
669
|
if parsed_args.qos_policy:
|
|
670
|
-
attrs['qos_policy_id'] =
|
|
670
|
+
attrs['qos_policy_id'] = network_client.find_qos_policy(
|
|
671
671
|
parsed_args.qos_policy, ignore_missing=False
|
|
672
672
|
).id
|
|
673
673
|
|
|
@@ -675,7 +675,9 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
675
675
|
_validate_port_hints(parsed_args.hint)
|
|
676
676
|
expanded_hints = _expand_port_hint_aliases(parsed_args.hint)
|
|
677
677
|
try:
|
|
678
|
-
|
|
678
|
+
network_client.find_extension(
|
|
679
|
+
'port-hints', ignore_missing=False
|
|
680
|
+
)
|
|
679
681
|
except Exception as e:
|
|
680
682
|
msg = _('Not supported by Network API: %(e)s') % {'e': e}
|
|
681
683
|
raise exceptions.CommandError(msg)
|
|
@@ -686,7 +688,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
686
688
|
in expanded_hints['openvswitch']['other_config']
|
|
687
689
|
):
|
|
688
690
|
try:
|
|
689
|
-
|
|
691
|
+
network_client.find_extension(
|
|
690
692
|
'port-hint-ovs-tx-steering', ignore_missing=False
|
|
691
693
|
)
|
|
692
694
|
except Exception as e:
|
|
@@ -695,7 +697,9 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
695
697
|
attrs['hints'] = expanded_hints
|
|
696
698
|
|
|
697
699
|
set_tags_in_post = bool(
|
|
698
|
-
|
|
700
|
+
network_client.find_extension(
|
|
701
|
+
'tag-ports-during-bulk-creation', ignore_missing=True
|
|
702
|
+
)
|
|
699
703
|
)
|
|
700
704
|
if set_tags_in_post:
|
|
701
705
|
if parsed_args.no_tag:
|
|
@@ -707,14 +711,12 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
|
|
|
707
711
|
self._parse_extra_properties(parsed_args.extra_properties)
|
|
708
712
|
)
|
|
709
713
|
|
|
710
|
-
with common.check_missing_extension_if_error(
|
|
711
|
-
|
|
712
|
-
):
|
|
713
|
-
obj = client.create_port(**attrs)
|
|
714
|
+
with common.check_missing_extension_if_error(network_client, attrs):
|
|
715
|
+
obj = network_client.create_port(**attrs)
|
|
714
716
|
|
|
715
717
|
if not set_tags_in_post:
|
|
716
718
|
# tags cannot be set when created, so tags need to be set later.
|
|
717
|
-
_tag.update_tags_for_set(
|
|
719
|
+
_tag.update_tags_for_set(network_client, obj, parsed_args)
|
|
718
720
|
|
|
719
721
|
display_columns, columns = _get_columns(obj)
|
|
720
722
|
data = utils.get_item_properties(obj, columns, formatters=_formatters)
|
|
@@ -808,7 +810,7 @@ class ListPort(command.Lister):
|
|
|
808
810
|
parser.add_argument(
|
|
809
811
|
'--mac-address',
|
|
810
812
|
metavar='<mac-address>',
|
|
811
|
-
help=_("List only ports with
|
|
813
|
+
help=_("List only ports with the specified MAC address"),
|
|
812
814
|
)
|
|
813
815
|
parser.add_argument(
|
|
814
816
|
'--long',
|
|
@@ -819,12 +821,12 @@ class ListPort(command.Lister):
|
|
|
819
821
|
parser.add_argument(
|
|
820
822
|
'--project',
|
|
821
823
|
metavar='<project>',
|
|
822
|
-
help=_("List ports
|
|
824
|
+
help=_("List only ports with the specified project (name or ID)"),
|
|
823
825
|
)
|
|
824
826
|
parser.add_argument(
|
|
825
827
|
'--name',
|
|
826
828
|
metavar='<name>',
|
|
827
|
-
help=_("List ports
|
|
829
|
+
help=_("List only ports with the specified name"),
|
|
828
830
|
)
|
|
829
831
|
parser.add_argument(
|
|
830
832
|
'--security-group',
|
|
@@ -842,7 +844,7 @@ class ListPort(command.Lister):
|
|
|
842
844
|
metavar='<status>',
|
|
843
845
|
choices=('ACTIVE', 'BUILD', 'DOWN', 'ERROR'),
|
|
844
846
|
help=_(
|
|
845
|
-
"List ports
|
|
847
|
+
"List only ports with the specified status "
|
|
846
848
|
"('ACTIVE', 'BUILD', 'DOWN', 'ERROR')"
|
|
847
849
|
),
|
|
848
850
|
)
|
|
@@ -859,7 +861,7 @@ class ListPort(command.Lister):
|
|
|
859
861
|
"Desired IP and/or subnet for filtering ports "
|
|
860
862
|
"(name or ID): subnet=<subnet>,ip-address=<ip-address>,"
|
|
861
863
|
"ip-substring=<ip-substring> "
|
|
862
|
-
"(repeat option to
|
|
864
|
+
"(repeat option to filter multiple fixed IP addresses)"
|
|
863
865
|
),
|
|
864
866
|
)
|
|
865
867
|
_tag.add_tag_filtering_option_to_parser(parser, _('ports'))
|
|
@@ -23,11 +23,11 @@ import typing as ty
|
|
|
23
23
|
from cliff import columns as cliff_columns
|
|
24
24
|
from osc_lib.cli import format_columns
|
|
25
25
|
from osc_lib.cli import parseractions
|
|
26
|
-
from osc_lib.command import command
|
|
27
26
|
from osc_lib import exceptions
|
|
28
27
|
from osc_lib import utils
|
|
29
28
|
from osc_lib.utils import tags as _tag
|
|
30
29
|
|
|
30
|
+
from openstackclient import command
|
|
31
31
|
from openstackclient.i18n import _
|
|
32
32
|
from openstackclient.identity import common as identity_common
|
|
33
33
|
from openstackclient.network import common
|
|
@@ -35,12 +35,12 @@ from openstackclient.network import common
|
|
|
35
35
|
LOG = logging.getLogger(__name__)
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
class AdminStateColumn(cliff_columns.FormattableColumn):
|
|
38
|
+
class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
|
|
39
39
|
def human_readable(self):
|
|
40
40
|
return 'UP' if self._value else 'DOWN'
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
class RouterInfoColumn(cliff_columns.FormattableColumn):
|
|
43
|
+
class RouterInfoColumn(cliff_columns.FormattableColumn[ty.Any]):
|
|
44
44
|
def human_readable(self):
|
|
45
45
|
try:
|
|
46
46
|
return json.dumps(self._value)
|
|
@@ -48,7 +48,7 @@ class RouterInfoColumn(cliff_columns.FormattableColumn):
|
|
|
48
48
|
return ''
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
class RoutesColumn(cliff_columns.FormattableColumn):
|
|
51
|
+
class RoutesColumn(cliff_columns.FormattableColumn[ty.Any]):
|
|
52
52
|
def human_readable(self):
|
|
53
53
|
# Map the route keys to match --route option.
|
|
54
54
|
for route in self._value or []:
|
|
@@ -89,7 +89,12 @@ def _get_columns(item):
|
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
def is_multiple_gateways_supported(n_client):
|
|
92
|
-
return
|
|
92
|
+
return (
|
|
93
|
+
n_client.find_extension(
|
|
94
|
+
"external-gateway-multihoming", ignore_missing=True
|
|
95
|
+
)
|
|
96
|
+
is not None
|
|
97
|
+
)
|
|
93
98
|
|
|
94
99
|
|
|
95
100
|
def _passed_multiple_gateways(extension_supported, external_gateways):
|
|
@@ -236,7 +241,9 @@ def _get_attrs(client_manager, parsed_args):
|
|
|
236
241
|
|
|
237
242
|
# "router set" command doesn't support setting flavor_id.
|
|
238
243
|
if 'flavor_id' in parsed_args and parsed_args.flavor_id is not None:
|
|
239
|
-
flavor = n_client.find_flavor(
|
|
244
|
+
flavor = n_client.find_flavor(
|
|
245
|
+
parsed_args.flavor_id, ignore_missing=False
|
|
246
|
+
)
|
|
240
247
|
attrs['flavor_id'] = flavor.id
|
|
241
248
|
elif 'flavor' in parsed_args and parsed_args.flavor is not None:
|
|
242
249
|
flavor = n_client.find_flavor(parsed_args.flavor, ignore_missing=False)
|
|
@@ -719,13 +726,17 @@ class ListRouter(command.Lister):
|
|
|
719
726
|
parser.add_argument(
|
|
720
727
|
'--project',
|
|
721
728
|
metavar='<project>',
|
|
722
|
-
help=_(
|
|
729
|
+
help=_(
|
|
730
|
+
"List only routers with the specified project (name or ID)"
|
|
731
|
+
),
|
|
723
732
|
)
|
|
724
733
|
identity_common.add_project_domain_option_to_parser(parser)
|
|
725
734
|
parser.add_argument(
|
|
726
735
|
'--agent',
|
|
727
736
|
metavar='<agent-id>',
|
|
728
|
-
help=_(
|
|
737
|
+
help=_(
|
|
738
|
+
"List only routers hosted by the specified agent (ID only)"
|
|
739
|
+
),
|
|
729
740
|
)
|
|
730
741
|
_tag.add_tag_filtering_option_to_parser(parser, _('routers'))
|
|
731
742
|
|