python-openstackclient 8.2.0__py3-none-any.whl → 8.3.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 +4 -2
- openstackclient/common/project_cleanup.py +10 -8
- openstackclient/common/quota.py +23 -6
- 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 +76 -27
- 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 +2 -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 +1 -1
- 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 +1 -1
- 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 +1 -1
- openstackclient/identity/v3/mapping.py +1 -1
- openstackclient/identity/v3/policy.py +1 -1
- openstackclient/identity/v3/project.py +10 -3
- openstackclient/identity/v3/region.py +1 -1
- openstackclient/identity/v3/registered_limit.py +16 -11
- 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 +3 -2
- 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 +14 -11
- 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_role_assignment.py +174 -0
- openstackclient/tests/functional/image/v2/test_cache.py +54 -0
- openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
- 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 +20 -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 +364 -30
- 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_oauth.py +1 -1
- openstackclient/tests/unit/identity/v3/test_project.py +1 -1
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
- 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 +111 -0
- 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_volume_backup.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume.py +4 -0
- 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 +1 -1
- openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
- openstackclient/volume/v2/qos_specs.py +1 -1
- openstackclient/volume/v2/service.py +1 -1
- openstackclient/volume/v2/volume.py +2 -2
- openstackclient/volume/v2/volume_backend.py +1 -1
- openstackclient/volume/v2/volume_backup.py +5 -3
- openstackclient/volume/v2/volume_host.py +1 -2
- openstackclient/volume/v2/volume_snapshot.py +2 -2
- openstackclient/volume/v2/volume_transfer_request.py +1 -1
- openstackclient/volume/v2/volume_type.py +11 -6
- 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 +2 -2
- openstackclient/volume/v3/volume_attachment.py +6 -5
- openstackclient/volume/v3/volume_backup.py +18 -3
- 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 +2 -2
- openstackclient/volume/v3/volume_transfer_request.py +1 -1
- openstackclient/volume/v3/volume_type.py +15 -9
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +15 -13
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +224 -213
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +10 -0
- python_openstackclient-8.3.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-8.3.0.dist-info/licenses}/LICENSE +0 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
|
@@ -14,13 +14,14 @@
|
|
|
14
14
|
"""Security Group action implementations"""
|
|
15
15
|
|
|
16
16
|
import argparse
|
|
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 utils
|
|
21
21
|
from osc_lib.utils import tags as _tag
|
|
22
22
|
|
|
23
23
|
from openstackclient.api import compute_v2
|
|
24
|
+
from openstackclient import command
|
|
24
25
|
from openstackclient.i18n import _
|
|
25
26
|
from openstackclient.identity import common as identity_common
|
|
26
27
|
from openstackclient.network import common
|
|
@@ -65,12 +66,12 @@ def _format_compute_security_group_rules(sg_rules):
|
|
|
65
66
|
return utils.format_list(rules, separator='\n')
|
|
66
67
|
|
|
67
68
|
|
|
68
|
-
class NetworkSecurityGroupRulesColumn(cliff_columns.FormattableColumn):
|
|
69
|
+
class NetworkSecurityGroupRulesColumn(cliff_columns.FormattableColumn[ty.Any]):
|
|
69
70
|
def human_readable(self):
|
|
70
71
|
return _format_network_security_group_rules(self._value)
|
|
71
72
|
|
|
72
73
|
|
|
73
|
-
class ComputeSecurityGroupRulesColumn(cliff_columns.FormattableColumn):
|
|
74
|
+
class ComputeSecurityGroupRulesColumn(cliff_columns.FormattableColumn[ty.Any]):
|
|
74
75
|
def human_readable(self):
|
|
75
76
|
return _format_compute_security_group_rules(self._value)
|
|
76
77
|
|
|
@@ -246,7 +247,10 @@ class ListSecurityGroup(common.NetworkAndComputeLister):
|
|
|
246
247
|
'--project',
|
|
247
248
|
metavar='<project>',
|
|
248
249
|
help=self.enhance_help_neutron(
|
|
249
|
-
_(
|
|
250
|
+
_(
|
|
251
|
+
"List only security groups with the specified project "
|
|
252
|
+
"(name or ID)"
|
|
253
|
+
)
|
|
250
254
|
),
|
|
251
255
|
)
|
|
252
256
|
identity_common.add_project_domain_option_to_parser(
|
|
@@ -259,14 +263,14 @@ class ListSecurityGroup(common.NetworkAndComputeLister):
|
|
|
259
263
|
action='store_true',
|
|
260
264
|
dest='shared',
|
|
261
265
|
default=None,
|
|
262
|
-
help=_("List security groups shared between projects"),
|
|
266
|
+
help=_("List only security groups shared between projects"),
|
|
263
267
|
)
|
|
264
268
|
shared_group.add_argument(
|
|
265
269
|
'--no-share',
|
|
266
270
|
action='store_false',
|
|
267
271
|
dest='shared',
|
|
268
272
|
default=None,
|
|
269
|
-
help=_("List security groups not shared between projects"),
|
|
273
|
+
help=_("List only security groups not shared between projects"),
|
|
270
274
|
)
|
|
271
275
|
|
|
272
276
|
_tag.add_tag_filtering_option_to_parser(
|
|
@@ -387,7 +387,8 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
|
|
|
387
387
|
type=network_utils.convert_to_lowercase,
|
|
388
388
|
help=self.enhance_help_neutron(
|
|
389
389
|
_(
|
|
390
|
-
"List rules
|
|
390
|
+
"List only rules with the specified IP protocol "
|
|
391
|
+
"(ah, dhcp, egp, esp, gre, "
|
|
391
392
|
"icmp, igmp, ipv6-encap, ipv6-frag, ipv6-icmp, "
|
|
392
393
|
"ipv6-nonxt, ipv6-opts, ipv6-route, ospf, pgm, rsvp, "
|
|
393
394
|
"sctp, tcp, udp, udplite, vrrp and integer "
|
|
@@ -401,7 +402,10 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
|
|
|
401
402
|
metavar='<ethertype>',
|
|
402
403
|
type=network_utils.convert_to_lowercase,
|
|
403
404
|
help=self.enhance_help_neutron(
|
|
404
|
-
_(
|
|
405
|
+
_(
|
|
406
|
+
"List only rules with the specified Ethertype "
|
|
407
|
+
"(IPv4 or IPv6)"
|
|
408
|
+
)
|
|
405
409
|
),
|
|
406
410
|
)
|
|
407
411
|
direction_group = parser.add_mutually_exclusive_group()
|
|
@@ -409,14 +413,14 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
|
|
|
409
413
|
'--ingress',
|
|
410
414
|
action='store_true',
|
|
411
415
|
help=self.enhance_help_neutron(
|
|
412
|
-
_("List rules applied to incoming network traffic")
|
|
416
|
+
_("List only rules applied to incoming network traffic")
|
|
413
417
|
),
|
|
414
418
|
)
|
|
415
419
|
direction_group.add_argument(
|
|
416
420
|
'--egress',
|
|
417
421
|
action='store_true',
|
|
418
422
|
help=self.enhance_help_neutron(
|
|
419
|
-
_("List rules applied to outgoing network traffic")
|
|
423
|
+
_("List only rules applied to outgoing network traffic")
|
|
420
424
|
),
|
|
421
425
|
)
|
|
422
426
|
parser.add_argument(
|
|
@@ -430,7 +434,9 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
|
|
|
430
434
|
parser.add_argument(
|
|
431
435
|
'--project',
|
|
432
436
|
metavar='<project>',
|
|
433
|
-
help=self.enhance_help_neutron(
|
|
437
|
+
help=self.enhance_help_neutron(
|
|
438
|
+
_("List only rules with the specified project (name or ID)")
|
|
439
|
+
),
|
|
434
440
|
)
|
|
435
441
|
identity_common.add_project_domain_option_to_parser(
|
|
436
442
|
parser, enhance_help=self.enhance_help_neutron
|