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
|
@@ -12,13 +12,43 @@
|
|
|
12
12
|
# License for the specific language governing permissions and limitations
|
|
13
13
|
# under the License.
|
|
14
14
|
|
|
15
|
+
# TODO(stephenfin): Remove the contents of this module in favour of the osc_lib
|
|
16
|
+
# version once our min version is bumped to 4.3.0
|
|
17
|
+
|
|
15
18
|
import json
|
|
16
|
-
import sys
|
|
17
19
|
from unittest import mock
|
|
18
20
|
|
|
19
21
|
from keystoneauth1 import fixture
|
|
22
|
+
from osc_lib.tests.fakes import (
|
|
23
|
+
FakeApp,
|
|
24
|
+
FakeClientManager as BaseFakeClientManager,
|
|
25
|
+
FakeLog,
|
|
26
|
+
FakeOptions,
|
|
27
|
+
FakeResource as BaseFakeResource,
|
|
28
|
+
FakeStdout,
|
|
29
|
+
)
|
|
20
30
|
import requests
|
|
21
31
|
|
|
32
|
+
__all__ = [
|
|
33
|
+
'AUTH_TOKEN',
|
|
34
|
+
'AUTH_URL',
|
|
35
|
+
'INTERFACE',
|
|
36
|
+
'PASSWORD',
|
|
37
|
+
'PROJECT_NAME',
|
|
38
|
+
'REGION_NAME',
|
|
39
|
+
'TEST_RESPONSE_DICT',
|
|
40
|
+
'TEST_RESPONSE_DICT_V3',
|
|
41
|
+
'TEST_VERSIONS',
|
|
42
|
+
'USERNAME',
|
|
43
|
+
'VERSION',
|
|
44
|
+
'FakeApp',
|
|
45
|
+
'FakeClientManager',
|
|
46
|
+
'FakeLog',
|
|
47
|
+
'FakeOptions',
|
|
48
|
+
'FakeResource',
|
|
49
|
+
'FakeResponse',
|
|
50
|
+
'FakeStdout',
|
|
51
|
+
]
|
|
22
52
|
|
|
23
53
|
AUTH_TOKEN = "foobar"
|
|
24
54
|
AUTH_URL = "http://0.0.0.0"
|
|
@@ -47,79 +77,15 @@ TEST_RESPONSE_DICT_V3.set_project_scope()
|
|
|
47
77
|
TEST_VERSIONS = fixture.DiscoveryList(href=AUTH_URL)
|
|
48
78
|
|
|
49
79
|
|
|
50
|
-
class
|
|
51
|
-
def __init__(self):
|
|
52
|
-
self.content = []
|
|
53
|
-
|
|
54
|
-
def write(self, text):
|
|
55
|
-
self.content.append(text)
|
|
56
|
-
|
|
57
|
-
def make_string(self):
|
|
58
|
-
result = ''
|
|
59
|
-
for line in self.content:
|
|
60
|
-
result = result + line
|
|
61
|
-
return result
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class FakeLog:
|
|
65
|
-
def __init__(self):
|
|
66
|
-
self.messages = {}
|
|
67
|
-
|
|
68
|
-
def debug(self, msg):
|
|
69
|
-
self.messages['debug'] = msg
|
|
70
|
-
|
|
71
|
-
def info(self, msg):
|
|
72
|
-
self.messages['info'] = msg
|
|
73
|
-
|
|
74
|
-
def warning(self, msg):
|
|
75
|
-
self.messages['warning'] = msg
|
|
76
|
-
|
|
77
|
-
def error(self, msg):
|
|
78
|
-
self.messages['error'] = msg
|
|
79
|
-
|
|
80
|
-
def critical(self, msg):
|
|
81
|
-
self.messages['critical'] = msg
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
class FakeApp:
|
|
85
|
-
def __init__(self, _stdout, _log):
|
|
86
|
-
self.stdout = _stdout
|
|
87
|
-
self.client_manager = None
|
|
88
|
-
self.api_version = {}
|
|
89
|
-
self.stdin = sys.stdin
|
|
90
|
-
self.stdout = _stdout or sys.stdout
|
|
91
|
-
self.stderr = sys.stderr
|
|
92
|
-
self.log = _log
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
class FakeOptions:
|
|
96
|
-
def __init__(self, **kwargs):
|
|
97
|
-
self.os_beta_command = False
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
class FakeClient:
|
|
101
|
-
def __init__(self, **kwargs):
|
|
102
|
-
self.endpoint = kwargs['endpoint']
|
|
103
|
-
self.token = kwargs['token']
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
class FakeClientManager:
|
|
80
|
+
class FakeClientManager(BaseFakeClientManager):
|
|
107
81
|
_api_version = {
|
|
108
82
|
'image': '2',
|
|
109
83
|
}
|
|
110
84
|
|
|
111
85
|
def __init__(self):
|
|
112
|
-
|
|
113
|
-
self.identity = None
|
|
114
|
-
self.image = None
|
|
115
|
-
self.object_store = None
|
|
116
|
-
self.volume = None
|
|
117
|
-
self.network = None
|
|
118
|
-
self.sdk_connection = mock.Mock()
|
|
86
|
+
super().__init__()
|
|
119
87
|
|
|
120
|
-
self.
|
|
121
|
-
self.auth_ref = None
|
|
122
|
-
self.auth_plugin_name = None
|
|
88
|
+
self.sdk_connection = mock.Mock()
|
|
123
89
|
|
|
124
90
|
self.network_endpoint_enabled = True
|
|
125
91
|
self.compute_endpoint_enabled = True
|
|
@@ -158,64 +124,7 @@ class FakeClientManager:
|
|
|
158
124
|
return self.volume_endpoint_enabled
|
|
159
125
|
|
|
160
126
|
|
|
161
|
-
class
|
|
162
|
-
def __init__(self, name, version):
|
|
163
|
-
self.name = name
|
|
164
|
-
self.__version__ = version
|
|
165
|
-
# Workaround for openstacksdk case
|
|
166
|
-
self.version = mock.Mock()
|
|
167
|
-
self.version.__version__ = version
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
class FakeResource:
|
|
171
|
-
def __init__(self, manager=None, info=None, loaded=False, methods=None):
|
|
172
|
-
"""Set attributes and methods for a resource.
|
|
173
|
-
|
|
174
|
-
:param manager:
|
|
175
|
-
The resource manager
|
|
176
|
-
:param Dictionary info:
|
|
177
|
-
A dictionary with all attributes
|
|
178
|
-
:param bool loaded:
|
|
179
|
-
True if the resource is loaded in memory
|
|
180
|
-
:param Dictionary methods:
|
|
181
|
-
A dictionary with all methods
|
|
182
|
-
"""
|
|
183
|
-
info = info or {}
|
|
184
|
-
methods = methods or {}
|
|
185
|
-
|
|
186
|
-
self.__name__ = type(self).__name__
|
|
187
|
-
self.manager = manager
|
|
188
|
-
self._info = info
|
|
189
|
-
self._add_details(info)
|
|
190
|
-
self._add_methods(methods)
|
|
191
|
-
self._loaded = loaded
|
|
192
|
-
|
|
193
|
-
def _add_details(self, info):
|
|
194
|
-
for k, v in info.items():
|
|
195
|
-
setattr(self, k, v)
|
|
196
|
-
|
|
197
|
-
def _add_methods(self, methods):
|
|
198
|
-
"""Fake methods with MagicMock objects.
|
|
199
|
-
|
|
200
|
-
For each <@key, @value> pairs in methods, add an callable MagicMock
|
|
201
|
-
object named @key as an attribute, and set the mock's return_value to
|
|
202
|
-
@value. When users access the attribute with (), @value will be
|
|
203
|
-
returned, which looks like a function call.
|
|
204
|
-
"""
|
|
205
|
-
for name, ret in methods.items():
|
|
206
|
-
method = mock.Mock(return_value=ret)
|
|
207
|
-
setattr(self, name, method)
|
|
208
|
-
|
|
209
|
-
def __repr__(self):
|
|
210
|
-
reprkeys = sorted(
|
|
211
|
-
k for k in self.__dict__.keys() if k[0] != '_' and k != 'manager'
|
|
212
|
-
)
|
|
213
|
-
info = ", ".join(f"{k}={getattr(self, k)}" for k in reprkeys)
|
|
214
|
-
return f"<{self.__class__.__name__} {info}>"
|
|
215
|
-
|
|
216
|
-
def keys(self):
|
|
217
|
-
return self._info.keys()
|
|
218
|
-
|
|
127
|
+
class FakeResource(BaseFakeResource):
|
|
219
128
|
def to_dict(self):
|
|
220
129
|
return self._info
|
|
221
130
|
|
|
@@ -247,11 +156,3 @@ class FakeResponse(requests.Response):
|
|
|
247
156
|
self._content = json.dumps(data)
|
|
248
157
|
if not isinstance(self._content, bytes):
|
|
249
158
|
self._content = self._content.encode()
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
class FakeModel(dict):
|
|
253
|
-
def __getattr__(self, key):
|
|
254
|
-
try:
|
|
255
|
-
return self[key]
|
|
256
|
-
except KeyError:
|
|
257
|
-
raise AttributeError(key)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
2
|
+
# not use this file except in compliance with the License. You may obtain
|
|
3
|
+
# a copy of the License at
|
|
4
|
+
#
|
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
#
|
|
7
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
8
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
9
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
10
|
+
# License for the specific language governing permissions and limitations
|
|
11
|
+
# under the License.
|
|
12
|
+
|
|
13
|
+
from unittest import mock
|
|
14
|
+
|
|
15
|
+
from openstack import exceptions as sdk_exc
|
|
16
|
+
from openstack.identity.v3 import user as _user
|
|
17
|
+
from openstack.test import fakes as sdk_fakes
|
|
18
|
+
from osc_lib import exceptions
|
|
19
|
+
|
|
20
|
+
from openstackclient.identity import common
|
|
21
|
+
from openstackclient.tests.unit import utils as test_utils
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TestFindSDKId(test_utils.TestCase):
|
|
25
|
+
def setUp(self):
|
|
26
|
+
super().setUp()
|
|
27
|
+
self.user = sdk_fakes.generate_fake_resource(_user.User)
|
|
28
|
+
self.identity_sdk_client = mock.Mock()
|
|
29
|
+
self.identity_sdk_client.find_user = mock.Mock()
|
|
30
|
+
|
|
31
|
+
def test_find_sdk_id_validate(self):
|
|
32
|
+
self.identity_sdk_client.find_user.side_effect = [self.user]
|
|
33
|
+
|
|
34
|
+
result = common._find_sdk_id(
|
|
35
|
+
self.identity_sdk_client.find_user,
|
|
36
|
+
name_or_id=self.user.id,
|
|
37
|
+
validate_actor_existence=True,
|
|
38
|
+
)
|
|
39
|
+
self.assertEqual(self.user.id, result)
|
|
40
|
+
|
|
41
|
+
def test_find_sdk_id_no_validate(self):
|
|
42
|
+
self.identity_sdk_client.find_user.side_effect = [self.user]
|
|
43
|
+
|
|
44
|
+
result = common._find_sdk_id(
|
|
45
|
+
self.identity_sdk_client.find_user,
|
|
46
|
+
name_or_id=self.user.id,
|
|
47
|
+
validate_actor_existence=False,
|
|
48
|
+
)
|
|
49
|
+
self.assertEqual(self.user.id, result)
|
|
50
|
+
|
|
51
|
+
def test_find_sdk_id_not_found_validate(self):
|
|
52
|
+
self.identity_sdk_client.find_user.side_effect = [
|
|
53
|
+
sdk_exc.ResourceNotFound,
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
self.assertRaises(
|
|
57
|
+
exceptions.CommandError,
|
|
58
|
+
common._find_sdk_id,
|
|
59
|
+
self.identity_sdk_client.find_user,
|
|
60
|
+
name_or_id=self.user.id,
|
|
61
|
+
validate_actor_existence=True,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
def test_find_sdk_id_not_found_no_validate(self):
|
|
65
|
+
self.identity_sdk_client.find_user.side_effect = [
|
|
66
|
+
sdk_exc.ResourceNotFound,
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
result = common._find_sdk_id(
|
|
70
|
+
self.identity_sdk_client.find_user,
|
|
71
|
+
name_or_id=self.user.id,
|
|
72
|
+
validate_actor_existence=False,
|
|
73
|
+
)
|
|
74
|
+
self.assertEqual(self.user.id, result)
|
|
75
|
+
|
|
76
|
+
def test_find_sdk_id_forbidden_validate(self):
|
|
77
|
+
self.identity_sdk_client.find_user.side_effect = [
|
|
78
|
+
sdk_exc.ForbiddenException,
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
result = common._find_sdk_id(
|
|
82
|
+
self.identity_sdk_client.find_user,
|
|
83
|
+
name_or_id=self.user.id,
|
|
84
|
+
validate_actor_existence=True,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
self.assertEqual(self.user.id, result)
|
|
88
|
+
|
|
89
|
+
def test_find_sdk_id_forbidden_no_validate(self):
|
|
90
|
+
self.identity_sdk_client.find_user.side_effect = [
|
|
91
|
+
sdk_exc.ForbiddenException,
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
result = common._find_sdk_id(
|
|
95
|
+
self.identity_sdk_client.find_user,
|
|
96
|
+
name_or_id=self.user.id,
|
|
97
|
+
validate_actor_existence=False,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
self.assertEqual(self.user.id, result)
|
|
@@ -195,7 +195,7 @@ class TestProjectCreate(TestProject):
|
|
|
195
195
|
self.fake_project.name,
|
|
196
196
|
]
|
|
197
197
|
verifylist = [
|
|
198
|
-
('
|
|
198
|
+
('properties', {'fee': 'fi', 'fo': 'fum'}),
|
|
199
199
|
('name', self.fake_project.name),
|
|
200
200
|
]
|
|
201
201
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -464,7 +464,7 @@ class TestProjectSet(TestProject):
|
|
|
464
464
|
('description', None),
|
|
465
465
|
('enable', False),
|
|
466
466
|
('disable', False),
|
|
467
|
-
('
|
|
467
|
+
('properties', None),
|
|
468
468
|
]
|
|
469
469
|
self.projects_mock.get.side_effect = exceptions.NotFound(None)
|
|
470
470
|
self.projects_mock.find.side_effect = exceptions.NotFound(None)
|
|
@@ -588,7 +588,7 @@ class TestProjectSet(TestProject):
|
|
|
588
588
|
self.fake_project.name,
|
|
589
589
|
]
|
|
590
590
|
verifylist = [
|
|
591
|
-
('
|
|
591
|
+
('properties', {'fee': 'fi', 'fo': 'fum'}),
|
|
592
592
|
('project', self.fake_project.name),
|
|
593
593
|
]
|
|
594
594
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -683,7 +683,7 @@ class TestProjectUnset(TestProject):
|
|
|
683
683
|
self.fake_proj.name,
|
|
684
684
|
]
|
|
685
685
|
verifylist = [
|
|
686
|
-
('
|
|
686
|
+
('properties', ['fee', 'fo']),
|
|
687
687
|
]
|
|
688
688
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
689
689
|
|
|
@@ -693,6 +693,14 @@ class TestIdentityv3(
|
|
|
693
693
|
): ...
|
|
694
694
|
|
|
695
695
|
|
|
696
|
+
class FakeModel(dict):
|
|
697
|
+
def __getattr__(self, key):
|
|
698
|
+
try:
|
|
699
|
+
return self[key]
|
|
700
|
+
except KeyError:
|
|
701
|
+
raise AttributeError(key)
|
|
702
|
+
|
|
703
|
+
|
|
696
704
|
# We don't use FakeClientMixin since we want a different fake legacy client
|
|
697
705
|
class TestFederatedIdentity(utils.TestCommand):
|
|
698
706
|
def setUp(self):
|
|
@@ -1075,7 +1083,7 @@ class FakeEndpoint:
|
|
|
1075
1083
|
# Overwrite default attributes if there are some attributes set
|
|
1076
1084
|
endpoint_filter_info.update(attrs)
|
|
1077
1085
|
|
|
1078
|
-
endpoint_filter =
|
|
1086
|
+
endpoint_filter = FakeModel(copy.deepcopy(endpoint_filter_info))
|
|
1079
1087
|
|
|
1080
1088
|
return endpoint_filter
|
|
1081
1089
|
|
|
@@ -1133,7 +1141,7 @@ class FakeEndpointGroup:
|
|
|
1133
1141
|
# Overwrite default attributes if there are some attributes set
|
|
1134
1142
|
endpointgroup_filter_info.update(attrs)
|
|
1135
1143
|
|
|
1136
|
-
endpointgroup_filter =
|
|
1144
|
+
endpointgroup_filter = FakeModel(
|
|
1137
1145
|
copy.deepcopy(endpointgroup_filter_info)
|
|
1138
1146
|
)
|
|
1139
1147
|
|
|
@@ -120,7 +120,7 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
|
|
|
120
120
|
verifylist = [
|
|
121
121
|
('name', self.application_credential.name),
|
|
122
122
|
('secret', 'moresecuresecret'),
|
|
123
|
-
('
|
|
123
|
+
('roles', [self.roles.id]),
|
|
124
124
|
('expiration', '2024-01-01T00:00:00'),
|
|
125
125
|
('description', 'credential for testing'),
|
|
126
126
|
]
|
|
@@ -302,7 +302,7 @@ class TestApplicationCredentialDelete(identity_fakes.TestIdentityv3):
|
|
|
302
302
|
|
|
303
303
|
calls = []
|
|
304
304
|
for a in arglist:
|
|
305
|
-
calls.append(call(user_id, a))
|
|
305
|
+
calls.append(call(user_id, a, ignore_missing=False))
|
|
306
306
|
|
|
307
307
|
self.identity_sdk_client.find_application_credential.assert_has_calls(
|
|
308
308
|
calls
|
|
@@ -457,7 +457,7 @@ class TestApplicationCredentialShow(identity_fakes.TestIdentityv3):
|
|
|
457
457
|
columns, data = self.cmd.take_action(parsed_args)
|
|
458
458
|
|
|
459
459
|
self.identity_sdk_client.find_application_credential.assert_called_with(
|
|
460
|
-
user_id, self.application_credential.id
|
|
460
|
+
user_id, self.application_credential.id, ignore_missing=False
|
|
461
461
|
)
|
|
462
462
|
|
|
463
463
|
self.assertEqual(self.columns, columns)
|
|
@@ -520,7 +520,7 @@ class TestDomainShow(identity_fakes.TestIdentityv3):
|
|
|
520
520
|
# data to be shown.
|
|
521
521
|
columns, data = self.cmd.take_action(parsed_args)
|
|
522
522
|
self.identity_sdk_client.find_domain.assert_called_with(
|
|
523
|
-
self.domain.id,
|
|
523
|
+
self.domain.id, ignore_missing=False
|
|
524
524
|
)
|
|
525
525
|
|
|
526
526
|
self.assertEqual(self.columns, columns)
|
|
@@ -678,7 +678,7 @@ class TestEndpointShow(identity_fakes.TestIdentityv3):
|
|
|
678
678
|
# data to be shown.
|
|
679
679
|
columns, data = self.cmd.take_action(parsed_args)
|
|
680
680
|
self.identity_sdk_client.find_endpoint.assert_called_with(
|
|
681
|
-
self.endpoint.id,
|
|
681
|
+
self.endpoint.id, ignore_missing=False
|
|
682
682
|
)
|
|
683
683
|
|
|
684
684
|
collist = (
|
|
@@ -253,7 +253,7 @@ class TestGroupCreate(identity_fakes.TestIdentityv3):
|
|
|
253
253
|
|
|
254
254
|
columns, data = self.cmd.take_action(parsed_args)
|
|
255
255
|
self.identity_sdk_client.find_group.assert_called_once_with(
|
|
256
|
-
self.group.name
|
|
256
|
+
self.group.name, ignore_missing=False
|
|
257
257
|
)
|
|
258
258
|
self.assertEqual(self.columns, columns)
|
|
259
259
|
datalist = (
|
|
@@ -286,7 +286,9 @@ class TestGroupCreate(identity_fakes.TestIdentityv3):
|
|
|
286
286
|
|
|
287
287
|
columns, data = self.cmd.take_action(parsed_args)
|
|
288
288
|
self.identity_sdk_client.find_group.assert_called_once_with(
|
|
289
|
-
self.group_with_options.name,
|
|
289
|
+
self.group_with_options.name,
|
|
290
|
+
domain_id=self.domain.id,
|
|
291
|
+
ignore_missing=False,
|
|
290
292
|
)
|
|
291
293
|
self.assertEqual(self.columns, columns)
|
|
292
294
|
datalist = (
|
|
@@ -127,7 +127,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|
|
127
127
|
]
|
|
128
128
|
verifylist = [
|
|
129
129
|
('identity_provider_id', identity_fakes.idp_id),
|
|
130
|
-
('
|
|
130
|
+
('remote_ids', identity_fakes.idp_remote_ids[:1]),
|
|
131
131
|
]
|
|
132
132
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
133
133
|
columns, data = self.cmd.take_action(parsed_args)
|
|
@@ -157,7 +157,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|
|
157
157
|
]
|
|
158
158
|
verifylist = [
|
|
159
159
|
('identity_provider_id', identity_fakes.idp_id),
|
|
160
|
-
('
|
|
160
|
+
('remote_ids', identity_fakes.idp_remote_ids),
|
|
161
161
|
]
|
|
162
162
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
163
163
|
columns, data = self.cmd.take_action(parsed_args)
|
|
@@ -561,7 +561,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
|
|
|
561
561
|
('description', new_description),
|
|
562
562
|
('enable', False),
|
|
563
563
|
('disable', False),
|
|
564
|
-
('
|
|
564
|
+
('remote_ids', None),
|
|
565
565
|
]
|
|
566
566
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
567
567
|
self.cmd.take_action(parsed_args)
|
|
@@ -597,7 +597,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
|
|
|
597
597
|
('description', None),
|
|
598
598
|
('enable', False),
|
|
599
599
|
('disable', True),
|
|
600
|
-
('
|
|
600
|
+
('remote_ids', identity_fakes.idp_remote_ids),
|
|
601
601
|
]
|
|
602
602
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
603
603
|
|
|
@@ -637,7 +637,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
|
|
|
637
637
|
('description', None),
|
|
638
638
|
('enable', True),
|
|
639
639
|
('disable', False),
|
|
640
|
-
('
|
|
640
|
+
('remote_ids', identity_fakes.idp_remote_ids),
|
|
641
641
|
]
|
|
642
642
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
643
643
|
|
|
@@ -675,7 +675,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
|
|
|
675
675
|
('description', None),
|
|
676
676
|
('enable', True),
|
|
677
677
|
('disable', False),
|
|
678
|
-
('
|
|
678
|
+
('remote_ids', [self.new_remote_id]),
|
|
679
679
|
]
|
|
680
680
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
681
681
|
|
|
@@ -756,7 +756,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
|
|
|
756
756
|
('identity_provider', identity_fakes.idp_id),
|
|
757
757
|
('enable', False),
|
|
758
758
|
('disable', False),
|
|
759
|
-
('
|
|
759
|
+
('remote_ids', None),
|
|
760
760
|
]
|
|
761
761
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
762
762
|
|
|
@@ -776,7 +776,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
|
|
|
776
776
|
('identity_provider', identity_fakes.idp_id),
|
|
777
777
|
('enable', False),
|
|
778
778
|
('disable', False),
|
|
779
|
-
('
|
|
779
|
+
('remote_ids', None),
|
|
780
780
|
('authorization_ttl', 60),
|
|
781
781
|
]
|
|
782
782
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -800,7 +800,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
|
|
|
800
800
|
('identity_provider', identity_fakes.idp_id),
|
|
801
801
|
('enable', False),
|
|
802
802
|
('disable', False),
|
|
803
|
-
('
|
|
803
|
+
('remote_ids', None),
|
|
804
804
|
('authorization_ttl', 0),
|
|
805
805
|
]
|
|
806
806
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -816,7 +816,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
|
|
|
816
816
|
('identity_provider', identity_fakes.idp_id),
|
|
817
817
|
('enable', False),
|
|
818
818
|
('disable', False),
|
|
819
|
-
('
|
|
819
|
+
('remote_ids', None),
|
|
820
820
|
('authorization_ttl', -1),
|
|
821
821
|
]
|
|
822
822
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -109,7 +109,7 @@ class TestRequestTokenAuthorize(TestOAuth1):
|
|
|
109
109
|
]
|
|
110
110
|
verifylist = [
|
|
111
111
|
('request_key', identity_fakes.request_token_id),
|
|
112
|
-
('
|
|
112
|
+
('roles', [identity_fakes.role_name]),
|
|
113
113
|
]
|
|
114
114
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
115
115
|
columns, data = self.cmd.take_action(parsed_args)
|
|
@@ -1142,7 +1142,7 @@ class TestProjectSet(TestProject):
|
|
|
1142
1142
|
verifylist = [
|
|
1143
1143
|
('enabled', None),
|
|
1144
1144
|
('project', self.project.name),
|
|
1145
|
-
('
|
|
1145
|
+
('remove_tags', ['tag1', 'tag2']),
|
|
1146
1146
|
]
|
|
1147
1147
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1148
1148
|
|
|
@@ -168,7 +168,7 @@ class TestRegisteredLimitDelete(TestRegisteredLimit):
|
|
|
168
168
|
|
|
169
169
|
arglist = [identity_fakes.registered_limit_id]
|
|
170
170
|
verifylist = [
|
|
171
|
-
('
|
|
171
|
+
('registered_limits', [identity_fakes.registered_limit_id])
|
|
172
172
|
]
|
|
173
173
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
174
174
|
|
|
@@ -184,7 +184,7 @@ class TestRegisteredLimitDelete(TestRegisteredLimit):
|
|
|
184
184
|
self.registered_limit_mock.delete.side_effect = return_value
|
|
185
185
|
|
|
186
186
|
arglist = ['fake-registered-limit-id']
|
|
187
|
-
verifylist = [('
|
|
187
|
+
verifylist = [('registered_limits', ['fake-registered-limit-id'])]
|
|
188
188
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
189
189
|
|
|
190
190
|
try:
|
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
|
|
16
16
|
from unittest import mock
|
|
17
17
|
|
|
18
|
-
from osc_lib import exceptions
|
|
19
|
-
|
|
20
18
|
from openstack import exceptions as sdk_exc
|
|
21
19
|
from openstack.identity.v3 import domain as _domain
|
|
22
20
|
from openstack.identity.v3 import group as _group
|
|
@@ -25,10 +23,10 @@ from openstack.identity.v3 import role as _role
|
|
|
25
23
|
from openstack.identity.v3 import system as _system
|
|
26
24
|
from openstack.identity.v3 import user as _user
|
|
27
25
|
from openstack.test import fakes as sdk_fakes
|
|
26
|
+
from osc_lib import exceptions
|
|
28
27
|
|
|
29
28
|
from openstackclient.identity.v3 import role
|
|
30
29
|
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
|
|
31
|
-
from openstackclient.tests.unit import utils as test_utils
|
|
32
30
|
|
|
33
31
|
|
|
34
32
|
class TestRoleInherited(identity_fakes.TestIdentityv3):
|
|
@@ -36,85 +34,6 @@ class TestRoleInherited(identity_fakes.TestIdentityv3):
|
|
|
36
34
|
return True
|
|
37
35
|
|
|
38
36
|
|
|
39
|
-
class TestFindSDKId(test_utils.TestCase):
|
|
40
|
-
def setUp(self):
|
|
41
|
-
super().setUp()
|
|
42
|
-
self.user = sdk_fakes.generate_fake_resource(_user.User)
|
|
43
|
-
self.identity_sdk_client = mock.Mock()
|
|
44
|
-
self.identity_sdk_client.find_user = mock.Mock()
|
|
45
|
-
|
|
46
|
-
def test_find_sdk_id_validate(self):
|
|
47
|
-
self.identity_sdk_client.find_user.side_effect = [self.user]
|
|
48
|
-
|
|
49
|
-
result = role._find_sdk_id(
|
|
50
|
-
self.identity_sdk_client.find_user,
|
|
51
|
-
name_or_id=self.user.id,
|
|
52
|
-
validate_actor_existence=True,
|
|
53
|
-
)
|
|
54
|
-
self.assertEqual(self.user.id, result)
|
|
55
|
-
|
|
56
|
-
def test_find_sdk_id_no_validate(self):
|
|
57
|
-
self.identity_sdk_client.find_user.side_effect = [self.user]
|
|
58
|
-
|
|
59
|
-
result = role._find_sdk_id(
|
|
60
|
-
self.identity_sdk_client.find_user,
|
|
61
|
-
name_or_id=self.user.id,
|
|
62
|
-
validate_actor_existence=False,
|
|
63
|
-
)
|
|
64
|
-
self.assertEqual(self.user.id, result)
|
|
65
|
-
|
|
66
|
-
def test_find_sdk_id_not_found_validate(self):
|
|
67
|
-
self.identity_sdk_client.find_user.side_effect = [
|
|
68
|
-
sdk_exc.ResourceNotFound,
|
|
69
|
-
]
|
|
70
|
-
|
|
71
|
-
self.assertRaises(
|
|
72
|
-
exceptions.CommandError,
|
|
73
|
-
role._find_sdk_id,
|
|
74
|
-
self.identity_sdk_client.find_user,
|
|
75
|
-
name_or_id=self.user.id,
|
|
76
|
-
validate_actor_existence=True,
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
def test_find_sdk_id_not_found_no_validate(self):
|
|
80
|
-
self.identity_sdk_client.find_user.side_effect = [
|
|
81
|
-
sdk_exc.ResourceNotFound,
|
|
82
|
-
]
|
|
83
|
-
|
|
84
|
-
result = role._find_sdk_id(
|
|
85
|
-
self.identity_sdk_client.find_user,
|
|
86
|
-
name_or_id=self.user.id,
|
|
87
|
-
validate_actor_existence=False,
|
|
88
|
-
)
|
|
89
|
-
self.assertEqual(self.user.id, result)
|
|
90
|
-
|
|
91
|
-
def test_find_sdk_id_forbidden_validate(self):
|
|
92
|
-
self.identity_sdk_client.find_user.side_effect = [
|
|
93
|
-
sdk_exc.ForbiddenException,
|
|
94
|
-
]
|
|
95
|
-
|
|
96
|
-
result = role._find_sdk_id(
|
|
97
|
-
self.identity_sdk_client.find_user,
|
|
98
|
-
name_or_id=self.user.id,
|
|
99
|
-
validate_actor_existence=True,
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
self.assertEqual(self.user.id, result)
|
|
103
|
-
|
|
104
|
-
def test_find_sdk_id_forbidden_no_validate(self):
|
|
105
|
-
self.identity_sdk_client.find_user.side_effect = [
|
|
106
|
-
sdk_exc.ForbiddenException,
|
|
107
|
-
]
|
|
108
|
-
|
|
109
|
-
result = role._find_sdk_id(
|
|
110
|
-
self.identity_sdk_client.find_user,
|
|
111
|
-
name_or_id=self.user.id,
|
|
112
|
-
validate_actor_existence=False,
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
self.assertEqual(self.user.id, result)
|
|
116
|
-
|
|
117
|
-
|
|
118
37
|
class TestRoleAdd(identity_fakes.TestIdentityv3):
|
|
119
38
|
def _is_inheritance_testcase(self):
|
|
120
39
|
return False
|