python-openstackclient 7.4.0__py3-none-any.whl → 8.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/common/availability_zone.py +3 -6
- openstackclient/common/clientmanager.py +2 -1
- openstackclient/common/envvars.py +57 -0
- openstackclient/common/extension.py +3 -11
- openstackclient/common/limits.py +1 -1
- openstackclient/common/project_cleanup.py +3 -2
- openstackclient/common/quota.py +54 -28
- openstackclient/compute/client.py +7 -5
- openstackclient/compute/v2/agent.py +5 -5
- openstackclient/compute/v2/aggregate.py +17 -15
- openstackclient/compute/v2/console.py +10 -4
- openstackclient/compute/v2/console_connection.py +48 -0
- openstackclient/compute/v2/flavor.py +14 -18
- openstackclient/compute/v2/host.py +3 -3
- openstackclient/compute/v2/hypervisor.py +10 -4
- openstackclient/compute/v2/hypervisor_stats.py +1 -1
- openstackclient/compute/v2/keypair.py +18 -13
- openstackclient/compute/v2/server.py +144 -121
- openstackclient/compute/v2/server_backup.py +1 -1
- openstackclient/compute/v2/server_event.py +8 -17
- openstackclient/compute/v2/server_group.py +6 -6
- openstackclient/compute/v2/server_image.py +1 -1
- openstackclient/compute/v2/server_migration.py +6 -6
- openstackclient/compute/v2/server_volume.py +4 -4
- openstackclient/compute/v2/service.py +9 -13
- openstackclient/compute/v2/usage.py +4 -6
- openstackclient/identity/client.py +2 -4
- openstackclient/identity/common.py +95 -17
- openstackclient/identity/v2_0/ec2creds.py +4 -3
- openstackclient/identity/v2_0/endpoint.py +12 -10
- openstackclient/identity/v2_0/project.py +6 -6
- openstackclient/identity/v2_0/role.py +1 -1
- openstackclient/identity/v2_0/service.py +7 -7
- openstackclient/identity/v2_0/user.py +6 -21
- openstackclient/identity/v3/access_rule.py +2 -5
- openstackclient/identity/v3/application_credential.py +2 -2
- openstackclient/identity/v3/consumer.py +4 -3
- openstackclient/identity/v3/credential.py +6 -7
- openstackclient/identity/v3/domain.py +63 -44
- openstackclient/identity/v3/ec2creds.py +4 -3
- openstackclient/identity/v3/endpoint.py +104 -88
- openstackclient/identity/v3/endpoint_group.py +1 -1
- openstackclient/identity/v3/group.py +116 -72
- openstackclient/identity/v3/identity_provider.py +1 -2
- openstackclient/identity/v3/limit.py +4 -9
- openstackclient/identity/v3/mapping.py +4 -3
- openstackclient/identity/v3/policy.py +5 -8
- openstackclient/identity/v3/project.py +23 -6
- openstackclient/identity/v3/region.py +2 -5
- openstackclient/identity/v3/registered_limit.py +4 -8
- openstackclient/identity/v3/role.py +15 -16
- openstackclient/identity/v3/service.py +8 -8
- openstackclient/identity/v3/service_provider.py +3 -6
- openstackclient/identity/v3/tag.py +2 -2
- openstackclient/identity/v3/token.py +1 -2
- openstackclient/identity/v3/trust.py +74 -25
- openstackclient/identity/v3/user.py +47 -11
- openstackclient/image/client.py +7 -5
- openstackclient/image/v1/image.py +11 -15
- openstackclient/image/v2/cache.py +2 -4
- openstackclient/image/v2/image.py +41 -48
- openstackclient/image/v2/metadef_namespaces.py +4 -3
- openstackclient/image/v2/metadef_resource_type_association.py +1 -2
- openstackclient/image/v2/metadef_resource_types.py +1 -2
- openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +9 -1370
- openstackclient/network/client.py +4 -16
- openstackclient/network/common.py +16 -12
- openstackclient/network/utils.py +3 -3
- openstackclient/network/v2/address_group.py +5 -9
- openstackclient/network/v2/address_scope.py +2 -3
- openstackclient/network/v2/default_security_group_rule.py +1 -2
- openstackclient/network/v2/floating_ip.py +69 -47
- openstackclient/network/v2/floating_ip_port_forwarding.py +7 -7
- openstackclient/network/v2/ip_availability.py +1 -2
- openstackclient/network/v2/l3_conntrack_helper.py +8 -12
- openstackclient/network/v2/local_ip.py +24 -26
- openstackclient/network/v2/local_ip_association.py +4 -5
- openstackclient/network/v2/ndp_proxy.py +9 -10
- openstackclient/network/v2/network.py +12 -16
- openstackclient/network/v2/network_agent.py +29 -37
- openstackclient/network/v2/network_auto_allocated_topology.py +4 -5
- openstackclient/network/v2/network_flavor.py +1 -1
- openstackclient/network/v2/network_flavor_profile.py +5 -5
- openstackclient/network/v2/network_meter.py +3 -3
- openstackclient/network/v2/network_meter_rule.py +5 -8
- openstackclient/network/v2/network_qos_policy.py +4 -4
- openstackclient/network/v2/network_qos_rule.py +7 -16
- openstackclient/network/v2/network_rbac.py +4 -4
- openstackclient/network/v2/network_segment.py +6 -7
- openstackclient/network/v2/network_segment_range.py +16 -20
- openstackclient/network/v2/network_trunk.py +24 -16
- openstackclient/network/v2/port.py +28 -29
- openstackclient/network/v2/router.py +53 -42
- openstackclient/network/v2/security_group.py +13 -19
- openstackclient/network/v2/security_group_rule.py +10 -11
- openstackclient/network/v2/subnet.py +31 -30
- openstackclient/network/v2/subnet_pool.py +4 -4
- openstackclient/object/client.py +2 -3
- openstackclient/object/v1/container.py +2 -3
- openstackclient/object/v1/object.py +2 -9
- openstackclient/shell.py +22 -5
- openstackclient/tests/functional/base.py +7 -3
- openstackclient/tests/functional/common/test_quota.py +3 -1
- openstackclient/tests/functional/compute/v2/common.py +12 -6
- openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
- openstackclient/tests/functional/compute/v2/test_server.py +2 -3
- openstackclient/tests/functional/compute/v2/test_server_event.py +1 -1
- openstackclient/tests/functional/identity/v2/test_user.py +1 -1
- openstackclient/tests/functional/identity/v3/common.py +3 -8
- openstackclient/tests/functional/identity/v3/test_application_credential.py +10 -10
- openstackclient/tests/functional/identity/v3/test_endpoint.py +3 -3
- openstackclient/tests/functional/identity/v3/test_group.py +3 -3
- openstackclient/tests/functional/identity/v3/test_idp.py +3 -7
- openstackclient/tests/functional/identity/v3/test_limit.py +4 -4
- openstackclient/tests/functional/identity/v3/test_project.py +5 -14
- openstackclient/tests/functional/identity/v3/test_region.py +1 -3
- openstackclient/tests/functional/identity/v3/test_registered_limit.py +3 -3
- openstackclient/tests/functional/identity/v3/test_role.py +1 -1
- openstackclient/tests/functional/identity/v3/test_role_assignment.py +13 -31
- openstackclient/tests/functional/identity/v3/test_service_provider.py +3 -7
- openstackclient/tests/functional/identity/v3/test_user.py +8 -8
- openstackclient/tests/functional/network/v2/common.py +7 -3
- openstackclient/tests/functional/network/v2/test_address_group.py +4 -0
- openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +15 -11
- openstackclient/tests/functional/network/v2/test_local_ip.py +4 -0
- openstackclient/tests/functional/network/v2/test_network_meter_rule.py +2 -2
- openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +2 -3
- openstackclient/tests/functional/network/v2/test_network_rbac.py +2 -2
- openstackclient/tests/functional/network/v2/test_network_trunk.py +1 -1
- openstackclient/tests/functional/network/v2/test_port.py +17 -7
- openstackclient/tests/functional/network/v2/test_router.py +42 -0
- openstackclient/tests/functional/network/v2/test_subnet_pool.py +4 -0
- openstackclient/tests/unit/api/test_compute_v2.py +67 -87
- openstackclient/tests/unit/common/test_availability_zone.py +6 -14
- openstackclient/tests/unit/common/test_command.py +1 -1
- openstackclient/tests/unit/common/test_extension.py +5 -7
- openstackclient/tests/unit/common/test_limits.py +1 -1
- openstackclient/tests/unit/common/test_project_cleanup.py +5 -6
- openstackclient/tests/unit/common/test_quota.py +51 -28
- openstackclient/tests/unit/compute/v2/fakes.py +85 -315
- openstackclient/tests/unit/compute/v2/test_agent.py +16 -16
- openstackclient/tests/unit/compute/v2/test_aggregate.py +56 -60
- openstackclient/tests/unit/compute/v2/test_console.py +34 -17
- openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
- openstackclient/tests/unit/compute/v2/test_flavor.py +72 -72
- openstackclient/tests/unit/compute/v2/test_host.py +8 -8
- openstackclient/tests/unit/compute/v2/test_hypervisor.py +22 -30
- openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -2
- openstackclient/tests/unit/compute/v2/test_keypair.py +36 -29
- openstackclient/tests/unit/compute/v2/test_server.py +693 -606
- openstackclient/tests/unit/compute/v2/test_server_backup.py +36 -77
- openstackclient/tests/unit/compute/v2/test_server_event.py +18 -20
- openstackclient/tests/unit/compute/v2/test_server_group.py +25 -31
- openstackclient/tests/unit/compute/v2/test_server_image.py +37 -78
- openstackclient/tests/unit/compute/v2/test_server_migration.py +41 -41
- openstackclient/tests/unit/compute/v2/test_server_volume.py +12 -12
- openstackclient/tests/unit/compute/v2/test_service.py +39 -45
- openstackclient/tests/unit/compute/v2/test_usage.py +5 -5
- openstackclient/tests/unit/identity/v2_0/fakes.py +1 -1
- openstackclient/tests/unit/identity/v3/test_access_rule.py +1 -3
- openstackclient/tests/unit/identity/v3/test_application_credential.py +48 -26
- openstackclient/tests/unit/identity/v3/test_domain.py +115 -105
- openstackclient/tests/unit/identity/v3/test_endpoint.py +167 -172
- openstackclient/tests/unit/identity/v3/test_group.py +353 -202
- openstackclient/tests/unit/identity/v3/test_mappings.py +2 -2
- openstackclient/tests/unit/identity/v3/test_project.py +16 -0
- openstackclient/tests/unit/identity/v3/test_trust.py +5 -2
- openstackclient/tests/unit/identity/v3/test_user.py +102 -6
- openstackclient/tests/unit/image/v1/fakes.py +2 -2
- openstackclient/tests/unit/image/v1/test_image.py +8 -9
- openstackclient/tests/unit/image/v2/test_image.py +84 -46
- openstackclient/tests/unit/integ/cli/test_shell.py +1 -2
- openstackclient/tests/unit/network/test_common.py +2 -2
- openstackclient/tests/unit/network/v2/fakes.py +405 -485
- openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +8 -14
- openstackclient/tests/unit/network/v2/test_floating_ip_network.py +62 -54
- openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +1 -1
- openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
- openstackclient/tests/unit/network/v2/test_ndp_proxy.py +1 -3
- openstackclient/tests/unit/network/v2/test_network.py +4 -4
- openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
- openstackclient/tests/unit/network/v2/test_network_compute.py +11 -11
- openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
- openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
- openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
- openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
- openstackclient/tests/unit/network/v2/test_network_trunk.py +2 -2
- openstackclient/tests/unit/network/v2/test_port.py +21 -22
- openstackclient/tests/unit/network/v2/test_router.py +130 -51
- openstackclient/tests/unit/network/v2/test_security_group_compute.py +11 -19
- openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -27
- openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +15 -17
- openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +33 -39
- openstackclient/tests/unit/object/v1/test_object_all.py +4 -3
- openstackclient/tests/unit/test_shell.py +16 -13
- openstackclient/tests/unit/volume/v2/fakes.py +1 -2
- openstackclient/tests/unit/volume/v2/test_service.py +57 -91
- openstackclient/tests/unit/volume/v2/test_volume.py +109 -106
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
- openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
- openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +1 -1
- openstackclient/tests/unit/volume/v3/fakes.py +2 -8
- openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
- openstackclient/tests/unit/volume/v3/test_service.py +221 -141
- openstackclient/tests/unit/volume/v3/test_volume.py +131 -120
- openstackclient/tests/unit/volume/v3/test_volume_attachment.py +4 -4
- openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
- openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +683 -49
- openstackclient/tests/unit/volume/v3/test_volume_transfer_request.py +1 -1
- openstackclient/volume/client.py +1 -3
- openstackclient/volume/v2/consistency_group.py +4 -8
- openstackclient/volume/v2/consistency_group_snapshot.py +1 -2
- openstackclient/volume/v2/qos_specs.py +1 -2
- openstackclient/volume/v2/service.py +41 -38
- openstackclient/volume/v2/volume.py +71 -53
- openstackclient/volume/v2/volume_backup.py +15 -10
- openstackclient/volume/v2/volume_snapshot.py +129 -93
- openstackclient/volume/v2/volume_transfer_request.py +0 -3
- openstackclient/volume/v2/volume_type.py +10 -21
- openstackclient/volume/v3/block_storage_cluster.py +3 -3
- openstackclient/volume/v3/block_storage_log_level.py +22 -28
- openstackclient/volume/v3/block_storage_manage.py +1 -3
- openstackclient/volume/v3/service.py +105 -14
- openstackclient/volume/v3/volume.py +218 -58
- openstackclient/volume/v3/volume_attachment.py +3 -2
- openstackclient/volume/v3/volume_backup.py +31 -27
- openstackclient/volume/v3/volume_group.py +2 -1
- openstackclient/volume/v3/volume_group_snapshot.py +2 -1
- openstackclient/volume/v3/volume_snapshot.py +489 -13
- openstackclient/volume/v3/volume_type.py +10 -21
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/AUTHORS +11 -0
- python_openstackclient-8.1.0.dist-info/METADATA +264 -0
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/RECORD +238 -259
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/entry_points.txt +7 -47
- python_openstackclient-8.1.0.dist-info/pbr.json +1 -0
- openstackclient/tests/functional/volume/v1/__init__.py +0 -0
- openstackclient/tests/functional/volume/v1/common.py +0 -35
- openstackclient/tests/functional/volume/v1/test_qos.py +0 -100
- openstackclient/tests/functional/volume/v1/test_service.py +0 -76
- openstackclient/tests/functional/volume/v1/test_snapshot.py +0 -232
- openstackclient/tests/functional/volume/v1/test_transfer_request.py +0 -111
- openstackclient/tests/functional/volume/v1/test_volume.py +0 -228
- openstackclient/tests/functional/volume/v1/test_volume_type.py +0 -213
- openstackclient/tests/unit/volume/v1/__init__.py +0 -0
- openstackclient/tests/unit/volume/v1/fakes.py +0 -615
- openstackclient/tests/unit/volume/v1/test_qos_specs.py +0 -471
- openstackclient/tests/unit/volume/v1/test_service.py +0 -295
- openstackclient/tests/unit/volume/v1/test_transfer_request.py +0 -380
- openstackclient/tests/unit/volume/v1/test_type.py +0 -633
- openstackclient/tests/unit/volume/v1/test_volume.py +0 -1447
- openstackclient/tests/unit/volume/v1/test_volume_backup.py +0 -435
- openstackclient/volume/v1/__init__.py +0 -0
- openstackclient/volume/v1/qos_specs.py +0 -377
- openstackclient/volume/v1/service.py +0 -136
- openstackclient/volume/v1/volume.py +0 -734
- openstackclient/volume/v1/volume_backup.py +0 -302
- openstackclient/volume/v1/volume_snapshot.py +0 -433
- openstackclient/volume/v1/volume_transfer_request.py +0 -200
- openstackclient/volume/v1/volume_type.py +0 -520
- python_openstackclient-7.4.0.dist-info/METADATA +0 -172
- python_openstackclient-7.4.0.dist-info/pbr.json +0 -1
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/LICENSE +0 -0
- {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/top_level.txt +0 -0
|
@@ -194,7 +194,7 @@ class DeleteUser(command.Command):
|
|
|
194
194
|
|
|
195
195
|
if errors > 0:
|
|
196
196
|
total = len(parsed_args.users)
|
|
197
|
-
msg = _("%(errors)s of %(total)s users failed
|
|
197
|
+
msg = _("%(errors)s of %(total)s users failed to delete.") % {
|
|
198
198
|
'errors': errors,
|
|
199
199
|
'total': total,
|
|
200
200
|
}
|
|
@@ -230,21 +230,11 @@ class ListUser(command.Lister):
|
|
|
230
230
|
)
|
|
231
231
|
project = project.id
|
|
232
232
|
|
|
233
|
+
columns: tuple[str, ...] = ('id', 'name')
|
|
234
|
+
column_headers: tuple[str, ...] = ('ID', 'Name')
|
|
233
235
|
if parsed_args.long:
|
|
234
|
-
columns
|
|
235
|
-
|
|
236
|
-
'Name',
|
|
237
|
-
'tenantId',
|
|
238
|
-
'Email',
|
|
239
|
-
'Enabled',
|
|
240
|
-
)
|
|
241
|
-
column_headers = (
|
|
242
|
-
'ID',
|
|
243
|
-
'Name',
|
|
244
|
-
'Project',
|
|
245
|
-
'Email',
|
|
246
|
-
'Enabled',
|
|
247
|
-
)
|
|
236
|
+
columns += ('tenantId', 'email', 'enabled')
|
|
237
|
+
column_headers += ('Project', 'Email', 'Enabled')
|
|
248
238
|
# Cache the project list
|
|
249
239
|
project_cache = {}
|
|
250
240
|
try:
|
|
@@ -256,15 +246,10 @@ class ListUser(command.Lister):
|
|
|
256
246
|
formatters['tenantId'] = functools.partial(
|
|
257
247
|
ProjectColumn, project_cache=project_cache
|
|
258
248
|
)
|
|
259
|
-
else:
|
|
260
|
-
columns = column_headers = ('ID', 'Name')
|
|
261
249
|
data = identity_client.users.list(tenant_id=project)
|
|
262
250
|
|
|
263
251
|
if parsed_args.project:
|
|
264
|
-
|
|
265
|
-
for s in data:
|
|
266
|
-
d[s.id] = s
|
|
267
|
-
data = d.values()
|
|
252
|
+
data = {s.id: s for s in data}.values()
|
|
268
253
|
|
|
269
254
|
if parsed_args.long:
|
|
270
255
|
# FIXME(dtroyer): Sometimes user objects have 'tenant_id' instead
|
|
@@ -54,17 +54,14 @@ class DeleteAccessRule(command.Command):
|
|
|
54
54
|
except Exception as e:
|
|
55
55
|
errors += 1
|
|
56
56
|
LOG.error(
|
|
57
|
-
_(
|
|
58
|
-
"Failed to delete access rule with "
|
|
59
|
-
"ID '%(ac)s': %(e)s"
|
|
60
|
-
),
|
|
57
|
+
_("Failed to delete access rule with ID '%(ac)s': %(e)s"),
|
|
61
58
|
{'ac': ac, 'e': e},
|
|
62
59
|
)
|
|
63
60
|
|
|
64
61
|
if errors > 0:
|
|
65
62
|
total = len(parsed_args.access_rule)
|
|
66
63
|
msg = _(
|
|
67
|
-
"%(errors)s of %(total)s access rules failed
|
|
64
|
+
"%(errors)s of %(total)s access rules failed to delete."
|
|
68
65
|
) % {'errors': errors, 'total': total}
|
|
69
66
|
raise exceptions.CommandError(msg)
|
|
70
67
|
|
|
@@ -269,9 +269,9 @@ class ListApplicationCredential(command.Lister):
|
|
|
269
269
|
def take_action(self, parsed_args):
|
|
270
270
|
identity_client = self.app.client_manager.sdk_connection.identity
|
|
271
271
|
if parsed_args.user:
|
|
272
|
-
user_id = common.
|
|
272
|
+
user_id = common.find_user_id_sdk(
|
|
273
273
|
identity_client, parsed_args.user, parsed_args.user_domain
|
|
274
|
-
)
|
|
274
|
+
)
|
|
275
275
|
else:
|
|
276
276
|
conn = self.app.client_manager.sdk_connection
|
|
277
277
|
user_id = conn.config.get_auth().get_user_id(conn.identity)
|
|
@@ -82,9 +82,10 @@ class DeleteConsumer(command.Command):
|
|
|
82
82
|
|
|
83
83
|
if result > 0:
|
|
84
84
|
total = len(parsed_args.consumer)
|
|
85
|
-
msg = _(
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
msg = _("%(result)s of %(total)s consumers failed to delete.") % {
|
|
86
|
+
'result': result,
|
|
87
|
+
'total': total,
|
|
88
|
+
}
|
|
88
89
|
raise exceptions.CommandError(msg)
|
|
89
90
|
|
|
90
91
|
|
|
@@ -70,8 +70,7 @@ class CreateCredential(command.ShowOne):
|
|
|
70
70
|
'--project',
|
|
71
71
|
metavar='<project>',
|
|
72
72
|
help=_(
|
|
73
|
-
'Project which limits the scope of '
|
|
74
|
-
'the credential (name or ID)'
|
|
73
|
+
'Project which limits the scope of the credential (name or ID)'
|
|
75
74
|
),
|
|
76
75
|
)
|
|
77
76
|
return parser
|
|
@@ -128,9 +127,10 @@ class DeleteCredential(command.Command):
|
|
|
128
127
|
|
|
129
128
|
if result > 0:
|
|
130
129
|
total = len(parsed_args.credential)
|
|
131
|
-
msg = _(
|
|
132
|
-
|
|
133
|
-
|
|
130
|
+
msg = _("%(result)s of %(total)s credential failed to delete.") % {
|
|
131
|
+
'result': result,
|
|
132
|
+
'total': total,
|
|
133
|
+
}
|
|
134
134
|
raise exceptions.CommandError(msg)
|
|
135
135
|
|
|
136
136
|
|
|
@@ -219,8 +219,7 @@ class SetCredential(command.Command):
|
|
|
219
219
|
'--project',
|
|
220
220
|
metavar='<project>',
|
|
221
221
|
help=_(
|
|
222
|
-
'Project which limits the scope of '
|
|
223
|
-
'the credential (name or ID)'
|
|
222
|
+
'Project which limits the scope of the credential (name or ID)'
|
|
224
223
|
),
|
|
225
224
|
)
|
|
226
225
|
return parser
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
|
-
from
|
|
20
|
+
from openstack import exceptions as sdk_exceptions
|
|
21
21
|
from osc_lib.command import command
|
|
22
22
|
from osc_lib import exceptions
|
|
23
23
|
from osc_lib import utils
|
|
@@ -29,6 +29,31 @@ from openstackclient.identity import common
|
|
|
29
29
|
LOG = logging.getLogger(__name__)
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
def _format_domain(domain):
|
|
33
|
+
columns = (
|
|
34
|
+
'id',
|
|
35
|
+
'name',
|
|
36
|
+
'is_enabled',
|
|
37
|
+
'description',
|
|
38
|
+
'options',
|
|
39
|
+
)
|
|
40
|
+
column_headers = (
|
|
41
|
+
'id',
|
|
42
|
+
'name',
|
|
43
|
+
'enabled',
|
|
44
|
+
'description',
|
|
45
|
+
'options',
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
column_headers,
|
|
50
|
+
utils.get_item_properties(
|
|
51
|
+
domain,
|
|
52
|
+
columns,
|
|
53
|
+
),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
32
57
|
class CreateDomain(command.ShowOne):
|
|
33
58
|
_description = _("Create new domain")
|
|
34
59
|
|
|
@@ -47,12 +72,15 @@ class CreateDomain(command.ShowOne):
|
|
|
47
72
|
enable_group = parser.add_mutually_exclusive_group()
|
|
48
73
|
enable_group.add_argument(
|
|
49
74
|
'--enable',
|
|
75
|
+
dest='is_enabled',
|
|
50
76
|
action='store_true',
|
|
77
|
+
default=True,
|
|
51
78
|
help=_('Enable domain (default)'),
|
|
52
79
|
)
|
|
53
80
|
enable_group.add_argument(
|
|
54
81
|
'--disable',
|
|
55
|
-
|
|
82
|
+
dest='is_enabled',
|
|
83
|
+
action='store_false',
|
|
56
84
|
help=_('Disable domain'),
|
|
57
85
|
)
|
|
58
86
|
parser.add_argument(
|
|
@@ -64,32 +92,25 @@ class CreateDomain(command.ShowOne):
|
|
|
64
92
|
return parser
|
|
65
93
|
|
|
66
94
|
def take_action(self, parsed_args):
|
|
67
|
-
identity_client = self.app.client_manager.identity
|
|
68
|
-
|
|
69
|
-
enabled = True
|
|
70
|
-
if parsed_args.disable:
|
|
71
|
-
enabled = False
|
|
95
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
72
96
|
|
|
73
97
|
options = common.get_immutable_options(parsed_args)
|
|
74
98
|
|
|
75
99
|
try:
|
|
76
|
-
domain = identity_client.
|
|
100
|
+
domain = identity_client.create_domain(
|
|
77
101
|
name=parsed_args.name,
|
|
78
102
|
description=parsed_args.description,
|
|
79
103
|
options=options,
|
|
80
|
-
|
|
104
|
+
is_enabled=parsed_args.is_enabled,
|
|
81
105
|
)
|
|
82
|
-
except
|
|
106
|
+
except sdk_exceptions.ConflictException:
|
|
83
107
|
if parsed_args.or_show:
|
|
84
|
-
domain =
|
|
85
|
-
identity_client.domains, parsed_args.name
|
|
86
|
-
)
|
|
108
|
+
domain = identity_client.find_domain(parsed_args.name)
|
|
87
109
|
LOG.info(_('Returning existing domain %s'), domain.name)
|
|
88
110
|
else:
|
|
89
111
|
raise
|
|
90
112
|
|
|
91
|
-
domain
|
|
92
|
-
return zip(*sorted(domain._info.items()))
|
|
113
|
+
return _format_domain(domain)
|
|
93
114
|
|
|
94
115
|
|
|
95
116
|
class DeleteDomain(command.Command):
|
|
@@ -106,12 +127,12 @@ class DeleteDomain(command.Command):
|
|
|
106
127
|
return parser
|
|
107
128
|
|
|
108
129
|
def take_action(self, parsed_args):
|
|
109
|
-
identity_client = self.app.client_manager.identity
|
|
130
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
110
131
|
result = 0
|
|
111
132
|
for i in parsed_args.domain:
|
|
112
133
|
try:
|
|
113
|
-
domain =
|
|
114
|
-
identity_client.
|
|
134
|
+
domain = identity_client.find_domain(i, ignore_missing=False)
|
|
135
|
+
identity_client.delete_domain(domain.id)
|
|
115
136
|
except Exception as e:
|
|
116
137
|
result += 1
|
|
117
138
|
LOG.error(
|
|
@@ -124,7 +145,7 @@ class DeleteDomain(command.Command):
|
|
|
124
145
|
|
|
125
146
|
if result > 0:
|
|
126
147
|
total = len(parsed_args.domain)
|
|
127
|
-
msg = _("%(result)s of %(total)s domains failed
|
|
148
|
+
msg = _("%(result)s of %(total)s domains failed to delete.") % {
|
|
128
149
|
'result': result,
|
|
129
150
|
'total': total,
|
|
130
151
|
}
|
|
@@ -143,7 +164,7 @@ class ListDomain(command.Lister):
|
|
|
143
164
|
)
|
|
144
165
|
parser.add_argument(
|
|
145
166
|
'--enabled',
|
|
146
|
-
dest='
|
|
167
|
+
dest='is_enabled',
|
|
147
168
|
action='store_true',
|
|
148
169
|
help=_('The domains that are enabled will be returned'),
|
|
149
170
|
)
|
|
@@ -153,13 +174,17 @@ class ListDomain(command.Lister):
|
|
|
153
174
|
kwargs = {}
|
|
154
175
|
if parsed_args.name:
|
|
155
176
|
kwargs['name'] = parsed_args.name
|
|
156
|
-
if parsed_args.
|
|
157
|
-
kwargs['
|
|
177
|
+
if parsed_args.is_enabled:
|
|
178
|
+
kwargs['is_enabled'] = True
|
|
179
|
+
|
|
180
|
+
columns = ('id', 'name', 'is_enabled', 'description')
|
|
181
|
+
column_headers = ('ID', 'Name', 'Enabled', 'Description')
|
|
182
|
+
data = self.app.client_manager.sdk_connection.identity.domains(
|
|
183
|
+
**kwargs
|
|
184
|
+
)
|
|
158
185
|
|
|
159
|
-
columns = ('ID', 'Name', 'Enabled', 'Description')
|
|
160
|
-
data = self.app.client_manager.identity.domains.list(**kwargs)
|
|
161
186
|
return (
|
|
162
|
-
|
|
187
|
+
column_headers,
|
|
163
188
|
(
|
|
164
189
|
utils.get_item_properties(
|
|
165
190
|
s,
|
|
@@ -194,38 +219,38 @@ class SetDomain(command.Command):
|
|
|
194
219
|
enable_group = parser.add_mutually_exclusive_group()
|
|
195
220
|
enable_group.add_argument(
|
|
196
221
|
'--enable',
|
|
222
|
+
dest='is_enabled',
|
|
197
223
|
action='store_true',
|
|
224
|
+
default=None,
|
|
198
225
|
help=_('Enable domain'),
|
|
199
226
|
)
|
|
200
227
|
enable_group.add_argument(
|
|
201
228
|
'--disable',
|
|
202
|
-
|
|
229
|
+
dest='is_enabled',
|
|
230
|
+
action='store_false',
|
|
231
|
+
default=None,
|
|
203
232
|
help=_('Disable domain'),
|
|
204
233
|
)
|
|
205
234
|
common.add_resource_option_to_parser(parser)
|
|
206
235
|
return parser
|
|
207
236
|
|
|
208
237
|
def take_action(self, parsed_args):
|
|
209
|
-
identity_client = self.app.client_manager.identity
|
|
210
|
-
domain =
|
|
211
|
-
identity_client.domains, parsed_args.domain
|
|
212
|
-
)
|
|
238
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
239
|
+
domain = identity_client.find_domain(parsed_args.domain)
|
|
213
240
|
kwargs = {}
|
|
214
241
|
if parsed_args.name:
|
|
215
242
|
kwargs['name'] = parsed_args.name
|
|
216
243
|
if parsed_args.description:
|
|
217
244
|
kwargs['description'] = parsed_args.description
|
|
218
245
|
|
|
219
|
-
if parsed_args.
|
|
220
|
-
kwargs['
|
|
221
|
-
if parsed_args.disable:
|
|
222
|
-
kwargs['enabled'] = False
|
|
246
|
+
if parsed_args.is_enabled is not None:
|
|
247
|
+
kwargs['is_enabled'] = parsed_args.is_enabled
|
|
223
248
|
|
|
224
249
|
options = common.get_immutable_options(parsed_args)
|
|
225
250
|
if options:
|
|
226
251
|
kwargs['options'] = options
|
|
227
252
|
|
|
228
|
-
identity_client.
|
|
253
|
+
identity_client.update_domain(domain.id, **kwargs)
|
|
229
254
|
|
|
230
255
|
|
|
231
256
|
class ShowDomain(command.ShowOne):
|
|
@@ -241,13 +266,7 @@ class ShowDomain(command.ShowOne):
|
|
|
241
266
|
return parser
|
|
242
267
|
|
|
243
268
|
def take_action(self, parsed_args):
|
|
244
|
-
identity_client = self.app.client_manager.identity
|
|
245
|
-
|
|
246
|
-
domain_str = common._get_token_resource(
|
|
247
|
-
identity_client, 'domain', parsed_args.domain
|
|
248
|
-
)
|
|
249
|
-
|
|
250
|
-
domain = utils.find_resource(identity_client.domains, domain_str)
|
|
269
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
270
|
+
domain = identity_client.find_domain(parsed_args.domain)
|
|
251
271
|
|
|
252
|
-
domain
|
|
253
|
-
return zip(*sorted(domain._info.items()))
|
|
272
|
+
return _format_domain(domain)
|
|
@@ -156,9 +156,10 @@ class DeleteEC2Creds(command.Command):
|
|
|
156
156
|
|
|
157
157
|
if result > 0:
|
|
158
158
|
total = len(parsed_args.access_key)
|
|
159
|
-
msg = _(
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
msg = _("%(result)s of %(total)s EC2 keys failed to delete.") % {
|
|
160
|
+
'result': result,
|
|
161
|
+
'total': total,
|
|
162
|
+
}
|
|
162
163
|
raise exceptions.CommandError(msg)
|
|
163
164
|
|
|
164
165
|
|
|
@@ -28,11 +28,31 @@ from openstackclient.identity import common
|
|
|
28
28
|
LOG = logging.getLogger(__name__)
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
def
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
def _format_endpoint(endpoint, service):
|
|
32
|
+
columns = (
|
|
33
|
+
'is_enabled',
|
|
34
|
+
'id',
|
|
35
|
+
'interface',
|
|
36
|
+
'region_id',
|
|
37
|
+
'region_id',
|
|
38
|
+
'service_id',
|
|
39
|
+
'url',
|
|
40
|
+
)
|
|
41
|
+
column_headers = (
|
|
42
|
+
'enabled',
|
|
43
|
+
'id',
|
|
44
|
+
'interface',
|
|
45
|
+
'region',
|
|
46
|
+
'region_id',
|
|
47
|
+
'service_id',
|
|
48
|
+
'url',
|
|
49
|
+
'service_name',
|
|
50
|
+
'service_type',
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
data = utils.get_item_properties(endpoint, columns)
|
|
54
|
+
data += (getattr(service, 'name', ''), service.type)
|
|
55
|
+
return column_headers, data
|
|
36
56
|
|
|
37
57
|
|
|
38
58
|
class AddProjectToEndpoint(command.Command):
|
|
@@ -44,15 +64,13 @@ class AddProjectToEndpoint(command.Command):
|
|
|
44
64
|
'endpoint',
|
|
45
65
|
metavar='<endpoint>',
|
|
46
66
|
help=_(
|
|
47
|
-
'Endpoint to associate with
|
|
67
|
+
'Endpoint to associate with specified project (name or ID)'
|
|
48
68
|
),
|
|
49
69
|
)
|
|
50
70
|
parser.add_argument(
|
|
51
71
|
'project',
|
|
52
72
|
metavar='<project>',
|
|
53
|
-
help=_(
|
|
54
|
-
'Project to associate with ' 'specified endpoint name or ID)'
|
|
55
|
-
),
|
|
73
|
+
help=_('Project to associate with specified endpoint name or ID)'),
|
|
56
74
|
)
|
|
57
75
|
common.add_project_domain_option_to_parser(parser)
|
|
58
76
|
return parser
|
|
@@ -114,23 +132,23 @@ class CreateEndpoint(command.ShowOne):
|
|
|
114
132
|
return parser
|
|
115
133
|
|
|
116
134
|
def take_action(self, parsed_args):
|
|
117
|
-
identity_client = self.app.client_manager.identity
|
|
118
|
-
service = common.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
135
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
136
|
+
service = common.find_service_sdk(identity_client, parsed_args.service)
|
|
137
|
+
|
|
138
|
+
kwargs = {}
|
|
139
|
+
|
|
140
|
+
kwargs['service_id'] = service.id
|
|
141
|
+
kwargs['url'] = parsed_args.url
|
|
142
|
+
kwargs['interface'] = parsed_args.interface
|
|
143
|
+
kwargs['is_enabled'] = parsed_args.enabled
|
|
144
|
+
|
|
145
|
+
if parsed_args.region:
|
|
146
|
+
region = identity_client.get_region(parsed_args.region)
|
|
147
|
+
kwargs['region_id'] = region.id
|
|
127
148
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
info['service_name'] = get_service_name(service)
|
|
132
|
-
info['service_type'] = service.type
|
|
133
|
-
return zip(*sorted(info.items()))
|
|
149
|
+
endpoint = identity_client.create_endpoint(**kwargs)
|
|
150
|
+
|
|
151
|
+
return _format_endpoint(endpoint, service=service)
|
|
134
152
|
|
|
135
153
|
|
|
136
154
|
class DeleteEndpoint(command.Command):
|
|
@@ -147,14 +165,12 @@ class DeleteEndpoint(command.Command):
|
|
|
147
165
|
return parser
|
|
148
166
|
|
|
149
167
|
def take_action(self, parsed_args):
|
|
150
|
-
identity_client = self.app.client_manager.identity
|
|
168
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
151
169
|
result = 0
|
|
152
170
|
for i in parsed_args.endpoint:
|
|
153
171
|
try:
|
|
154
|
-
endpoint_id =
|
|
155
|
-
|
|
156
|
-
).id
|
|
157
|
-
identity_client.endpoints.delete(endpoint_id)
|
|
172
|
+
endpoint_id = identity_client.find_endpoint(i).id
|
|
173
|
+
identity_client.delete_endpoint(endpoint_id)
|
|
158
174
|
except Exception as e:
|
|
159
175
|
result += 1
|
|
160
176
|
LOG.error(
|
|
@@ -167,9 +183,10 @@ class DeleteEndpoint(command.Command):
|
|
|
167
183
|
|
|
168
184
|
if result > 0:
|
|
169
185
|
total = len(parsed_args.endpoint)
|
|
170
|
-
msg = _(
|
|
171
|
-
|
|
172
|
-
|
|
186
|
+
msg = _("%(result)s of %(total)s endpoints failed to delete.") % {
|
|
187
|
+
'result': result,
|
|
188
|
+
'total': total,
|
|
189
|
+
}
|
|
173
190
|
raise exceptions.CommandError(msg)
|
|
174
191
|
|
|
175
192
|
|
|
@@ -209,28 +226,24 @@ class ListEndpoint(command.Lister):
|
|
|
209
226
|
return parser
|
|
210
227
|
|
|
211
228
|
def take_action(self, parsed_args):
|
|
212
|
-
identity_client = self.app.client_manager.identity
|
|
229
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
213
230
|
|
|
214
231
|
endpoint = None
|
|
215
232
|
if parsed_args.endpoint:
|
|
216
|
-
endpoint =
|
|
217
|
-
identity_client.endpoints, parsed_args.endpoint
|
|
218
|
-
)
|
|
233
|
+
endpoint = identity_client.find_endpoint(parsed_args.endpoint)
|
|
219
234
|
project = None
|
|
220
235
|
if parsed_args.project:
|
|
221
|
-
project =
|
|
222
|
-
identity_client,
|
|
236
|
+
project = identity_client.find_project(
|
|
223
237
|
parsed_args.project,
|
|
224
238
|
parsed_args.project_domain,
|
|
225
239
|
)
|
|
226
240
|
|
|
227
241
|
if endpoint:
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
)
|
|
242
|
+
column_headers: tuple[str, ...] = ('ID', 'Name')
|
|
243
|
+
columns: tuple[str, ...] = ('id', 'name')
|
|
244
|
+
data = identity_client.endpoint_projects(endpoint=endpoint.id)
|
|
232
245
|
else:
|
|
233
|
-
|
|
246
|
+
column_headers = (
|
|
234
247
|
'ID',
|
|
235
248
|
'Region',
|
|
236
249
|
'Service Name',
|
|
@@ -239,37 +252,41 @@ class ListEndpoint(command.Lister):
|
|
|
239
252
|
'Interface',
|
|
240
253
|
'URL',
|
|
241
254
|
)
|
|
255
|
+
columns = (
|
|
256
|
+
'id',
|
|
257
|
+
'region_id',
|
|
258
|
+
'service_name',
|
|
259
|
+
'service_type',
|
|
260
|
+
'is_enabled',
|
|
261
|
+
'interface',
|
|
262
|
+
'url',
|
|
263
|
+
)
|
|
242
264
|
kwargs = {}
|
|
243
265
|
if parsed_args.service:
|
|
244
|
-
service = common.
|
|
266
|
+
service = common.find_service_sdk(
|
|
245
267
|
identity_client, parsed_args.service
|
|
246
268
|
)
|
|
247
|
-
kwargs['
|
|
269
|
+
kwargs['service_id'] = service.id
|
|
248
270
|
if parsed_args.interface:
|
|
249
271
|
kwargs['interface'] = parsed_args.interface
|
|
250
272
|
if parsed_args.region:
|
|
251
|
-
|
|
273
|
+
region = identity_client.get_region(parsed_args.region)
|
|
274
|
+
kwargs['region_id'] = region.id
|
|
252
275
|
|
|
253
276
|
if project:
|
|
254
|
-
data = (
|
|
255
|
-
identity_client.
|
|
256
|
-
project=project.id
|
|
257
|
-
)
|
|
277
|
+
data = list(
|
|
278
|
+
identity_client.project_endpoints(project=project.id)
|
|
258
279
|
)
|
|
259
280
|
else:
|
|
260
|
-
data = identity_client.endpoints
|
|
261
|
-
|
|
262
|
-
service_list = identity_client.services.list()
|
|
281
|
+
data = list(identity_client.endpoints(**kwargs))
|
|
263
282
|
|
|
264
283
|
for ep in data:
|
|
265
|
-
service =
|
|
266
|
-
|
|
267
|
-
)
|
|
268
|
-
ep.service_name = get_service_name(service)
|
|
284
|
+
service = identity_client.find_service(ep.service_id)
|
|
285
|
+
ep.service_name = getattr(service, 'name', '')
|
|
269
286
|
ep.service_type = service.type
|
|
270
287
|
|
|
271
288
|
return (
|
|
272
|
-
|
|
289
|
+
column_headers,
|
|
273
290
|
(
|
|
274
291
|
utils.get_item_properties(
|
|
275
292
|
s,
|
|
@@ -290,14 +307,14 @@ class RemoveProjectFromEndpoint(command.Command):
|
|
|
290
307
|
'endpoint',
|
|
291
308
|
metavar='<endpoint>',
|
|
292
309
|
help=_(
|
|
293
|
-
'Endpoint to dissociate from
|
|
310
|
+
'Endpoint to dissociate from specified project (name or ID)'
|
|
294
311
|
),
|
|
295
312
|
)
|
|
296
313
|
parser.add_argument(
|
|
297
314
|
'project',
|
|
298
315
|
metavar='<project>',
|
|
299
316
|
help=_(
|
|
300
|
-
'Project to dissociate from
|
|
317
|
+
'Project to dissociate from specified endpoint name or ID)'
|
|
301
318
|
),
|
|
302
319
|
)
|
|
303
320
|
common.add_project_domain_option_to_parser(parser)
|
|
@@ -364,28 +381,34 @@ class SetEndpoint(command.Command):
|
|
|
364
381
|
return parser
|
|
365
382
|
|
|
366
383
|
def take_action(self, parsed_args):
|
|
367
|
-
identity_client = self.app.client_manager.identity
|
|
368
|
-
endpoint =
|
|
369
|
-
|
|
370
|
-
|
|
384
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
385
|
+
endpoint = identity_client.find_endpoint(parsed_args.endpoint)
|
|
386
|
+
|
|
387
|
+
kwargs = {}
|
|
371
388
|
|
|
372
|
-
service_id = None
|
|
373
389
|
if parsed_args.service:
|
|
374
|
-
service = common.
|
|
375
|
-
|
|
376
|
-
|
|
390
|
+
service = common.find_service_sdk(
|
|
391
|
+
identity_client, parsed_args.service
|
|
392
|
+
)
|
|
393
|
+
kwargs['service_id'] = service.id
|
|
394
|
+
|
|
377
395
|
if parsed_args.enabled:
|
|
378
|
-
|
|
396
|
+
kwargs['is_enabled'] = True
|
|
379
397
|
if parsed_args.disabled:
|
|
380
|
-
|
|
398
|
+
kwargs['is_enabled'] = False
|
|
399
|
+
|
|
400
|
+
if parsed_args.url:
|
|
401
|
+
kwargs['url'] = parsed_args.url
|
|
402
|
+
|
|
403
|
+
if parsed_args.interface:
|
|
404
|
+
kwargs['interface'] = parsed_args.interface
|
|
381
405
|
|
|
382
|
-
|
|
406
|
+
if parsed_args.region:
|
|
407
|
+
kwargs['region_id'] = parsed_args.region
|
|
408
|
+
|
|
409
|
+
identity_client.update_endpoint(
|
|
383
410
|
endpoint.id,
|
|
384
|
-
|
|
385
|
-
url=parsed_args.url,
|
|
386
|
-
interface=parsed_args.interface,
|
|
387
|
-
region=parsed_args.region,
|
|
388
|
-
enabled=enabled,
|
|
411
|
+
**kwargs,
|
|
389
412
|
)
|
|
390
413
|
|
|
391
414
|
|
|
@@ -405,16 +428,9 @@ class ShowEndpoint(command.ShowOne):
|
|
|
405
428
|
return parser
|
|
406
429
|
|
|
407
430
|
def take_action(self, parsed_args):
|
|
408
|
-
identity_client = self.app.client_manager.identity
|
|
409
|
-
endpoint =
|
|
410
|
-
identity_client.endpoints, parsed_args.endpoint
|
|
411
|
-
)
|
|
431
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
432
|
+
endpoint = identity_client.find_endpoint(parsed_args.endpoint)
|
|
412
433
|
|
|
413
|
-
service = common.
|
|
434
|
+
service = common.find_service_sdk(identity_client, endpoint.service_id)
|
|
414
435
|
|
|
415
|
-
|
|
416
|
-
endpoint._info.pop('links')
|
|
417
|
-
info.update(endpoint._info)
|
|
418
|
-
info['service_name'] = get_service_name(service)
|
|
419
|
-
info['service_type'] = service.type
|
|
420
|
-
return zip(*sorted(info.items()))
|
|
436
|
+
return _format_endpoint(endpoint, service)
|