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
|
@@ -168,7 +168,7 @@ class DeleteEndpointGroup(command.Command):
|
|
|
168
168
|
if result > 0:
|
|
169
169
|
total = len(parsed_args.endpointgroup)
|
|
170
170
|
msg = _(
|
|
171
|
-
"%(result)s of %(total)s endpointgroups failed
|
|
171
|
+
"%(result)s of %(total)s endpointgroups failed to delete."
|
|
172
172
|
) % {'result': result, 'total': total}
|
|
173
173
|
raise exceptions.CommandError(msg)
|
|
174
174
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
|
-
from
|
|
20
|
+
from openstack import exceptions as sdk_exc
|
|
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,25 @@ from openstackclient.identity import common
|
|
|
29
29
|
LOG = logging.getLogger(__name__)
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
def _format_group(group):
|
|
33
|
+
columns = (
|
|
34
|
+
'description',
|
|
35
|
+
'domain_id',
|
|
36
|
+
'id',
|
|
37
|
+
'name',
|
|
38
|
+
)
|
|
39
|
+
column_headers = (
|
|
40
|
+
'description',
|
|
41
|
+
'domain_id',
|
|
42
|
+
'id',
|
|
43
|
+
'name',
|
|
44
|
+
)
|
|
45
|
+
return (
|
|
46
|
+
column_headers,
|
|
47
|
+
utils.get_item_properties(group, columns),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
32
51
|
class AddUserToGroup(command.Command):
|
|
33
52
|
_description = _("Add user to group")
|
|
34
53
|
|
|
@@ -53,19 +72,19 @@ class AddUserToGroup(command.Command):
|
|
|
53
72
|
return parser
|
|
54
73
|
|
|
55
74
|
def take_action(self, parsed_args):
|
|
56
|
-
identity_client = self.app.client_manager.identity
|
|
75
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
57
76
|
|
|
58
|
-
group_id = common.
|
|
77
|
+
group_id = common.find_group_id_sdk(
|
|
59
78
|
identity_client, parsed_args.group, parsed_args.group_domain
|
|
60
|
-
)
|
|
79
|
+
)
|
|
61
80
|
|
|
62
81
|
result = 0
|
|
63
82
|
for i in parsed_args.user:
|
|
64
83
|
try:
|
|
65
|
-
user_id = common.
|
|
84
|
+
user_id = common.find_user_id_sdk(
|
|
66
85
|
identity_client, i, parsed_args.user_domain
|
|
67
|
-
)
|
|
68
|
-
identity_client.
|
|
86
|
+
)
|
|
87
|
+
identity_client.add_user_to_group(user_id, group_id)
|
|
69
88
|
except Exception as e:
|
|
70
89
|
result += 1
|
|
71
90
|
msg = _("%(user)s not added to group %(group)s: %(e)s") % {
|
|
@@ -109,32 +128,41 @@ class CheckUserInGroup(command.Command):
|
|
|
109
128
|
return parser
|
|
110
129
|
|
|
111
130
|
def take_action(self, parsed_args):
|
|
112
|
-
identity_client = self.app.client_manager.identity
|
|
131
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
113
132
|
|
|
114
|
-
user_id = common.
|
|
115
|
-
identity_client,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
)
|
|
133
|
+
user_id = common.find_user_id_sdk(
|
|
134
|
+
identity_client,
|
|
135
|
+
parsed_args.user,
|
|
136
|
+
parsed_args.user_domain,
|
|
137
|
+
validate_actor_existence=False,
|
|
138
|
+
)
|
|
139
|
+
group_id = common.find_group_id_sdk(
|
|
140
|
+
identity_client,
|
|
141
|
+
parsed_args.group,
|
|
142
|
+
parsed_args.group_domain,
|
|
143
|
+
validate_actor_existence=False,
|
|
144
|
+
)
|
|
120
145
|
|
|
146
|
+
user_in_group = False
|
|
121
147
|
try:
|
|
122
|
-
identity_client.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
self.app.stderr.write(msg)
|
|
130
|
-
else:
|
|
131
|
-
raise e
|
|
132
|
-
else:
|
|
148
|
+
user_in_group = identity_client.check_user_in_group(
|
|
149
|
+
user_id, group_id
|
|
150
|
+
)
|
|
151
|
+
except sdk_exc.ForbiddenException:
|
|
152
|
+
# Assume False if forbidden
|
|
153
|
+
pass
|
|
154
|
+
if user_in_group:
|
|
133
155
|
msg = _("%(user)s in group %(group)s\n") % {
|
|
134
156
|
'user': parsed_args.user,
|
|
135
157
|
'group': parsed_args.group,
|
|
136
158
|
}
|
|
137
159
|
self.app.stdout.write(msg)
|
|
160
|
+
else:
|
|
161
|
+
msg = _("%(user)s not in group %(group)s\n") % {
|
|
162
|
+
'user': parsed_args.user,
|
|
163
|
+
'group': parsed_args.group,
|
|
164
|
+
}
|
|
165
|
+
self.app.stderr.write(msg)
|
|
138
166
|
|
|
139
167
|
|
|
140
168
|
class CreateGroup(command.ShowOne):
|
|
@@ -165,29 +193,33 @@ class CreateGroup(command.ShowOne):
|
|
|
165
193
|
return parser
|
|
166
194
|
|
|
167
195
|
def take_action(self, parsed_args):
|
|
168
|
-
identity_client = self.app.client_manager.identity
|
|
196
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
169
197
|
|
|
170
|
-
|
|
198
|
+
kwargs = {}
|
|
199
|
+
if parsed_args.name:
|
|
200
|
+
kwargs['name'] = parsed_args.name
|
|
201
|
+
if parsed_args.description:
|
|
202
|
+
kwargs['description'] = parsed_args.description
|
|
171
203
|
if parsed_args.domain:
|
|
172
|
-
|
|
204
|
+
kwargs['domain_id'] = common.find_domain_id_sdk(
|
|
205
|
+
identity_client, parsed_args.domain
|
|
206
|
+
)
|
|
173
207
|
|
|
174
208
|
try:
|
|
175
|
-
group = identity_client.
|
|
176
|
-
|
|
177
|
-
domain=domain,
|
|
178
|
-
description=parsed_args.description,
|
|
179
|
-
)
|
|
180
|
-
except ks_exc.Conflict:
|
|
209
|
+
group = identity_client.create_group(**kwargs)
|
|
210
|
+
except sdk_exc.ConflictException:
|
|
181
211
|
if parsed_args.or_show:
|
|
182
|
-
|
|
183
|
-
identity_client.
|
|
184
|
-
|
|
212
|
+
if parsed_args.domain:
|
|
213
|
+
group = identity_client.find_group(
|
|
214
|
+
parsed_args.name, domain_id=parsed_args.domain
|
|
215
|
+
)
|
|
216
|
+
else:
|
|
217
|
+
group = identity_client.find_group(parsed_args.name)
|
|
185
218
|
LOG.info(_('Returning existing group %s'), group.name)
|
|
186
219
|
else:
|
|
187
220
|
raise
|
|
188
221
|
|
|
189
|
-
group
|
|
190
|
-
return zip(*sorted(group._info.items()))
|
|
222
|
+
return _format_group(group)
|
|
191
223
|
|
|
192
224
|
|
|
193
225
|
class DeleteGroup(command.Command):
|
|
@@ -209,15 +241,15 @@ class DeleteGroup(command.Command):
|
|
|
209
241
|
return parser
|
|
210
242
|
|
|
211
243
|
def take_action(self, parsed_args):
|
|
212
|
-
identity_client = self.app.client_manager.identity
|
|
244
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
213
245
|
|
|
214
246
|
errors = 0
|
|
215
247
|
for group in parsed_args.groups:
|
|
216
248
|
try:
|
|
217
|
-
|
|
249
|
+
group_id = common.find_group_id_sdk(
|
|
218
250
|
identity_client, group, parsed_args.domain
|
|
219
251
|
)
|
|
220
|
-
identity_client.
|
|
252
|
+
identity_client.delete_group(group_id)
|
|
221
253
|
except Exception as e:
|
|
222
254
|
errors += 1
|
|
223
255
|
LOG.error(
|
|
@@ -230,7 +262,7 @@ class DeleteGroup(command.Command):
|
|
|
230
262
|
|
|
231
263
|
if errors > 0:
|
|
232
264
|
total = len(parsed_args.groups)
|
|
233
|
-
msg = _("%(errors)s of %(total)s groups failed
|
|
265
|
+
msg = _("%(errors)s of %(total)s groups failed to delete.") % {
|
|
234
266
|
'errors': errors,
|
|
235
267
|
'total': total,
|
|
236
268
|
}
|
|
@@ -262,30 +294,37 @@ class ListGroup(command.Lister):
|
|
|
262
294
|
return parser
|
|
263
295
|
|
|
264
296
|
def take_action(self, parsed_args):
|
|
265
|
-
identity_client = self.app.client_manager.identity
|
|
297
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
266
298
|
|
|
267
299
|
domain = None
|
|
268
300
|
if parsed_args.domain:
|
|
269
|
-
domain = common.
|
|
301
|
+
domain = common.find_domain_id_sdk(
|
|
302
|
+
identity_client, parsed_args.domain
|
|
303
|
+
)
|
|
270
304
|
|
|
305
|
+
data = []
|
|
271
306
|
if parsed_args.user:
|
|
272
|
-
user = common.
|
|
307
|
+
user = common.find_user_id_sdk(
|
|
273
308
|
identity_client,
|
|
274
309
|
parsed_args.user,
|
|
275
310
|
parsed_args.user_domain,
|
|
276
|
-
)
|
|
311
|
+
)
|
|
312
|
+
if domain:
|
|
313
|
+
# NOTE(0weng): The API doesn't actually support filtering additionally by domain_id,
|
|
314
|
+
# so this doesn't really do anything.
|
|
315
|
+
data = identity_client.user_groups(user, domain_id=domain)
|
|
316
|
+
else:
|
|
317
|
+
data = identity_client.user_groups(user)
|
|
277
318
|
else:
|
|
278
|
-
|
|
319
|
+
if domain:
|
|
320
|
+
data = identity_client.groups(domain_id=domain)
|
|
321
|
+
else:
|
|
322
|
+
data = identity_client.groups()
|
|
279
323
|
|
|
280
324
|
# List groups
|
|
325
|
+
columns: tuple[str, ...] = ('ID', 'Name')
|
|
281
326
|
if parsed_args.long:
|
|
282
|
-
columns
|
|
283
|
-
else:
|
|
284
|
-
columns = ('ID', 'Name')
|
|
285
|
-
data = identity_client.groups.list(
|
|
286
|
-
domain=domain,
|
|
287
|
-
user=user,
|
|
288
|
-
)
|
|
327
|
+
columns += ('Domain ID', 'Description')
|
|
289
328
|
|
|
290
329
|
return (
|
|
291
330
|
columns,
|
|
@@ -324,19 +363,19 @@ class RemoveUserFromGroup(command.Command):
|
|
|
324
363
|
return parser
|
|
325
364
|
|
|
326
365
|
def take_action(self, parsed_args):
|
|
327
|
-
identity_client = self.app.client_manager.identity
|
|
366
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
328
367
|
|
|
329
|
-
group_id = common.
|
|
368
|
+
group_id = common.find_group_id_sdk(
|
|
330
369
|
identity_client, parsed_args.group, parsed_args.group_domain
|
|
331
|
-
)
|
|
370
|
+
)
|
|
332
371
|
|
|
333
372
|
result = 0
|
|
334
373
|
for i in parsed_args.user:
|
|
335
374
|
try:
|
|
336
|
-
user_id = common.
|
|
375
|
+
user_id = common.find_user_id_sdk(
|
|
337
376
|
identity_client, i, parsed_args.user_domain
|
|
338
|
-
)
|
|
339
|
-
identity_client.
|
|
377
|
+
)
|
|
378
|
+
identity_client.remove_user_from_group(user_id, group_id)
|
|
340
379
|
except Exception as e:
|
|
341
380
|
result += 1
|
|
342
381
|
msg = _("%(user)s not removed from group %(group)s: %(e)s") % {
|
|
@@ -388,8 +427,8 @@ class SetGroup(command.Command):
|
|
|
388
427
|
return parser
|
|
389
428
|
|
|
390
429
|
def take_action(self, parsed_args):
|
|
391
|
-
identity_client = self.app.client_manager.identity
|
|
392
|
-
group = common.
|
|
430
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
431
|
+
group = common.find_group_id_sdk(
|
|
393
432
|
identity_client, parsed_args.group, parsed_args.domain
|
|
394
433
|
)
|
|
395
434
|
kwargs = {}
|
|
@@ -398,7 +437,7 @@ class SetGroup(command.Command):
|
|
|
398
437
|
if parsed_args.description:
|
|
399
438
|
kwargs['description'] = parsed_args.description
|
|
400
439
|
|
|
401
|
-
identity_client.
|
|
440
|
+
identity_client.update_group(group, **kwargs)
|
|
402
441
|
|
|
403
442
|
|
|
404
443
|
class ShowGroup(command.ShowOne):
|
|
@@ -419,13 +458,18 @@ class ShowGroup(command.ShowOne):
|
|
|
419
458
|
return parser
|
|
420
459
|
|
|
421
460
|
def take_action(self, parsed_args):
|
|
422
|
-
identity_client = self.app.client_manager.identity
|
|
461
|
+
identity_client = self.app.client_manager.sdk_connection.identity
|
|
423
462
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
463
|
+
if parsed_args.domain:
|
|
464
|
+
domain = common.find_domain_id_sdk(
|
|
465
|
+
identity_client, parsed_args.domain
|
|
466
|
+
)
|
|
467
|
+
group = identity_client.find_group(
|
|
468
|
+
parsed_args.group, domain_id=domain, ignore_missing=False
|
|
469
|
+
)
|
|
470
|
+
else:
|
|
471
|
+
group = identity_client.find_group(
|
|
472
|
+
parsed_args.group, ignore_missing=False
|
|
473
|
+
)
|
|
429
474
|
|
|
430
|
-
group
|
|
431
|
-
return zip(*sorted(group._info.items()))
|
|
475
|
+
return _format_group(group)
|
|
@@ -174,8 +174,7 @@ class DeleteIdentityProvider(command.Command):
|
|
|
174
174
|
if result > 0:
|
|
175
175
|
total = len(parsed_args.identity_provider)
|
|
176
176
|
msg = _(
|
|
177
|
-
"%(result)s of %(total)s identity providers failed"
|
|
178
|
-
" to delete."
|
|
177
|
+
"%(result)s of %(total)s identity providers failed to delete."
|
|
179
178
|
) % {'result': result, 'total': total}
|
|
180
179
|
raise exceptions.CommandError(msg)
|
|
181
180
|
|
|
@@ -77,8 +77,7 @@ class CreateLimit(command.ShowOne):
|
|
|
77
77
|
)
|
|
78
78
|
region = None
|
|
79
79
|
if parsed_args.region:
|
|
80
|
-
|
|
81
|
-
if 'None' not in val:
|
|
80
|
+
if 'None' not in parsed_args.region:
|
|
82
81
|
# NOTE (vishakha): Due to bug #1799153 and for any another
|
|
83
82
|
# related case where GET resource API does not support the
|
|
84
83
|
# filter by name, osc_lib.utils.find_resource() method cannot
|
|
@@ -149,11 +148,7 @@ class ListLimit(command.Lister):
|
|
|
149
148
|
)
|
|
150
149
|
region = None
|
|
151
150
|
if parsed_args.region:
|
|
152
|
-
|
|
153
|
-
identity_client.regions, parsed_args.region
|
|
154
|
-
)
|
|
155
|
-
val = getattr(parsed_args, 'region', None)
|
|
156
|
-
if 'None' not in val:
|
|
151
|
+
if 'None' not in parsed_args.region:
|
|
157
152
|
# NOTE (vishakha): Due to bug #1799153 and for any another
|
|
158
153
|
# related case where GET resource API does not support the
|
|
159
154
|
# filter by name, osc_lib.utils.find_resource() method cannot
|
|
@@ -281,13 +276,13 @@ class DeleteLimit(command.Command):
|
|
|
281
276
|
except Exception as e:
|
|
282
277
|
errors += 1
|
|
283
278
|
LOG.error(
|
|
284
|
-
_("Failed to delete limit with ID
|
|
279
|
+
_("Failed to delete limit with ID '%(id)s': %(e)s"),
|
|
285
280
|
{'id': limit_id, 'e': e},
|
|
286
281
|
)
|
|
287
282
|
|
|
288
283
|
if errors > 0:
|
|
289
284
|
total = len(parsed_args.limit_id)
|
|
290
|
-
msg = _("%(errors)s of %(total)s limits failed to
|
|
285
|
+
msg = _("%(errors)s of %(total)s limits failed to delete.") % {
|
|
291
286
|
'errors': errors,
|
|
292
287
|
'total': total,
|
|
293
288
|
}
|
|
@@ -161,9 +161,10 @@ class DeleteMapping(command.Command):
|
|
|
161
161
|
|
|
162
162
|
if result > 0:
|
|
163
163
|
total = len(parsed_args.mapping)
|
|
164
|
-
msg = _(
|
|
165
|
-
|
|
166
|
-
|
|
164
|
+
msg = _("%(result)s of %(total)s mappings failed to delete.") % {
|
|
165
|
+
'result': result,
|
|
166
|
+
'total': total,
|
|
167
|
+
}
|
|
167
168
|
raise exceptions.CommandError(msg)
|
|
168
169
|
|
|
169
170
|
|
|
@@ -92,9 +92,7 @@ class DeletePolicy(command.Command):
|
|
|
92
92
|
|
|
93
93
|
if result > 0:
|
|
94
94
|
total = len(parsed_args.policy)
|
|
95
|
-
msg = _(
|
|
96
|
-
"%(result)s of %(total)s policies failed " "to delete."
|
|
97
|
-
) % {
|
|
95
|
+
msg = _("%(result)s of %(total)s policies failed to delete.") % {
|
|
98
96
|
'result': result,
|
|
99
97
|
'total': total,
|
|
100
98
|
}
|
|
@@ -115,12 +113,11 @@ class ListPolicy(command.Lister):
|
|
|
115
113
|
return parser
|
|
116
114
|
|
|
117
115
|
def take_action(self, parsed_args):
|
|
116
|
+
columns: tuple[str, ...] = ('ID', 'Type')
|
|
117
|
+
column_headers: tuple[str, ...] = columns
|
|
118
118
|
if parsed_args.long:
|
|
119
|
-
columns
|
|
120
|
-
column_headers
|
|
121
|
-
else:
|
|
122
|
-
columns = ('ID', 'Type')
|
|
123
|
-
column_headers = columns
|
|
119
|
+
columns += ('Blob',)
|
|
120
|
+
column_headers += ('Rules',)
|
|
124
121
|
data = self.app.client_manager.identity.policies.list()
|
|
125
122
|
return (
|
|
126
123
|
column_headers,
|
|
@@ -190,9 +190,10 @@ class DeleteProject(command.Command):
|
|
|
190
190
|
|
|
191
191
|
if errors > 0:
|
|
192
192
|
total = len(parsed_args.projects)
|
|
193
|
-
msg = _(
|
|
194
|
-
|
|
195
|
-
|
|
193
|
+
msg = _("%(errors)s of %(total)s projects failed to delete.") % {
|
|
194
|
+
'errors': errors,
|
|
195
|
+
'total': total,
|
|
196
|
+
}
|
|
196
197
|
raise exceptions.CommandError(msg)
|
|
197
198
|
|
|
198
199
|
|
|
@@ -239,15 +240,28 @@ class ListProject(command.Lister):
|
|
|
239
240
|
'keys and directions.'
|
|
240
241
|
),
|
|
241
242
|
)
|
|
243
|
+
parser.add_argument(
|
|
244
|
+
'--enabled',
|
|
245
|
+
action='store_true',
|
|
246
|
+
dest='is_enabled',
|
|
247
|
+
default=None,
|
|
248
|
+
help=_('List only enabled projects'),
|
|
249
|
+
)
|
|
250
|
+
parser.add_argument(
|
|
251
|
+
'--disabled',
|
|
252
|
+
action='store_false',
|
|
253
|
+
dest='is_enabled',
|
|
254
|
+
default=None,
|
|
255
|
+
help=_('List only disabled projects'),
|
|
256
|
+
)
|
|
242
257
|
tag.add_tag_filtering_option_to_parser(parser, _('projects'))
|
|
243
258
|
return parser
|
|
244
259
|
|
|
245
260
|
def take_action(self, parsed_args):
|
|
246
261
|
identity_client = self.app.client_manager.identity
|
|
262
|
+
columns: tuple[str, ...] = ('ID', 'Name')
|
|
247
263
|
if parsed_args.long:
|
|
248
|
-
columns
|
|
249
|
-
else:
|
|
250
|
-
columns = ('ID', 'Name')
|
|
264
|
+
columns += ('Domain ID', 'Description', 'Enabled')
|
|
251
265
|
kwargs = {}
|
|
252
266
|
|
|
253
267
|
domain_id = None
|
|
@@ -277,6 +291,9 @@ class ListProject(command.Lister):
|
|
|
277
291
|
|
|
278
292
|
kwargs['user'] = user_id
|
|
279
293
|
|
|
294
|
+
if parsed_args.is_enabled is not None:
|
|
295
|
+
kwargs['is_enabled'] = parsed_args.is_enabled
|
|
296
|
+
|
|
280
297
|
tag.get_tag_filtering_args(parsed_args, kwargs)
|
|
281
298
|
|
|
282
299
|
if parsed_args.my_projects:
|
|
@@ -92,16 +92,13 @@ class DeleteRegion(command.Command):
|
|
|
92
92
|
except Exception as e:
|
|
93
93
|
result += 1
|
|
94
94
|
LOG.error(
|
|
95
|
-
_(
|
|
96
|
-
"Failed to delete region with "
|
|
97
|
-
"ID '%(region)s': %(e)s"
|
|
98
|
-
),
|
|
95
|
+
_("Failed to delete region with ID '%(region)s': %(e)s"),
|
|
99
96
|
{'region': i, 'e': e},
|
|
100
97
|
)
|
|
101
98
|
|
|
102
99
|
if result > 0:
|
|
103
100
|
total = len(parsed_args.region)
|
|
104
|
-
msg = _("%(result)s of %(total)s regions failed
|
|
101
|
+
msg = _("%(result)s of %(total)s regions failed to delete.") % {
|
|
105
102
|
'result': result,
|
|
106
103
|
'total': total,
|
|
107
104
|
}
|
|
@@ -68,8 +68,7 @@ class CreateRegisteredLimit(command.ShowOne):
|
|
|
68
68
|
)
|
|
69
69
|
region = None
|
|
70
70
|
if parsed_args.region:
|
|
71
|
-
|
|
72
|
-
if 'None' not in val:
|
|
71
|
+
if 'None' not in parsed_args.region:
|
|
73
72
|
# NOTE (vishakha): Due to bug #1799153 and for any another
|
|
74
73
|
# related case where GET resource API does not support the
|
|
75
74
|
# filter by name, osc_lib.utils.find_resource() method cannot
|
|
@@ -137,8 +136,7 @@ class DeleteRegisteredLimit(command.Command):
|
|
|
137
136
|
if errors > 0:
|
|
138
137
|
total = len(parsed_args.registered_limit_id)
|
|
139
138
|
msg = _(
|
|
140
|
-
"%(errors)s of %(total)s registered limits failed to "
|
|
141
|
-
"delete."
|
|
139
|
+
"%(errors)s of %(total)s registered limits failed to delete."
|
|
142
140
|
) % {'errors': errors, 'total': total}
|
|
143
141
|
raise exceptions.CommandError(msg)
|
|
144
142
|
|
|
@@ -176,8 +174,7 @@ class ListRegisteredLimit(command.Lister):
|
|
|
176
174
|
)
|
|
177
175
|
region = None
|
|
178
176
|
if parsed_args.region:
|
|
179
|
-
|
|
180
|
-
if 'None' not in val:
|
|
177
|
+
if 'None' not in parsed_args.region:
|
|
181
178
|
# NOTE (vishakha): Due to bug #1799153 and for any another
|
|
182
179
|
# related case where GET resource API does not support the
|
|
183
180
|
# filter by name, osc_lib.utils.find_resource() method cannot
|
|
@@ -281,8 +278,7 @@ class SetRegisteredLimit(command.ShowOne):
|
|
|
281
278
|
|
|
282
279
|
region = None
|
|
283
280
|
if parsed_args.region:
|
|
284
|
-
|
|
285
|
-
if 'None' not in val:
|
|
281
|
+
if 'None' not in parsed_args.region:
|
|
286
282
|
# NOTE (vishakha): Due to bug #1799153 and for any another
|
|
287
283
|
# related case where GET resource API does not support the
|
|
288
284
|
# filter by name, osc_lib.utils.find_resource() method cannot
|
|
@@ -402,7 +402,7 @@ class DeleteRole(command.Command):
|
|
|
402
402
|
|
|
403
403
|
if errors > 0:
|
|
404
404
|
total = len(parsed_args.roles)
|
|
405
|
-
msg = _("%(errors)s of %(total)s roles failed
|
|
405
|
+
msg = _("%(errors)s of %(total)s roles failed to delete.") % {
|
|
406
406
|
'errors': errors,
|
|
407
407
|
'total': total,
|
|
408
408
|
}
|
|
@@ -428,28 +428,27 @@ class ListRole(command.Lister):
|
|
|
428
428
|
domain = identity_client.find_domain(
|
|
429
429
|
name_or_id=parsed_args.domain,
|
|
430
430
|
)
|
|
431
|
-
columns = ('ID', 'Name', 'Domain')
|
|
432
431
|
data = identity_client.roles(domain_id=domain.id)
|
|
432
|
+
return (
|
|
433
|
+
('ID', 'Name', 'Domain'),
|
|
434
|
+
(
|
|
435
|
+
utils.get_item_properties(s, ('id', 'name'))
|
|
436
|
+
+ (domain.name,)
|
|
437
|
+
for s in data
|
|
438
|
+
),
|
|
439
|
+
)
|
|
440
|
+
|
|
433
441
|
else:
|
|
434
|
-
columns = ('ID', 'Name')
|
|
435
442
|
data = identity_client.roles()
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
utils.get_item_properties(
|
|
441
|
-
s,
|
|
442
|
-
columns,
|
|
443
|
-
formatters={'Domain': lambda _: domain.name},
|
|
444
|
-
)
|
|
445
|
-
for s in data
|
|
446
|
-
),
|
|
447
|
-
)
|
|
443
|
+
return (
|
|
444
|
+
('ID', 'Name'),
|
|
445
|
+
(utils.get_item_properties(s, ('id', 'name')) for s in data),
|
|
446
|
+
)
|
|
448
447
|
|
|
449
448
|
|
|
450
449
|
class RemoveRole(command.Command):
|
|
451
450
|
_description = _(
|
|
452
|
-
"Removes a role assignment from system/domain/project :
|
|
451
|
+
"Removes a role assignment from system/domain/project : user/group"
|
|
453
452
|
)
|
|
454
453
|
|
|
455
454
|
def get_parser(self, prog_name):
|
|
@@ -135,9 +135,10 @@ class DeleteService(command.Command):
|
|
|
135
135
|
|
|
136
136
|
if result > 0:
|
|
137
137
|
total = len(parsed_args.service)
|
|
138
|
-
msg = _(
|
|
139
|
-
|
|
140
|
-
|
|
138
|
+
msg = _("%(result)s of %(total)s services failed to delete.") % {
|
|
139
|
+
'result': result,
|
|
140
|
+
'total': total,
|
|
141
|
+
}
|
|
141
142
|
raise exceptions.CommandError(msg)
|
|
142
143
|
|
|
143
144
|
|
|
@@ -157,12 +158,11 @@ class ListService(command.Lister):
|
|
|
157
158
|
def take_action(self, parsed_args):
|
|
158
159
|
identity_client = self.app.client_manager.sdk_connection.identity
|
|
159
160
|
|
|
161
|
+
columns: tuple[str, ...] = ('id', 'name', 'type')
|
|
162
|
+
column_headers: tuple[str, ...] = ('ID', 'Name', 'Type')
|
|
160
163
|
if parsed_args.long:
|
|
161
|
-
columns
|
|
162
|
-
column_headers
|
|
163
|
-
else:
|
|
164
|
-
columns = ('id', 'name', 'type')
|
|
165
|
-
column_headers = ('ID', 'Name', 'Type')
|
|
164
|
+
columns += ('description', 'is_enabled')
|
|
165
|
+
column_headers += ('Description', 'Enabled')
|
|
166
166
|
|
|
167
167
|
data = identity_client.services()
|
|
168
168
|
|
|
@@ -77,8 +77,7 @@ class CreateServiceProvider(command.ShowOne):
|
|
|
77
77
|
metavar='<sp-url>',
|
|
78
78
|
required=True,
|
|
79
79
|
help=_(
|
|
80
|
-
'A service URL where SAML assertions are being sent '
|
|
81
|
-
'(required)'
|
|
80
|
+
'A service URL where SAML assertions are being sent (required)'
|
|
82
81
|
),
|
|
83
82
|
)
|
|
84
83
|
|
|
@@ -155,8 +154,7 @@ class DeleteServiceProvider(command.Command):
|
|
|
155
154
|
if result > 0:
|
|
156
155
|
total = len(parsed_args.service_provider)
|
|
157
156
|
msg = _(
|
|
158
|
-
"%(result)s of %(total)s service providers failed"
|
|
159
|
-
" to delete."
|
|
157
|
+
"%(result)s of %(total)s service providers failed to delete."
|
|
160
158
|
) % {'result': result, 'total': total}
|
|
161
159
|
raise exceptions.CommandError(msg)
|
|
162
160
|
|
|
@@ -204,8 +202,7 @@ class SetServiceProvider(command.ShowOne):
|
|
|
204
202
|
'--auth-url',
|
|
205
203
|
metavar='<auth-url>',
|
|
206
204
|
help=_(
|
|
207
|
-
'New Authentication URL of remote '
|
|
208
|
-
'federated service provider'
|
|
205
|
+
'New Authentication URL of remote federated service provider'
|
|
209
206
|
),
|
|
210
207
|
)
|
|
211
208
|
|
|
@@ -83,7 +83,7 @@ def add_tag_option_to_parser_for_create(parser, resource_name):
|
|
|
83
83
|
metavar='<tag>',
|
|
84
84
|
default=[],
|
|
85
85
|
help=_(
|
|
86
|
-
'Tag to be added to the %s
|
|
86
|
+
'Tag to be added to the %s (repeat option to set multiple tags)'
|
|
87
87
|
)
|
|
88
88
|
% resource_name,
|
|
89
89
|
)
|
|
@@ -97,7 +97,7 @@ def add_tag_option_to_parser_for_set(parser, resource_name):
|
|
|
97
97
|
metavar='<tag>',
|
|
98
98
|
default=[],
|
|
99
99
|
help=_(
|
|
100
|
-
'Tag to be added to the %s
|
|
100
|
+
'Tag to be added to the %s (repeat option to set multiple tags)'
|
|
101
101
|
)
|
|
102
102
|
% resource_name,
|
|
103
103
|
)
|