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
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
20
|
from openstack import exceptions as sdk_exc
|
|
21
|
-
from osc_lib.command import command
|
|
22
21
|
from osc_lib import exceptions
|
|
23
22
|
from osc_lib import utils
|
|
24
23
|
|
|
24
|
+
from openstackclient import command
|
|
25
25
|
from openstackclient.i18n import _
|
|
26
26
|
from openstackclient.identity import common
|
|
27
27
|
|
|
@@ -82,32 +82,12 @@ def _add_identity_and_resource_options_to_parser(parser):
|
|
|
82
82
|
common.add_inherited_option_to_parser(parser)
|
|
83
83
|
|
|
84
84
|
|
|
85
|
-
def _find_sdk_id(
|
|
86
|
-
find_command, name_or_id, validate_actor_existence=True, **kwargs
|
|
87
|
-
):
|
|
88
|
-
try:
|
|
89
|
-
resource = find_command(
|
|
90
|
-
name_or_id=name_or_id, ignore_missing=False, **kwargs
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
# Mimic the behavior of
|
|
94
|
-
# openstackclient.identity.common._find_identity_resource()
|
|
95
|
-
# and ignore if we don't have permission to find a resource.
|
|
96
|
-
except sdk_exc.ForbiddenException:
|
|
97
|
-
return name_or_id
|
|
98
|
-
except sdk_exc.ResourceNotFound as exc:
|
|
99
|
-
if not validate_actor_existence:
|
|
100
|
-
return name_or_id
|
|
101
|
-
raise exceptions.CommandError from exc
|
|
102
|
-
return resource.id
|
|
103
|
-
|
|
104
|
-
|
|
105
85
|
def _process_identity_and_resource_options(
|
|
106
86
|
parsed_args, identity_client, validate_actor_existence=True
|
|
107
87
|
):
|
|
108
88
|
def _find_user():
|
|
109
89
|
domain_id = (
|
|
110
|
-
_find_sdk_id(
|
|
90
|
+
common._find_sdk_id(
|
|
111
91
|
identity_client.find_domain,
|
|
112
92
|
name_or_id=parsed_args.user_domain,
|
|
113
93
|
validate_actor_existence=validate_actor_existence,
|
|
@@ -115,7 +95,7 @@ def _process_identity_and_resource_options(
|
|
|
115
95
|
if parsed_args.user_domain
|
|
116
96
|
else None
|
|
117
97
|
)
|
|
118
|
-
return _find_sdk_id(
|
|
98
|
+
return common._find_sdk_id(
|
|
119
99
|
identity_client.find_user,
|
|
120
100
|
name_or_id=parsed_args.user,
|
|
121
101
|
validate_actor_existence=validate_actor_existence,
|
|
@@ -124,7 +104,7 @@ def _process_identity_and_resource_options(
|
|
|
124
104
|
|
|
125
105
|
def _find_group():
|
|
126
106
|
domain_id = (
|
|
127
|
-
_find_sdk_id(
|
|
107
|
+
common._find_sdk_id(
|
|
128
108
|
identity_client.find_domain,
|
|
129
109
|
name_or_id=parsed_args.group_domain,
|
|
130
110
|
validate_actor_existence=validate_actor_existence,
|
|
@@ -132,7 +112,7 @@ def _process_identity_and_resource_options(
|
|
|
132
112
|
if parsed_args.group_domain
|
|
133
113
|
else None
|
|
134
114
|
)
|
|
135
|
-
return _find_sdk_id(
|
|
115
|
+
return common._find_sdk_id(
|
|
136
116
|
identity_client.find_group,
|
|
137
117
|
name_or_id=parsed_args.group,
|
|
138
118
|
validate_actor_existence=validate_actor_existence,
|
|
@@ -141,7 +121,7 @@ def _process_identity_and_resource_options(
|
|
|
141
121
|
|
|
142
122
|
def _find_project():
|
|
143
123
|
domain_id = (
|
|
144
|
-
_find_sdk_id(
|
|
124
|
+
common._find_sdk_id(
|
|
145
125
|
identity_client.find_domain,
|
|
146
126
|
name_or_id=parsed_args.project_domain,
|
|
147
127
|
validate_actor_existence=validate_actor_existence,
|
|
@@ -149,7 +129,7 @@ def _process_identity_and_resource_options(
|
|
|
149
129
|
if parsed_args.project_domain
|
|
150
130
|
else None
|
|
151
131
|
)
|
|
152
|
-
return _find_sdk_id(
|
|
132
|
+
return common._find_sdk_id(
|
|
153
133
|
identity_client.find_project,
|
|
154
134
|
name_or_id=parsed_args.project,
|
|
155
135
|
validate_actor_existence=validate_actor_existence,
|
|
@@ -162,7 +142,7 @@ def _process_identity_and_resource_options(
|
|
|
162
142
|
kwargs['system'] = parsed_args.system
|
|
163
143
|
elif parsed_args.user and parsed_args.domain:
|
|
164
144
|
kwargs['user'] = _find_user()
|
|
165
|
-
kwargs['domain'] = _find_sdk_id(
|
|
145
|
+
kwargs['domain'] = common._find_sdk_id(
|
|
166
146
|
identity_client.find_domain,
|
|
167
147
|
name_or_id=parsed_args.domain,
|
|
168
148
|
validate_actor_existence=validate_actor_existence,
|
|
@@ -175,7 +155,7 @@ def _process_identity_and_resource_options(
|
|
|
175
155
|
kwargs['system'] = parsed_args.system
|
|
176
156
|
elif parsed_args.group and parsed_args.domain:
|
|
177
157
|
kwargs['group'] = _find_group()
|
|
178
|
-
kwargs['domain'] = _find_sdk_id(
|
|
158
|
+
kwargs['domain'] = common._find_sdk_id(
|
|
179
159
|
identity_client.find_domain,
|
|
180
160
|
name_or_id=parsed_args.domain,
|
|
181
161
|
validate_actor_existence=validate_actor_existence,
|
|
@@ -228,10 +208,10 @@ class AddRole(command.Command):
|
|
|
228
208
|
|
|
229
209
|
domain_id = None
|
|
230
210
|
if parsed_args.role_domain:
|
|
231
|
-
domain_id = _find_sdk_id(
|
|
211
|
+
domain_id = common._find_sdk_id(
|
|
232
212
|
identity_client.find_domain, name_or_id=parsed_args.role_domain
|
|
233
213
|
)
|
|
234
|
-
role = _find_sdk_id(
|
|
214
|
+
role = common._find_sdk_id(
|
|
235
215
|
identity_client.find_role,
|
|
236
216
|
name_or_id=parsed_args.role,
|
|
237
217
|
domain_id=domain_id,
|
|
@@ -328,7 +308,7 @@ class CreateRole(command.ShowOne):
|
|
|
328
308
|
|
|
329
309
|
create_kwargs = {}
|
|
330
310
|
if parsed_args.domain:
|
|
331
|
-
create_kwargs['domain_id'] = _find_sdk_id(
|
|
311
|
+
create_kwargs['domain_id'] = common._find_sdk_id(
|
|
332
312
|
identity_client.find_domain, name_or_id=parsed_args.domain
|
|
333
313
|
)
|
|
334
314
|
|
|
@@ -381,13 +361,13 @@ class DeleteRole(command.Command):
|
|
|
381
361
|
|
|
382
362
|
domain_id = None
|
|
383
363
|
if parsed_args.domain:
|
|
384
|
-
domain_id = _find_sdk_id(
|
|
364
|
+
domain_id = common._find_sdk_id(
|
|
385
365
|
identity_client.find_domain, parsed_args.domain
|
|
386
366
|
)
|
|
387
367
|
errors = 0
|
|
388
368
|
for role in parsed_args.roles:
|
|
389
369
|
try:
|
|
390
|
-
role_id = _find_sdk_id(
|
|
370
|
+
role_id = common._find_sdk_id(
|
|
391
371
|
identity_client.find_role,
|
|
392
372
|
name_or_id=role,
|
|
393
373
|
domain_id=domain_id,
|
|
@@ -430,6 +410,7 @@ class ListRole(command.Lister):
|
|
|
430
410
|
if parsed_args.domain:
|
|
431
411
|
domain = identity_client.find_domain(
|
|
432
412
|
name_or_id=parsed_args.domain,
|
|
413
|
+
ignore_missing=False,
|
|
433
414
|
)
|
|
434
415
|
data = identity_client.roles(domain_id=domain.id)
|
|
435
416
|
return (
|
|
@@ -482,11 +463,11 @@ class RemoveRole(command.Command):
|
|
|
482
463
|
|
|
483
464
|
domain_id = None
|
|
484
465
|
if parsed_args.role_domain:
|
|
485
|
-
domain_id = _find_sdk_id(
|
|
466
|
+
domain_id = common._find_sdk_id(
|
|
486
467
|
identity_client.find_domain,
|
|
487
468
|
name_or_id=parsed_args.role_domain,
|
|
488
469
|
)
|
|
489
|
-
role = _find_sdk_id(
|
|
470
|
+
role = common._find_sdk_id(
|
|
490
471
|
identity_client.find_role,
|
|
491
472
|
name_or_id=parsed_args.role,
|
|
492
473
|
domain_id=domain_id,
|
|
@@ -582,7 +563,7 @@ class SetRole(command.Command):
|
|
|
582
563
|
|
|
583
564
|
domain_id = None
|
|
584
565
|
if parsed_args.domain:
|
|
585
|
-
domain_id = _find_sdk_id(
|
|
566
|
+
domain_id = common._find_sdk_id(
|
|
586
567
|
identity_client.find_domain,
|
|
587
568
|
name_or_id=parsed_args.domain,
|
|
588
569
|
)
|
|
@@ -591,7 +572,7 @@ class SetRole(command.Command):
|
|
|
591
572
|
if parsed_args.immutable is not None:
|
|
592
573
|
update_kwargs["options"] = {"immutable": parsed_args.immutable}
|
|
593
574
|
|
|
594
|
-
role = _find_sdk_id(
|
|
575
|
+
role = common._find_sdk_id(
|
|
595
576
|
identity_client.find_role,
|
|
596
577
|
name_or_id=parsed_args.role,
|
|
597
578
|
domain_id=domain_id,
|
|
@@ -623,7 +604,7 @@ class ShowRole(command.ShowOne):
|
|
|
623
604
|
|
|
624
605
|
domain_id = None
|
|
625
606
|
if parsed_args.domain:
|
|
626
|
-
domain_id = _find_sdk_id(
|
|
607
|
+
domain_id = common._find_sdk_id(
|
|
627
608
|
identity_client.find_domain,
|
|
628
609
|
name_or_id=parsed_args.domain,
|
|
629
610
|
)
|
|
@@ -13,9 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
"""Identity v3 Assignment action implementations"""
|
|
15
15
|
|
|
16
|
-
from
|
|
17
|
-
from osc_lib.command import command
|
|
18
|
-
|
|
16
|
+
from openstackclient import command
|
|
19
17
|
from openstackclient.i18n import _
|
|
20
18
|
from openstackclient.identity import common
|
|
21
19
|
|
|
@@ -51,15 +49,6 @@ def _format_role_assignment_(assignment, include_names):
|
|
|
51
49
|
)
|
|
52
50
|
|
|
53
51
|
|
|
54
|
-
def _find_sdk_id(find_command, name_or_id, **kwargs):
|
|
55
|
-
try:
|
|
56
|
-
return find_command(
|
|
57
|
-
name_or_id=name_or_id, ignore_missing=False, **kwargs
|
|
58
|
-
).id
|
|
59
|
-
except sdk_exceptions.ForbiddenException:
|
|
60
|
-
return name_or_id
|
|
61
|
-
|
|
62
|
-
|
|
63
52
|
class ListRoleAssignment(command.Lister):
|
|
64
53
|
_description = _("List role assignments")
|
|
65
54
|
|
|
@@ -135,12 +124,12 @@ class ListRoleAssignment(command.Lister):
|
|
|
135
124
|
role_id = None
|
|
136
125
|
role_domain_id = None
|
|
137
126
|
if parsed_args.role_domain:
|
|
138
|
-
role_domain_id = _find_sdk_id(
|
|
127
|
+
role_domain_id = common._find_sdk_id(
|
|
139
128
|
identity_client.find_domain,
|
|
140
129
|
name_or_id=parsed_args.role_domain,
|
|
141
130
|
)
|
|
142
131
|
if parsed_args.role:
|
|
143
|
-
role_id = _find_sdk_id(
|
|
132
|
+
role_id = common._find_sdk_id(
|
|
144
133
|
identity_client.find_role,
|
|
145
134
|
name_or_id=parsed_args.role,
|
|
146
135
|
domain_id=role_domain_id,
|
|
@@ -148,21 +137,21 @@ class ListRoleAssignment(command.Lister):
|
|
|
148
137
|
|
|
149
138
|
user_domain_id = None
|
|
150
139
|
if parsed_args.user_domain:
|
|
151
|
-
user_domain_id = _find_sdk_id(
|
|
140
|
+
user_domain_id = common._find_sdk_id(
|
|
152
141
|
identity_client.find_domain,
|
|
153
142
|
name_or_id=parsed_args.user_domain,
|
|
154
143
|
)
|
|
155
144
|
|
|
156
145
|
user_id = None
|
|
157
146
|
if parsed_args.user:
|
|
158
|
-
user_id = _find_sdk_id(
|
|
147
|
+
user_id = common._find_sdk_id(
|
|
159
148
|
identity_client.find_user,
|
|
160
149
|
name_or_id=parsed_args.user,
|
|
161
150
|
domain_id=user_domain_id,
|
|
162
151
|
)
|
|
163
152
|
elif parsed_args.authuser:
|
|
164
153
|
if auth_ref:
|
|
165
|
-
user_id = _find_sdk_id(
|
|
154
|
+
user_id = common._find_sdk_id(
|
|
166
155
|
identity_client.find_user,
|
|
167
156
|
name_or_id=auth_ref.user_id,
|
|
168
157
|
)
|
|
@@ -173,21 +162,21 @@ class ListRoleAssignment(command.Lister):
|
|
|
173
162
|
|
|
174
163
|
domain_id = None
|
|
175
164
|
if parsed_args.domain:
|
|
176
|
-
domain_id = _find_sdk_id(
|
|
165
|
+
domain_id = common._find_sdk_id(
|
|
177
166
|
identity_client.find_domain,
|
|
178
167
|
name_or_id=parsed_args.domain,
|
|
179
168
|
)
|
|
180
169
|
|
|
181
170
|
project_domain_id = None
|
|
182
171
|
if parsed_args.project_domain:
|
|
183
|
-
project_domain_id = _find_sdk_id(
|
|
172
|
+
project_domain_id = common._find_sdk_id(
|
|
184
173
|
identity_client.find_domain,
|
|
185
174
|
name_or_id=parsed_args.project_domain,
|
|
186
175
|
)
|
|
187
176
|
|
|
188
177
|
project_id = None
|
|
189
178
|
if parsed_args.project:
|
|
190
|
-
project_id = _find_sdk_id(
|
|
179
|
+
project_id = common._find_sdk_id(
|
|
191
180
|
identity_client.find_project,
|
|
192
181
|
name_or_id=common._get_token_resource(
|
|
193
182
|
identity_client, 'project', parsed_args.project
|
|
@@ -196,21 +185,21 @@ class ListRoleAssignment(command.Lister):
|
|
|
196
185
|
)
|
|
197
186
|
elif parsed_args.authproject:
|
|
198
187
|
if auth_ref:
|
|
199
|
-
project_id = _find_sdk_id(
|
|
188
|
+
project_id = common._find_sdk_id(
|
|
200
189
|
identity_client.find_project,
|
|
201
190
|
name_or_id=auth_ref.project_id,
|
|
202
191
|
)
|
|
203
192
|
|
|
204
193
|
group_domain_id = None
|
|
205
194
|
if parsed_args.group_domain:
|
|
206
|
-
group_domain_id = _find_sdk_id(
|
|
195
|
+
group_domain_id = common._find_sdk_id(
|
|
207
196
|
identity_client.find_domain,
|
|
208
197
|
name_or_id=parsed_args.group_domain,
|
|
209
198
|
)
|
|
210
199
|
|
|
211
200
|
group_id = None
|
|
212
201
|
if parsed_args.group:
|
|
213
|
-
group_id = _find_sdk_id(
|
|
202
|
+
group_id = common._find_sdk_id(
|
|
214
203
|
identity_client.find_group,
|
|
215
204
|
name_or_id=parsed_args.group,
|
|
216
205
|
domain_id=group_domain_id,
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
|
-
from osc_lib.command import command
|
|
21
20
|
from osc_lib import exceptions
|
|
22
21
|
from osc_lib import utils
|
|
23
22
|
|
|
23
|
+
from openstackclient import command
|
|
24
24
|
from openstackclient.i18n import _
|
|
25
25
|
from openstackclient.identity import common
|
|
26
26
|
|
|
@@ -114,6 +114,7 @@ def add_tag_option_to_parser_for_set(parser, resource_name):
|
|
|
114
114
|
parser.add_argument(
|
|
115
115
|
'--remove-tag',
|
|
116
116
|
action='append',
|
|
117
|
+
dest='remove_tags',
|
|
117
118
|
metavar='<tag>',
|
|
118
119
|
default=[],
|
|
119
120
|
help=_(
|
|
@@ -128,8 +129,8 @@ def update_tags_in_args(parsed_args, obj, args):
|
|
|
128
129
|
if parsed_args.clear_tags:
|
|
129
130
|
args['tags'] = []
|
|
130
131
|
obj.tags = []
|
|
131
|
-
if parsed_args.
|
|
132
|
-
args['tags'] = sorted(set(obj.tags) - set(parsed_args.
|
|
132
|
+
if parsed_args.remove_tags:
|
|
133
|
+
args['tags'] = sorted(set(obj.tags) - set(parsed_args.remove_tags))
|
|
133
134
|
return
|
|
134
135
|
if parsed_args.tags:
|
|
135
136
|
args['tags'] = sorted(set(obj.tags).union(set(parsed_args.tags)))
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
"""Identity v3 Token action implementations"""
|
|
17
17
|
|
|
18
|
-
from osc_lib.command import command
|
|
19
18
|
from osc_lib import exceptions
|
|
20
19
|
from osc_lib import utils
|
|
21
20
|
|
|
21
|
+
from openstackclient import command
|
|
22
22
|
from openstackclient.i18n import _
|
|
23
23
|
from openstackclient.identity import common
|
|
24
24
|
|
|
@@ -37,6 +37,7 @@ class AuthorizeRequestToken(command.ShowOne):
|
|
|
37
37
|
parser.add_argument(
|
|
38
38
|
'--role',
|
|
39
39
|
metavar='<role>',
|
|
40
|
+
dest='roles',
|
|
40
41
|
action='append',
|
|
41
42
|
default=[],
|
|
42
43
|
required=True,
|
|
@@ -52,7 +53,7 @@ class AuthorizeRequestToken(command.ShowOne):
|
|
|
52
53
|
|
|
53
54
|
# NOTE(stevemar): We want a list of role ids
|
|
54
55
|
roles = []
|
|
55
|
-
for role in parsed_args.
|
|
56
|
+
for role in parsed_args.roles:
|
|
56
57
|
role_id = utils.find_resource(
|
|
57
58
|
identity_client.roles,
|
|
58
59
|
role,
|
|
@@ -18,10 +18,10 @@ import itertools
|
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
20
|
from openstack import exceptions as sdk_exceptions
|
|
21
|
-
from osc_lib.command import command
|
|
22
21
|
from osc_lib import exceptions
|
|
23
22
|
from osc_lib import utils
|
|
24
23
|
|
|
24
|
+
from openstackclient import command
|
|
25
25
|
from openstackclient.i18n import _
|
|
26
26
|
from openstackclient.identity import common
|
|
27
27
|
|
|
@@ -179,7 +179,9 @@ class CreateTrust(command.ShowOne):
|
|
|
179
179
|
roles = []
|
|
180
180
|
for role in parsed_args.roles:
|
|
181
181
|
try:
|
|
182
|
-
role_id = identity_client.find_role(
|
|
182
|
+
role_id = identity_client.find_role(
|
|
183
|
+
role, ignore_missing=False
|
|
184
|
+
).id
|
|
183
185
|
except sdk_exceptions.ForbiddenException:
|
|
184
186
|
role_id = role
|
|
185
187
|
roles.append({"id": role_id})
|
|
@@ -17,9 +17,9 @@ The first step of federated auth is to fetch an unscoped token. From there,
|
|
|
17
17
|
the user can list domains and projects they are allowed to access, and request
|
|
18
18
|
a scoped token."""
|
|
19
19
|
|
|
20
|
-
from osc_lib.command import command
|
|
21
20
|
from osc_lib import utils
|
|
22
21
|
|
|
22
|
+
from openstackclient import command
|
|
23
23
|
from openstackclient.i18n import _
|
|
24
24
|
|
|
25
25
|
|
|
@@ -20,10 +20,10 @@ import logging
|
|
|
20
20
|
import typing as ty
|
|
21
21
|
|
|
22
22
|
from openstack import exceptions as sdk_exc
|
|
23
|
-
from osc_lib.command import command
|
|
24
23
|
from osc_lib import exceptions
|
|
25
24
|
from osc_lib import utils
|
|
26
25
|
|
|
26
|
+
from openstackclient import command
|
|
27
27
|
from openstackclient.i18n import _
|
|
28
28
|
from openstackclient.identity import common
|
|
29
29
|
|
|
@@ -82,9 +82,9 @@ def _get_options_for_user(identity_client, parsed_args):
|
|
|
82
82
|
options['multi_factor_auth_enabled'] = True
|
|
83
83
|
if parsed_args.disable_multi_factor_auth:
|
|
84
84
|
options['multi_factor_auth_enabled'] = False
|
|
85
|
-
if parsed_args.
|
|
85
|
+
if parsed_args.multi_factor_auth_rules:
|
|
86
86
|
auth_rules = [
|
|
87
|
-
rule.split(",") for rule in parsed_args.
|
|
87
|
+
rule.split(",") for rule in parsed_args.multi_factor_auth_rules
|
|
88
88
|
]
|
|
89
89
|
if auth_rules:
|
|
90
90
|
options['multi_factor_auth_rules'] = auth_rules
|
|
@@ -175,7 +175,8 @@ def _add_user_options(parser):
|
|
|
175
175
|
parser.add_argument(
|
|
176
176
|
'--multi-factor-auth-rule',
|
|
177
177
|
metavar='<rule>',
|
|
178
|
-
|
|
178
|
+
dest='multi_factor_auth_rules',
|
|
179
|
+
action='append',
|
|
179
180
|
default=[],
|
|
180
181
|
help=_(
|
|
181
182
|
'Set multi-factor auth rules. For example, to set a rule '
|
|
@@ -298,6 +299,9 @@ class CreateUser(command.ShowOne):
|
|
|
298
299
|
"when a user does not have a password."
|
|
299
300
|
)
|
|
300
301
|
)
|
|
302
|
+
else:
|
|
303
|
+
kwargs['password'] = password
|
|
304
|
+
|
|
301
305
|
options = _get_options_for_user(identity_client, parsed_args)
|
|
302
306
|
if options:
|
|
303
307
|
kwargs['options'] = options
|
|
@@ -306,7 +310,6 @@ class CreateUser(command.ShowOne):
|
|
|
306
310
|
user = identity_client.create_user(
|
|
307
311
|
is_enabled=is_enabled,
|
|
308
312
|
name=parsed_args.name,
|
|
309
|
-
password=password,
|
|
310
313
|
**kwargs,
|
|
311
314
|
)
|
|
312
315
|
except sdk_exc.ConflictException:
|
|
@@ -420,7 +423,8 @@ class ListUser(command.Lister):
|
|
|
420
423
|
dest='is_enabled',
|
|
421
424
|
default=None,
|
|
422
425
|
help=_(
|
|
423
|
-
'List only enabled users, does nothing with
|
|
426
|
+
'List only enabled users, does nothing with '
|
|
427
|
+
'--project and --group'
|
|
424
428
|
),
|
|
425
429
|
)
|
|
426
430
|
parser.add_argument(
|
|
@@ -429,7 +433,8 @@ class ListUser(command.Lister):
|
|
|
429
433
|
dest='is_enabled',
|
|
430
434
|
default=None,
|
|
431
435
|
help=_(
|
|
432
|
-
'List only disabled users, does nothing with
|
|
436
|
+
'List only disabled users, does nothing with '
|
|
437
|
+
'--project and --group'
|
|
433
438
|
),
|
|
434
439
|
)
|
|
435
440
|
return parser
|
|
@@ -441,6 +446,7 @@ class ListUser(command.Lister):
|
|
|
441
446
|
if parsed_args.domain:
|
|
442
447
|
domain = identity_client.find_domain(
|
|
443
448
|
name_or_id=parsed_args.domain,
|
|
449
|
+
ignore_missing=False,
|
|
444
450
|
).id
|
|
445
451
|
|
|
446
452
|
group = None
|
|
@@ -467,15 +473,13 @@ class ListUser(command.Lister):
|
|
|
467
473
|
ignore_missing=False,
|
|
468
474
|
).id
|
|
469
475
|
|
|
470
|
-
assignments = identity_client.role_assignments_filter(
|
|
471
|
-
project=project
|
|
472
|
-
)
|
|
473
|
-
|
|
474
476
|
# NOTE(stevemar): If a user has more than one role on a project
|
|
475
477
|
# then they will have two entries in the returned data. Since we
|
|
476
478
|
# are looking for any role, let's just track unique user IDs.
|
|
477
479
|
user_ids = set()
|
|
478
|
-
for assignment in
|
|
480
|
+
for assignment in identity_client.role_assignments(
|
|
481
|
+
scope_project_id=project
|
|
482
|
+
):
|
|
479
483
|
if assignment.user:
|
|
480
484
|
user_ids.add(assignment.user['id'])
|
|
481
485
|
|
|
@@ -689,7 +693,12 @@ class SetPasswordUser(command.Command):
|
|
|
689
693
|
def take_action(self, parsed_args):
|
|
690
694
|
identity_client = self.app.client_manager.sdk_connection.identity
|
|
691
695
|
conn = self.app.client_manager.sdk_connection
|
|
692
|
-
|
|
696
|
+
auth = conn.config.get_auth()
|
|
697
|
+
if auth is None:
|
|
698
|
+
# this will never happen
|
|
699
|
+
raise exceptions.CommandError('invalid authentication info')
|
|
700
|
+
|
|
701
|
+
user_id = auth.get_user_id(conn.identity)
|
|
693
702
|
|
|
694
703
|
# FIXME(gyee): there are two scenarios:
|
|
695
704
|
#
|
|
@@ -19,15 +19,16 @@ import argparse
|
|
|
19
19
|
import logging
|
|
20
20
|
import os
|
|
21
21
|
import sys
|
|
22
|
+
import typing as ty
|
|
22
23
|
|
|
23
24
|
from cliff import columns as cliff_columns
|
|
24
25
|
from osc_lib.api import utils as api_utils
|
|
25
26
|
from osc_lib.cli import format_columns
|
|
26
27
|
from osc_lib.cli import parseractions
|
|
27
|
-
from osc_lib.command import command
|
|
28
28
|
from osc_lib import exceptions
|
|
29
29
|
from osc_lib import utils
|
|
30
30
|
|
|
31
|
+
from openstackclient import command
|
|
31
32
|
from openstackclient.i18n import _
|
|
32
33
|
|
|
33
34
|
CONTAINER_CHOICES = ["ami", "ari", "aki", "bare", "docker", "ova", "ovf"]
|
|
@@ -67,10 +68,7 @@ def _get_columns(item):
|
|
|
67
68
|
)
|
|
68
69
|
|
|
69
70
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
class HumanReadableSizeColumn(cliff_columns.FormattableColumn):
|
|
71
|
+
class HumanReadableSizeColumn(cliff_columns.FormattableColumn[int]):
|
|
74
72
|
def human_readable(self):
|
|
75
73
|
"""Return a formatted visibility string
|
|
76
74
|
|
|
@@ -84,7 +82,7 @@ class HumanReadableSizeColumn(cliff_columns.FormattableColumn):
|
|
|
84
82
|
return ''
|
|
85
83
|
|
|
86
84
|
|
|
87
|
-
class VisibilityColumn(cliff_columns.FormattableColumn):
|
|
85
|
+
class VisibilityColumn(cliff_columns.FormattableColumn[bool]):
|
|
88
86
|
def human_readable(self):
|
|
89
87
|
"""Return a formatted visibility string
|
|
90
88
|
|
|
@@ -340,9 +338,12 @@ class CreateImage(command.ShowOne):
|
|
|
340
338
|
|
|
341
339
|
if image:
|
|
342
340
|
display_columns, columns = _get_columns(image)
|
|
343
|
-
_formatters['properties'] = format_columns.DictColumn
|
|
344
341
|
data = utils.get_item_properties(
|
|
345
|
-
image,
|
|
342
|
+
image,
|
|
343
|
+
columns,
|
|
344
|
+
formatters={
|
|
345
|
+
'properties': format_columns.DictColumn,
|
|
346
|
+
},
|
|
346
347
|
)
|
|
347
348
|
return (display_columns, data)
|
|
348
349
|
elif info:
|
|
@@ -493,19 +494,19 @@ class ListImage(command.Lister):
|
|
|
493
494
|
column_headers = columns
|
|
494
495
|
|
|
495
496
|
# List of image data received
|
|
496
|
-
|
|
497
|
+
images = list(image_client.images(**kwargs))
|
|
497
498
|
|
|
498
499
|
if parsed_args.property:
|
|
499
500
|
# NOTE(dtroyer): coerce to a list to subscript it in py3
|
|
500
501
|
attr, value = list(parsed_args.property.items())[0]
|
|
501
502
|
api_utils.simple_filter(
|
|
502
|
-
|
|
503
|
+
images,
|
|
503
504
|
attr=attr,
|
|
504
505
|
value=value,
|
|
505
506
|
property_field='properties',
|
|
506
507
|
)
|
|
507
508
|
|
|
508
|
-
data = utils.sort_items(
|
|
509
|
+
data = utils.sort_items(images, parsed_args.sort)
|
|
509
510
|
|
|
510
511
|
return (
|
|
511
512
|
column_headers,
|
|
@@ -839,11 +840,13 @@ class ShowImage(command.ShowOne):
|
|
|
839
840
|
parsed_args.image, ignore_missing=False
|
|
840
841
|
)
|
|
841
842
|
|
|
843
|
+
formatters: dict[
|
|
844
|
+
str, type[cliff_columns.FormattableColumn[ty.Any]]
|
|
845
|
+
] = {
|
|
846
|
+
'properties': format_columns.DictColumn,
|
|
847
|
+
}
|
|
842
848
|
if parsed_args.human_readable:
|
|
843
|
-
|
|
849
|
+
formatters['size'] = HumanReadableSizeColumn
|
|
844
850
|
display_columns, columns = _get_columns(image)
|
|
845
|
-
|
|
846
|
-
data = utils.get_item_properties(
|
|
847
|
-
image, columns, formatters=_formatters
|
|
848
|
-
)
|
|
851
|
+
data = utils.get_item_properties(image, columns, formatters=formatters)
|
|
849
852
|
return (display_columns, data)
|