python-openstackclient 8.2.0__py3-none-any.whl → 9.0.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 +5 -3
- openstackclient/common/project_cleanup.py +10 -8
- openstackclient/common/quota.py +54 -23
- 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 +78 -29
- 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 +33 -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 +4 -2
- 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 +40 -41
- 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 +86 -85
- openstackclient/identity/v3/mapping.py +1 -1
- openstackclient/identity/v3/policy.py +1 -1
- openstackclient/identity/v3/project.py +191 -115
- openstackclient/identity/v3/region.py +1 -1
- openstackclient/identity/v3/registered_limit.py +97 -109
- 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 +1 -11
- 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 +16 -12
- 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_limit.py +47 -0
- 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_objects.py +69 -0
- openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
- openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +46 -132
- 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 +79 -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 +370 -38
- 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_limit.py +197 -145
- openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
- openstackclient/tests/unit/identity/v3/test_project.py +832 -513
- openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
- openstackclient/tests/unit/identity/v3/test_registered_limit.py +356 -221
- 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 +116 -5
- 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_consistency_group.py +8 -2
- openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
- openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
- openstackclient/tests/unit/volume/v3/test_volume.py +38 -12
- 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 +9 -9
- openstackclient/volume/v2/consistency_group_snapshot.py +3 -3
- openstackclient/volume/v2/qos_specs.py +3 -3
- openstackclient/volume/v2/service.py +1 -1
- openstackclient/volume/v2/volume.py +14 -7
- openstackclient/volume/v2/volume_backend.py +1 -1
- openstackclient/volume/v2/volume_backup.py +7 -5
- openstackclient/volume/v2/volume_host.py +1 -2
- openstackclient/volume/v2/volume_snapshot.py +4 -4
- openstackclient/volume/v2/volume_transfer_request.py +3 -3
- openstackclient/volume/v2/volume_type.py +16 -11
- 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 +16 -9
- openstackclient/volume/v3/volume_attachment.py +6 -5
- openstackclient/volume/v3/volume_backup.py +20 -5
- 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 +4 -4
- openstackclient/volume/v3/volume_transfer_request.py +3 -3
- openstackclient/volume/v3/volume_type.py +20 -14
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/METADATA +15 -13
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/RECORD +231 -219
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/WHEEL +1 -1
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/entry_points.txt +15 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/AUTHORS +15 -0
- python_openstackclient-9.0.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-9.0.0.dist-info/licenses}/LICENSE +0 -0
- {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/top_level.txt +0 -0
|
@@ -13,31 +13,20 @@
|
|
|
13
13
|
# under the License.
|
|
14
14
|
|
|
15
15
|
from unittest import mock
|
|
16
|
-
from unittest.mock import call
|
|
17
16
|
|
|
17
|
+
from openstack import exceptions as sdk_exc
|
|
18
|
+
from openstack.identity.v3 import domain as _domain
|
|
19
|
+
from openstack.identity.v3 import project as _project
|
|
20
|
+
from openstack.identity.v3 import user as _user
|
|
21
|
+
from openstack.test import fakes as sdk_fakes
|
|
18
22
|
from osc_lib import exceptions
|
|
19
|
-
from osc_lib import utils
|
|
20
23
|
|
|
21
|
-
from openstackclient.identity import common
|
|
22
24
|
from openstackclient.identity.v3 import project
|
|
23
25
|
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
|
|
24
26
|
|
|
25
27
|
|
|
26
|
-
class
|
|
27
|
-
|
|
28
|
-
super().setUp()
|
|
29
|
-
|
|
30
|
-
# Get a shortcut to the DomainManager Mock
|
|
31
|
-
self.domains_mock = self.identity_client.domains
|
|
32
|
-
self.domains_mock.reset_mock()
|
|
33
|
-
|
|
34
|
-
# Get a shortcut to the ProjectManager Mock
|
|
35
|
-
self.projects_mock = self.identity_client.projects
|
|
36
|
-
self.projects_mock.reset_mock()
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class TestProjectCreate(TestProject):
|
|
40
|
-
domain = identity_fakes.FakeDomain.create_one_domain()
|
|
28
|
+
class TestProjectCreate(identity_fakes.TestIdentityv3):
|
|
29
|
+
domain = sdk_fakes.generate_fake_resource(_domain.Domain)
|
|
41
30
|
|
|
42
31
|
columns = (
|
|
43
32
|
'description',
|
|
@@ -46,39 +35,41 @@ class TestProjectCreate(TestProject):
|
|
|
46
35
|
'id',
|
|
47
36
|
'is_domain',
|
|
48
37
|
'name',
|
|
38
|
+
'options',
|
|
49
39
|
'parent_id',
|
|
50
40
|
'tags',
|
|
51
41
|
)
|
|
52
42
|
|
|
43
|
+
project_kwargs_no_options = {
|
|
44
|
+
'description': None,
|
|
45
|
+
'domain_id': None,
|
|
46
|
+
'enabled': True,
|
|
47
|
+
'is_domain': False,
|
|
48
|
+
'parent_id': None,
|
|
49
|
+
'tags': [],
|
|
50
|
+
}
|
|
51
|
+
|
|
53
52
|
def setUp(self):
|
|
54
53
|
super().setUp()
|
|
55
54
|
|
|
56
|
-
self.
|
|
57
|
-
|
|
58
|
-
)
|
|
59
|
-
self.domains_mock.get.return_value = self.domain
|
|
60
|
-
self.projects_mock.create.return_value = self.project
|
|
61
|
-
self.datalist = (
|
|
62
|
-
self.project.description,
|
|
63
|
-
self.project.domain_id,
|
|
64
|
-
True,
|
|
65
|
-
self.project.id,
|
|
66
|
-
False,
|
|
67
|
-
self.project.name,
|
|
68
|
-
self.project.parent_id,
|
|
69
|
-
self.project.tags,
|
|
70
|
-
)
|
|
55
|
+
self.identity_sdk_client.find_domain.return_value = self.domain
|
|
56
|
+
|
|
71
57
|
# Get the command object to test
|
|
72
58
|
self.cmd = project.CreateProject(self.app, None)
|
|
73
59
|
|
|
74
60
|
def test_project_create_no_options(self):
|
|
61
|
+
project = sdk_fakes.generate_fake_resource(
|
|
62
|
+
_project.Project, **self.project_kwargs_no_options
|
|
63
|
+
)
|
|
64
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
65
|
+
|
|
75
66
|
arglist = [
|
|
76
|
-
|
|
67
|
+
project.name,
|
|
77
68
|
]
|
|
78
69
|
verifylist = [
|
|
79
70
|
('parent', None),
|
|
80
71
|
('enabled', True),
|
|
81
|
-
('name',
|
|
72
|
+
('name', project.name),
|
|
82
73
|
('tags', []),
|
|
83
74
|
]
|
|
84
75
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -88,53 +79,43 @@ class TestProjectCreate(TestProject):
|
|
|
88
79
|
# data to be shown.
|
|
89
80
|
columns, data = self.cmd.take_action(parsed_args)
|
|
90
81
|
|
|
91
|
-
# Set expected values
|
|
92
82
|
kwargs = {
|
|
93
|
-
'name':
|
|
94
|
-
'
|
|
95
|
-
'description': None,
|
|
96
|
-
'enabled': True,
|
|
97
|
-
'parent': None,
|
|
98
|
-
'tags': [],
|
|
99
|
-
'options': {},
|
|
83
|
+
'name': project.name,
|
|
84
|
+
'is_enabled': True,
|
|
100
85
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
self.
|
|
86
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
87
|
+
|
|
88
|
+
self.assertEqual(self.columns, columns)
|
|
104
89
|
|
|
105
|
-
collist = (
|
|
106
|
-
'description',
|
|
107
|
-
'domain_id',
|
|
108
|
-
'enabled',
|
|
109
|
-
'id',
|
|
110
|
-
'is_domain',
|
|
111
|
-
'name',
|
|
112
|
-
'parent_id',
|
|
113
|
-
'tags',
|
|
114
|
-
)
|
|
115
|
-
self.assertEqual(collist, columns)
|
|
116
90
|
datalist = (
|
|
117
|
-
|
|
118
|
-
|
|
91
|
+
None,
|
|
92
|
+
None,
|
|
119
93
|
True,
|
|
120
|
-
|
|
94
|
+
project.id,
|
|
121
95
|
False,
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
96
|
+
project.name,
|
|
97
|
+
{},
|
|
98
|
+
None,
|
|
99
|
+
[],
|
|
125
100
|
)
|
|
126
101
|
self.assertEqual(datalist, data)
|
|
127
102
|
|
|
128
103
|
def test_project_create_description(self):
|
|
104
|
+
project = sdk_fakes.generate_fake_resource(
|
|
105
|
+
_project.Project,
|
|
106
|
+
**dict(self.project_kwargs_no_options, description='new desc'),
|
|
107
|
+
)
|
|
108
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
109
|
+
|
|
129
110
|
arglist = [
|
|
130
111
|
'--description',
|
|
131
112
|
'new desc',
|
|
132
|
-
|
|
113
|
+
project.name,
|
|
133
114
|
]
|
|
134
115
|
verifylist = [
|
|
135
116
|
('description', 'new desc'),
|
|
136
117
|
('enabled', True),
|
|
137
|
-
('name',
|
|
118
|
+
('name', project.name),
|
|
138
119
|
('parent', None),
|
|
139
120
|
('tags', []),
|
|
140
121
|
]
|
|
@@ -145,33 +126,43 @@ class TestProjectCreate(TestProject):
|
|
|
145
126
|
# data to be shown.
|
|
146
127
|
columns, data = self.cmd.take_action(parsed_args)
|
|
147
128
|
|
|
148
|
-
# Set expected values
|
|
149
129
|
kwargs = {
|
|
150
|
-
'name':
|
|
151
|
-
'domain': None,
|
|
130
|
+
'name': project.name,
|
|
152
131
|
'description': 'new desc',
|
|
153
|
-
'
|
|
154
|
-
'parent': None,
|
|
155
|
-
'tags': [],
|
|
156
|
-
'options': {},
|
|
132
|
+
'is_enabled': True,
|
|
157
133
|
}
|
|
158
|
-
|
|
159
|
-
# enabled=, **kwargs)
|
|
160
|
-
self.projects_mock.create.assert_called_with(**kwargs)
|
|
134
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
161
135
|
|
|
162
136
|
self.assertEqual(self.columns, columns)
|
|
163
|
-
|
|
137
|
+
datalist = (
|
|
138
|
+
'new desc',
|
|
139
|
+
None,
|
|
140
|
+
True,
|
|
141
|
+
project.id,
|
|
142
|
+
False,
|
|
143
|
+
project.name,
|
|
144
|
+
{},
|
|
145
|
+
None,
|
|
146
|
+
[],
|
|
147
|
+
)
|
|
148
|
+
self.assertEqual(datalist, data)
|
|
164
149
|
|
|
165
150
|
def test_project_create_domain(self):
|
|
151
|
+
project = sdk_fakes.generate_fake_resource(
|
|
152
|
+
_project.Project,
|
|
153
|
+
**dict(self.project_kwargs_no_options, domain_id=self.domain.id),
|
|
154
|
+
)
|
|
155
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
156
|
+
|
|
166
157
|
arglist = [
|
|
167
158
|
'--domain',
|
|
168
|
-
|
|
169
|
-
|
|
159
|
+
project.domain_id,
|
|
160
|
+
project.name,
|
|
170
161
|
]
|
|
171
162
|
verifylist = [
|
|
172
|
-
('domain',
|
|
163
|
+
('domain', project.domain_id),
|
|
173
164
|
('enabled', True),
|
|
174
|
-
('name',
|
|
165
|
+
('name', project.name),
|
|
175
166
|
('parent', None),
|
|
176
167
|
('tags', []),
|
|
177
168
|
]
|
|
@@ -184,63 +175,90 @@ class TestProjectCreate(TestProject):
|
|
|
184
175
|
|
|
185
176
|
# Set expected values
|
|
186
177
|
kwargs = {
|
|
187
|
-
'name':
|
|
188
|
-
'
|
|
189
|
-
'
|
|
190
|
-
'enabled': True,
|
|
191
|
-
'parent': None,
|
|
192
|
-
'tags': [],
|
|
193
|
-
'options': {},
|
|
178
|
+
'name': project.name,
|
|
179
|
+
'domain_id': project.domain_id,
|
|
180
|
+
'is_enabled': True,
|
|
194
181
|
}
|
|
195
|
-
|
|
196
|
-
# enabled=, **kwargs)
|
|
197
|
-
self.projects_mock.create.assert_called_with(**kwargs)
|
|
182
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
198
183
|
|
|
199
184
|
self.assertEqual(self.columns, columns)
|
|
200
|
-
|
|
185
|
+
datalist = (
|
|
186
|
+
None,
|
|
187
|
+
self.domain.id,
|
|
188
|
+
True,
|
|
189
|
+
project.id,
|
|
190
|
+
False,
|
|
191
|
+
project.name,
|
|
192
|
+
{},
|
|
193
|
+
None,
|
|
194
|
+
[],
|
|
195
|
+
)
|
|
196
|
+
self.assertEqual(datalist, data)
|
|
201
197
|
|
|
202
198
|
def test_project_create_domain_no_perms(self):
|
|
199
|
+
project = sdk_fakes.generate_fake_resource(
|
|
200
|
+
_project.Project,
|
|
201
|
+
**dict(self.project_kwargs_no_options, domain_id=self.domain.id),
|
|
202
|
+
)
|
|
203
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
204
|
+
|
|
203
205
|
arglist = [
|
|
204
206
|
'--domain',
|
|
205
|
-
|
|
206
|
-
|
|
207
|
+
project.domain_id,
|
|
208
|
+
project.name,
|
|
207
209
|
]
|
|
208
210
|
verifylist = [
|
|
209
|
-
('domain',
|
|
211
|
+
('domain', project.domain_id),
|
|
210
212
|
('enabled', True),
|
|
211
|
-
('name',
|
|
213
|
+
('name', project.name),
|
|
212
214
|
('parent', None),
|
|
213
215
|
('tags', []),
|
|
214
216
|
]
|
|
215
217
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
216
|
-
mocker = mock.Mock()
|
|
217
|
-
mocker.return_value = None
|
|
218
218
|
|
|
219
|
-
|
|
220
|
-
|
|
219
|
+
self.identity_sdk_client.find_domain.side_effect = (
|
|
220
|
+
sdk_exc.ForbiddenException
|
|
221
|
+
)
|
|
222
|
+
self.identity_sdk_client.find_domain.return_value = None
|
|
223
|
+
|
|
224
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
221
225
|
|
|
222
226
|
# Set expected values
|
|
223
227
|
kwargs = {
|
|
224
|
-
'name':
|
|
225
|
-
'
|
|
226
|
-
'
|
|
227
|
-
'enabled': True,
|
|
228
|
-
'parent': None,
|
|
229
|
-
'tags': [],
|
|
230
|
-
'options': {},
|
|
228
|
+
'name': project.name,
|
|
229
|
+
'domain_id': project.domain_id,
|
|
230
|
+
'is_enabled': True,
|
|
231
231
|
}
|
|
232
|
-
self.
|
|
232
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
233
|
+
|
|
233
234
|
self.assertEqual(self.columns, columns)
|
|
234
|
-
|
|
235
|
+
datalist = (
|
|
236
|
+
None,
|
|
237
|
+
self.domain.id,
|
|
238
|
+
True,
|
|
239
|
+
project.id,
|
|
240
|
+
False,
|
|
241
|
+
project.name,
|
|
242
|
+
{},
|
|
243
|
+
None,
|
|
244
|
+
[],
|
|
245
|
+
)
|
|
246
|
+
self.assertEqual(datalist, data)
|
|
235
247
|
|
|
236
248
|
def test_project_create_enable(self):
|
|
249
|
+
project = sdk_fakes.generate_fake_resource(
|
|
250
|
+
_project.Project,
|
|
251
|
+
**dict(self.project_kwargs_no_options, enabled=True),
|
|
252
|
+
)
|
|
253
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
254
|
+
|
|
237
255
|
arglist = [
|
|
238
256
|
'--enable',
|
|
239
|
-
|
|
257
|
+
project.name,
|
|
240
258
|
]
|
|
241
259
|
verifylist = [
|
|
242
260
|
('enabled', True),
|
|
243
|
-
('name',
|
|
261
|
+
('name', project.name),
|
|
244
262
|
('parent', None),
|
|
245
263
|
('tags', []),
|
|
246
264
|
]
|
|
@@ -253,29 +271,39 @@ class TestProjectCreate(TestProject):
|
|
|
253
271
|
|
|
254
272
|
# Set expected values
|
|
255
273
|
kwargs = {
|
|
256
|
-
'name':
|
|
257
|
-
'
|
|
258
|
-
'description': None,
|
|
259
|
-
'enabled': True,
|
|
260
|
-
'parent': None,
|
|
261
|
-
'tags': [],
|
|
262
|
-
'options': {},
|
|
274
|
+
'name': project.name,
|
|
275
|
+
'is_enabled': True,
|
|
263
276
|
}
|
|
264
|
-
|
|
265
|
-
# enabled=, **kwargs)
|
|
266
|
-
self.projects_mock.create.assert_called_with(**kwargs)
|
|
277
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
267
278
|
|
|
268
279
|
self.assertEqual(self.columns, columns)
|
|
269
|
-
|
|
280
|
+
datalist = (
|
|
281
|
+
None,
|
|
282
|
+
None,
|
|
283
|
+
True,
|
|
284
|
+
project.id,
|
|
285
|
+
False,
|
|
286
|
+
project.name,
|
|
287
|
+
{},
|
|
288
|
+
None,
|
|
289
|
+
[],
|
|
290
|
+
)
|
|
291
|
+
self.assertEqual(datalist, data)
|
|
270
292
|
|
|
271
293
|
def test_project_create_disable(self):
|
|
294
|
+
project = sdk_fakes.generate_fake_resource(
|
|
295
|
+
_project.Project,
|
|
296
|
+
**dict(self.project_kwargs_no_options, enabled=False),
|
|
297
|
+
)
|
|
298
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
299
|
+
|
|
272
300
|
arglist = [
|
|
273
301
|
'--disable',
|
|
274
|
-
|
|
302
|
+
project.name,
|
|
275
303
|
]
|
|
276
304
|
verifylist = [
|
|
277
305
|
('enabled', False),
|
|
278
|
-
('name',
|
|
306
|
+
('name', project.name),
|
|
279
307
|
('parent', None),
|
|
280
308
|
]
|
|
281
309
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -287,32 +315,42 @@ class TestProjectCreate(TestProject):
|
|
|
287
315
|
|
|
288
316
|
# Set expected values
|
|
289
317
|
kwargs = {
|
|
290
|
-
'name':
|
|
291
|
-
'
|
|
292
|
-
'description': None,
|
|
293
|
-
'enabled': False,
|
|
294
|
-
'parent': None,
|
|
295
|
-
'tags': [],
|
|
296
|
-
'options': {},
|
|
318
|
+
'name': project.name,
|
|
319
|
+
'is_enabled': False,
|
|
297
320
|
}
|
|
298
|
-
|
|
299
|
-
# description=, enabled=, **kwargs)
|
|
300
|
-
self.projects_mock.create.assert_called_with(**kwargs)
|
|
321
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
301
322
|
|
|
302
323
|
self.assertEqual(self.columns, columns)
|
|
303
|
-
|
|
324
|
+
datalist = (
|
|
325
|
+
None,
|
|
326
|
+
None,
|
|
327
|
+
False,
|
|
328
|
+
project.id,
|
|
329
|
+
False,
|
|
330
|
+
project.name,
|
|
331
|
+
{},
|
|
332
|
+
None,
|
|
333
|
+
[],
|
|
334
|
+
)
|
|
335
|
+
self.assertEqual(datalist, data)
|
|
304
336
|
|
|
305
337
|
def test_project_create_property(self):
|
|
338
|
+
project = sdk_fakes.generate_fake_resource(
|
|
339
|
+
_project.Project,
|
|
340
|
+
**dict(self.project_kwargs_no_options, fee='fi', fo='fum'),
|
|
341
|
+
)
|
|
342
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
343
|
+
|
|
306
344
|
arglist = [
|
|
307
345
|
'--property',
|
|
308
346
|
'fee=fi',
|
|
309
347
|
'--property',
|
|
310
348
|
'fo=fum',
|
|
311
|
-
|
|
349
|
+
project.name,
|
|
312
350
|
]
|
|
313
351
|
verifylist = [
|
|
352
|
+
('name', project.name),
|
|
314
353
|
('properties', {'fee': 'fi', 'fo': 'fum'}),
|
|
315
|
-
('name', self.project.name),
|
|
316
354
|
]
|
|
317
355
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
318
356
|
|
|
@@ -323,36 +361,62 @@ class TestProjectCreate(TestProject):
|
|
|
323
361
|
|
|
324
362
|
# Set expected values
|
|
325
363
|
kwargs = {
|
|
326
|
-
'name':
|
|
327
|
-
'
|
|
328
|
-
'description': None,
|
|
329
|
-
'enabled': True,
|
|
330
|
-
'parent': None,
|
|
364
|
+
'name': project.name,
|
|
365
|
+
'is_enabled': True,
|
|
331
366
|
'fee': 'fi',
|
|
332
367
|
'fo': 'fum',
|
|
333
|
-
'tags': [],
|
|
334
|
-
'options': {},
|
|
335
368
|
}
|
|
336
|
-
|
|
337
|
-
# enabled=, **kwargs)
|
|
338
|
-
self.projects_mock.create.assert_called_with(**kwargs)
|
|
369
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
339
370
|
|
|
340
|
-
self.assertEqual(
|
|
341
|
-
|
|
371
|
+
self.assertEqual(
|
|
372
|
+
(
|
|
373
|
+
'description',
|
|
374
|
+
'domain_id',
|
|
375
|
+
'enabled',
|
|
376
|
+
'fee',
|
|
377
|
+
'fo',
|
|
378
|
+
'id',
|
|
379
|
+
'is_domain',
|
|
380
|
+
'name',
|
|
381
|
+
'options',
|
|
382
|
+
'parent_id',
|
|
383
|
+
'tags',
|
|
384
|
+
),
|
|
385
|
+
columns,
|
|
386
|
+
)
|
|
387
|
+
datalist = (
|
|
388
|
+
None,
|
|
389
|
+
None,
|
|
390
|
+
True,
|
|
391
|
+
'fi',
|
|
392
|
+
'fum',
|
|
393
|
+
project.id,
|
|
394
|
+
False,
|
|
395
|
+
project.name,
|
|
396
|
+
{},
|
|
397
|
+
None,
|
|
398
|
+
[],
|
|
399
|
+
)
|
|
400
|
+
self.assertEqual(datalist, data)
|
|
342
401
|
|
|
343
402
|
def test_project_create_is_domain_false_property(self):
|
|
403
|
+
project = sdk_fakes.generate_fake_resource(
|
|
404
|
+
_project.Project,
|
|
405
|
+
**dict(self.project_kwargs_no_options, is_domain=False),
|
|
406
|
+
)
|
|
407
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
408
|
+
|
|
344
409
|
arglist = [
|
|
345
410
|
'--property',
|
|
346
411
|
'is_domain=false',
|
|
347
|
-
|
|
412
|
+
project.name,
|
|
348
413
|
]
|
|
349
414
|
verifylist = [
|
|
350
415
|
('parent', None),
|
|
351
416
|
('enabled', True),
|
|
352
|
-
('name',
|
|
417
|
+
('name', project.name),
|
|
353
418
|
('tags', []),
|
|
354
419
|
('properties', {'is_domain': 'false'}),
|
|
355
|
-
('name', self.project.name),
|
|
356
420
|
]
|
|
357
421
|
|
|
358
422
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -364,33 +428,44 @@ class TestProjectCreate(TestProject):
|
|
|
364
428
|
|
|
365
429
|
# Set expected values
|
|
366
430
|
kwargs = {
|
|
367
|
-
'name':
|
|
368
|
-
'
|
|
369
|
-
'description': None,
|
|
370
|
-
'enabled': True,
|
|
371
|
-
'parent': None,
|
|
431
|
+
'name': project.name,
|
|
432
|
+
'is_enabled': True,
|
|
372
433
|
'is_domain': False,
|
|
373
|
-
'tags': [],
|
|
374
|
-
'options': {},
|
|
375
434
|
}
|
|
376
|
-
self.
|
|
435
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
377
436
|
|
|
378
437
|
self.assertEqual(self.columns, columns)
|
|
379
|
-
|
|
438
|
+
datalist = (
|
|
439
|
+
None,
|
|
440
|
+
None,
|
|
441
|
+
True,
|
|
442
|
+
project.id,
|
|
443
|
+
False,
|
|
444
|
+
project.name,
|
|
445
|
+
{},
|
|
446
|
+
None,
|
|
447
|
+
[],
|
|
448
|
+
)
|
|
449
|
+
self.assertEqual(datalist, data)
|
|
380
450
|
|
|
381
451
|
def test_project_create_is_domain_true_property(self):
|
|
452
|
+
project = sdk_fakes.generate_fake_resource(
|
|
453
|
+
_project.Project,
|
|
454
|
+
**dict(self.project_kwargs_no_options, is_domain=True),
|
|
455
|
+
)
|
|
456
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
457
|
+
|
|
382
458
|
arglist = [
|
|
383
459
|
'--property',
|
|
384
460
|
'is_domain=true',
|
|
385
|
-
|
|
461
|
+
project.name,
|
|
386
462
|
]
|
|
387
463
|
verifylist = [
|
|
388
464
|
('parent', None),
|
|
389
465
|
('enabled', True),
|
|
390
|
-
('name',
|
|
466
|
+
('name', project.name),
|
|
391
467
|
('tags', []),
|
|
392
468
|
('properties', {'is_domain': 'true'}),
|
|
393
|
-
('name', self.project.name),
|
|
394
469
|
]
|
|
395
470
|
|
|
396
471
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -402,33 +477,44 @@ class TestProjectCreate(TestProject):
|
|
|
402
477
|
|
|
403
478
|
# Set expected values
|
|
404
479
|
kwargs = {
|
|
405
|
-
'name':
|
|
406
|
-
'
|
|
407
|
-
'description': None,
|
|
408
|
-
'enabled': True,
|
|
409
|
-
'parent': None,
|
|
480
|
+
'name': project.name,
|
|
481
|
+
'is_enabled': True,
|
|
410
482
|
'is_domain': True,
|
|
411
|
-
'tags': [],
|
|
412
|
-
'options': {},
|
|
413
483
|
}
|
|
414
|
-
self.
|
|
484
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
415
485
|
|
|
416
486
|
self.assertEqual(self.columns, columns)
|
|
417
|
-
|
|
487
|
+
datalist = (
|
|
488
|
+
None,
|
|
489
|
+
None,
|
|
490
|
+
True,
|
|
491
|
+
project.id,
|
|
492
|
+
True,
|
|
493
|
+
project.name,
|
|
494
|
+
{},
|
|
495
|
+
None,
|
|
496
|
+
[],
|
|
497
|
+
)
|
|
498
|
+
self.assertEqual(datalist, data)
|
|
418
499
|
|
|
419
500
|
def test_project_create_is_domain_none_property(self):
|
|
501
|
+
project = sdk_fakes.generate_fake_resource(
|
|
502
|
+
_project.Project,
|
|
503
|
+
**dict(self.project_kwargs_no_options, is_domain=None),
|
|
504
|
+
)
|
|
505
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
506
|
+
|
|
420
507
|
arglist = [
|
|
421
508
|
'--property',
|
|
422
509
|
'is_domain=none',
|
|
423
|
-
|
|
510
|
+
project.name,
|
|
424
511
|
]
|
|
425
512
|
verifylist = [
|
|
426
513
|
('parent', None),
|
|
427
514
|
('enabled', True),
|
|
428
|
-
('name',
|
|
515
|
+
('name', project.name),
|
|
429
516
|
('tags', []),
|
|
430
517
|
('properties', {'is_domain': 'none'}),
|
|
431
|
-
('name', self.project.name),
|
|
432
518
|
]
|
|
433
519
|
|
|
434
520
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -440,40 +526,51 @@ class TestProjectCreate(TestProject):
|
|
|
440
526
|
|
|
441
527
|
# Set expected values
|
|
442
528
|
kwargs = {
|
|
443
|
-
'name':
|
|
444
|
-
'
|
|
445
|
-
'description': None,
|
|
446
|
-
'enabled': True,
|
|
447
|
-
'parent': None,
|
|
529
|
+
'name': project.name,
|
|
530
|
+
'is_enabled': True,
|
|
448
531
|
'is_domain': None,
|
|
449
|
-
'tags': [],
|
|
450
|
-
'options': {},
|
|
451
532
|
}
|
|
452
|
-
self.
|
|
533
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
453
534
|
|
|
454
535
|
self.assertEqual(self.columns, columns)
|
|
455
|
-
|
|
536
|
+
datalist = (
|
|
537
|
+
None,
|
|
538
|
+
None,
|
|
539
|
+
True,
|
|
540
|
+
project.id,
|
|
541
|
+
None,
|
|
542
|
+
project.name,
|
|
543
|
+
{},
|
|
544
|
+
None,
|
|
545
|
+
[],
|
|
546
|
+
)
|
|
547
|
+
self.assertEqual(datalist, data)
|
|
456
548
|
|
|
457
549
|
def test_project_create_parent(self):
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
550
|
+
parent = sdk_fakes.generate_fake_resource(_project.Project)
|
|
551
|
+
project = sdk_fakes.generate_fake_resource(
|
|
552
|
+
_project.Project,
|
|
553
|
+
**dict(
|
|
554
|
+
self.project_kwargs_no_options,
|
|
555
|
+
domain_id=self.domain.id,
|
|
556
|
+
parent_id=parent.id,
|
|
557
|
+
),
|
|
461
558
|
)
|
|
462
|
-
self.
|
|
463
|
-
self.
|
|
559
|
+
self.identity_sdk_client.find_project.return_value = parent
|
|
560
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
464
561
|
|
|
465
562
|
arglist = [
|
|
466
563
|
'--domain',
|
|
467
|
-
|
|
564
|
+
project.domain_id,
|
|
468
565
|
'--parent',
|
|
469
|
-
|
|
470
|
-
|
|
566
|
+
parent.name,
|
|
567
|
+
project.name,
|
|
471
568
|
]
|
|
472
569
|
verifylist = [
|
|
473
|
-
('domain',
|
|
474
|
-
('parent',
|
|
570
|
+
('domain', project.domain_id),
|
|
571
|
+
('parent', parent.name),
|
|
475
572
|
('enabled', True),
|
|
476
|
-
('name',
|
|
573
|
+
('name', project.name),
|
|
477
574
|
('tags', []),
|
|
478
575
|
]
|
|
479
576
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -481,61 +578,52 @@ class TestProjectCreate(TestProject):
|
|
|
481
578
|
columns, data = self.cmd.take_action(parsed_args)
|
|
482
579
|
|
|
483
580
|
kwargs = {
|
|
484
|
-
'name':
|
|
485
|
-
'
|
|
486
|
-
'
|
|
487
|
-
'
|
|
488
|
-
'enabled': True,
|
|
489
|
-
'tags': [],
|
|
490
|
-
'options': {},
|
|
581
|
+
'name': project.name,
|
|
582
|
+
'domain_id': project.domain_id,
|
|
583
|
+
'parent_id': parent.id,
|
|
584
|
+
'is_enabled': True,
|
|
491
585
|
}
|
|
586
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
492
587
|
|
|
493
|
-
self.
|
|
494
|
-
|
|
495
|
-
collist = (
|
|
496
|
-
'description',
|
|
497
|
-
'domain_id',
|
|
498
|
-
'enabled',
|
|
499
|
-
'id',
|
|
500
|
-
'is_domain',
|
|
501
|
-
'name',
|
|
502
|
-
'parent_id',
|
|
503
|
-
'tags',
|
|
504
|
-
)
|
|
505
|
-
self.assertEqual(columns, collist)
|
|
588
|
+
self.assertEqual(self.columns, columns)
|
|
506
589
|
datalist = (
|
|
507
|
-
|
|
508
|
-
self.
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
590
|
+
None,
|
|
591
|
+
self.domain.id,
|
|
592
|
+
True,
|
|
593
|
+
project.id,
|
|
594
|
+
False,
|
|
595
|
+
project.name,
|
|
596
|
+
{},
|
|
597
|
+
parent.id,
|
|
598
|
+
[],
|
|
515
599
|
)
|
|
516
600
|
self.assertEqual(data, datalist)
|
|
517
601
|
|
|
518
602
|
def test_project_create_invalid_parent(self):
|
|
519
|
-
self.
|
|
520
|
-
|
|
521
|
-
'Invalid parent'
|
|
603
|
+
self.identity_sdk_client.find_project.side_effect = (
|
|
604
|
+
sdk_exc.ResourceNotFound
|
|
522
605
|
)
|
|
523
|
-
|
|
524
|
-
|
|
606
|
+
project = sdk_fakes.generate_fake_resource(
|
|
607
|
+
_project.Project,
|
|
608
|
+
**dict(
|
|
609
|
+
self.project_kwargs_no_options,
|
|
610
|
+
domain_id=self.domain.id,
|
|
611
|
+
parent_id='invalid',
|
|
612
|
+
),
|
|
525
613
|
)
|
|
526
614
|
|
|
527
615
|
arglist = [
|
|
528
616
|
'--domain',
|
|
529
|
-
|
|
617
|
+
project.domain_id,
|
|
530
618
|
'--parent',
|
|
531
619
|
'invalid',
|
|
532
|
-
|
|
620
|
+
project.name,
|
|
533
621
|
]
|
|
534
622
|
verifylist = [
|
|
535
|
-
('domain',
|
|
623
|
+
('domain', project.domain_id),
|
|
536
624
|
('parent', 'invalid'),
|
|
537
625
|
('enabled', True),
|
|
538
|
-
('name',
|
|
626
|
+
('name', project.name),
|
|
539
627
|
]
|
|
540
628
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
541
629
|
|
|
@@ -546,17 +634,27 @@ class TestProjectCreate(TestProject):
|
|
|
546
634
|
)
|
|
547
635
|
|
|
548
636
|
def test_project_create_with_tags(self):
|
|
637
|
+
project = sdk_fakes.generate_fake_resource(
|
|
638
|
+
_project.Project,
|
|
639
|
+
**dict(
|
|
640
|
+
self.project_kwargs_no_options,
|
|
641
|
+
domain_id=self.domain.id,
|
|
642
|
+
tags=['foo'],
|
|
643
|
+
),
|
|
644
|
+
)
|
|
645
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
646
|
+
|
|
549
647
|
arglist = [
|
|
550
648
|
'--domain',
|
|
551
|
-
|
|
649
|
+
project.domain_id,
|
|
552
650
|
'--tag',
|
|
553
651
|
'foo',
|
|
554
|
-
|
|
652
|
+
project.name,
|
|
555
653
|
]
|
|
556
654
|
verifylist = [
|
|
557
|
-
('domain',
|
|
655
|
+
('domain', project.domain_id),
|
|
558
656
|
('enabled', True),
|
|
559
|
-
('name',
|
|
657
|
+
('name', project.name),
|
|
560
658
|
('parent', None),
|
|
561
659
|
('tags', ['foo']),
|
|
562
660
|
]
|
|
@@ -569,29 +667,45 @@ class TestProjectCreate(TestProject):
|
|
|
569
667
|
|
|
570
668
|
# Set expected values
|
|
571
669
|
kwargs = {
|
|
572
|
-
'name':
|
|
573
|
-
'
|
|
574
|
-
'
|
|
575
|
-
'enabled': True,
|
|
576
|
-
'parent': None,
|
|
670
|
+
'name': project.name,
|
|
671
|
+
'domain_id': project.domain_id,
|
|
672
|
+
'is_enabled': True,
|
|
577
673
|
'tags': ['foo'],
|
|
578
|
-
'options': {},
|
|
579
674
|
}
|
|
580
|
-
self.
|
|
675
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
581
676
|
|
|
582
677
|
self.assertEqual(self.columns, columns)
|
|
583
|
-
|
|
678
|
+
datalist = (
|
|
679
|
+
None,
|
|
680
|
+
self.domain.id,
|
|
681
|
+
True,
|
|
682
|
+
project.id,
|
|
683
|
+
False,
|
|
684
|
+
project.name,
|
|
685
|
+
{},
|
|
686
|
+
None,
|
|
687
|
+
['foo'],
|
|
688
|
+
)
|
|
689
|
+
self.assertEqual(datalist, data)
|
|
584
690
|
|
|
585
691
|
def test_project_create_with_immutable_option(self):
|
|
692
|
+
project = sdk_fakes.generate_fake_resource(
|
|
693
|
+
_project.Project,
|
|
694
|
+
**dict(
|
|
695
|
+
self.project_kwargs_no_options, options={'immutable': True}
|
|
696
|
+
),
|
|
697
|
+
)
|
|
698
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
699
|
+
|
|
586
700
|
arglist = [
|
|
587
701
|
'--immutable',
|
|
588
|
-
|
|
702
|
+
project.name,
|
|
589
703
|
]
|
|
590
704
|
verifylist = [
|
|
591
705
|
('immutable', True),
|
|
592
706
|
('description', None),
|
|
593
707
|
('enabled', True),
|
|
594
|
-
('name',
|
|
708
|
+
('name', project.name),
|
|
595
709
|
('parent', None),
|
|
596
710
|
('tags', []),
|
|
597
711
|
]
|
|
@@ -604,31 +718,44 @@ class TestProjectCreate(TestProject):
|
|
|
604
718
|
|
|
605
719
|
# Set expected values
|
|
606
720
|
kwargs = {
|
|
607
|
-
'name':
|
|
608
|
-
'
|
|
609
|
-
'description': None,
|
|
610
|
-
'enabled': True,
|
|
611
|
-
'parent': None,
|
|
612
|
-
'tags': [],
|
|
721
|
+
'name': project.name,
|
|
722
|
+
'is_enabled': True,
|
|
613
723
|
'options': {'immutable': True},
|
|
614
724
|
}
|
|
615
|
-
|
|
616
|
-
# enabled=, **kwargs)
|
|
617
|
-
self.projects_mock.create.assert_called_with(**kwargs)
|
|
725
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
618
726
|
|
|
619
727
|
self.assertEqual(self.columns, columns)
|
|
620
|
-
|
|
728
|
+
datalist = (
|
|
729
|
+
None,
|
|
730
|
+
None,
|
|
731
|
+
True,
|
|
732
|
+
project.id,
|
|
733
|
+
False,
|
|
734
|
+
project.name,
|
|
735
|
+
{'immutable': True},
|
|
736
|
+
None,
|
|
737
|
+
[],
|
|
738
|
+
)
|
|
739
|
+
self.assertEqual(datalist, data)
|
|
621
740
|
|
|
622
741
|
def test_project_create_with_no_immutable_option(self):
|
|
742
|
+
project = sdk_fakes.generate_fake_resource(
|
|
743
|
+
_project.Project,
|
|
744
|
+
**dict(
|
|
745
|
+
self.project_kwargs_no_options, options={'immutable': False}
|
|
746
|
+
),
|
|
747
|
+
)
|
|
748
|
+
self.identity_sdk_client.create_project.return_value = project
|
|
749
|
+
|
|
623
750
|
arglist = [
|
|
624
751
|
'--no-immutable',
|
|
625
|
-
|
|
752
|
+
project.name,
|
|
626
753
|
]
|
|
627
754
|
verifylist = [
|
|
628
755
|
('immutable', False),
|
|
629
756
|
('description', None),
|
|
630
757
|
('enabled', True),
|
|
631
|
-
('name',
|
|
758
|
+
('name', project.name),
|
|
632
759
|
('parent', None),
|
|
633
760
|
('tags', []),
|
|
634
761
|
]
|
|
@@ -641,36 +768,121 @@ class TestProjectCreate(TestProject):
|
|
|
641
768
|
|
|
642
769
|
# Set expected values
|
|
643
770
|
kwargs = {
|
|
644
|
-
'name':
|
|
645
|
-
'
|
|
646
|
-
'description': None,
|
|
647
|
-
'enabled': True,
|
|
648
|
-
'parent': None,
|
|
649
|
-
'tags': [],
|
|
771
|
+
'name': project.name,
|
|
772
|
+
'is_enabled': True,
|
|
650
773
|
'options': {'immutable': False},
|
|
651
774
|
}
|
|
652
|
-
|
|
653
|
-
# enabled=, **kwargs)
|
|
654
|
-
self.projects_mock.create.assert_called_with(**kwargs)
|
|
775
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
655
776
|
|
|
656
777
|
self.assertEqual(self.columns, columns)
|
|
657
|
-
|
|
778
|
+
datalist = (
|
|
779
|
+
None,
|
|
780
|
+
None,
|
|
781
|
+
True,
|
|
782
|
+
project.id,
|
|
783
|
+
False,
|
|
784
|
+
project.name,
|
|
785
|
+
{'immutable': False},
|
|
786
|
+
None,
|
|
787
|
+
[],
|
|
788
|
+
)
|
|
789
|
+
self.assertEqual(datalist, data)
|
|
658
790
|
|
|
791
|
+
def test_project_create_conflict_with_or_show(self):
|
|
792
|
+
project = sdk_fakes.generate_fake_resource(
|
|
793
|
+
_project.Project, **self.project_kwargs_no_options
|
|
794
|
+
)
|
|
795
|
+
self.identity_sdk_client.create_project.side_effect = (
|
|
796
|
+
sdk_exc.ConflictException
|
|
797
|
+
)
|
|
798
|
+
self.identity_sdk_client.find_project.return_value = project
|
|
799
|
+
|
|
800
|
+
arglist = [
|
|
801
|
+
'--or-show',
|
|
802
|
+
project.name,
|
|
803
|
+
]
|
|
804
|
+
verifylist = [
|
|
805
|
+
('or_show', True),
|
|
806
|
+
('description', None),
|
|
807
|
+
('enabled', True),
|
|
808
|
+
('name', project.name),
|
|
809
|
+
('parent', None),
|
|
810
|
+
('tags', []),
|
|
811
|
+
]
|
|
812
|
+
|
|
813
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
814
|
+
|
|
815
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
816
|
+
|
|
817
|
+
kwargs = {
|
|
818
|
+
'name': project.name,
|
|
819
|
+
'is_enabled': True,
|
|
820
|
+
}
|
|
821
|
+
self.identity_sdk_client.create_project.assert_called_with(**kwargs)
|
|
822
|
+
|
|
823
|
+
self.assertEqual(self.columns, columns)
|
|
824
|
+
datalist = (
|
|
825
|
+
None,
|
|
826
|
+
None,
|
|
827
|
+
True,
|
|
828
|
+
project.id,
|
|
829
|
+
False,
|
|
830
|
+
project.name,
|
|
831
|
+
{},
|
|
832
|
+
None,
|
|
833
|
+
[],
|
|
834
|
+
)
|
|
835
|
+
self.assertEqual(datalist, data)
|
|
836
|
+
|
|
837
|
+
def test_project_create_conflict_without_or_show(self):
|
|
838
|
+
self.identity_sdk_client.create_project.side_effect = (
|
|
839
|
+
sdk_exc.ConflictException
|
|
840
|
+
)
|
|
841
|
+
project = sdk_fakes.generate_fake_resource(
|
|
842
|
+
_project.Project, **self.project_kwargs_no_options
|
|
843
|
+
)
|
|
659
844
|
|
|
660
|
-
|
|
661
|
-
|
|
845
|
+
arglist = [
|
|
846
|
+
project.name,
|
|
847
|
+
]
|
|
848
|
+
verifylist = [
|
|
849
|
+
('or_show', False),
|
|
850
|
+
('description', None),
|
|
851
|
+
('enabled', True),
|
|
852
|
+
('name', project.name),
|
|
853
|
+
('parent', None),
|
|
854
|
+
('tags', []),
|
|
855
|
+
]
|
|
856
|
+
|
|
857
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
858
|
+
|
|
859
|
+
self.assertRaises(
|
|
860
|
+
sdk_exc.ConflictException,
|
|
861
|
+
self.cmd.take_action,
|
|
862
|
+
parsed_args,
|
|
863
|
+
)
|
|
864
|
+
|
|
865
|
+
|
|
866
|
+
class TestProjectDelete(identity_fakes.TestIdentityv3):
|
|
867
|
+
domain = sdk_fakes.generate_fake_resource(_domain.Domain)
|
|
662
868
|
|
|
663
869
|
def setUp(self):
|
|
664
870
|
super().setUp()
|
|
665
871
|
|
|
666
|
-
|
|
667
|
-
self.
|
|
668
|
-
|
|
872
|
+
self.project = sdk_fakes.generate_fake_resource(_project.Project)
|
|
873
|
+
self.project_with_domain = sdk_fakes.generate_fake_resource(
|
|
874
|
+
_project.Project,
|
|
875
|
+
name=self.project.name,
|
|
876
|
+
domain_id=self.domain.id,
|
|
877
|
+
)
|
|
878
|
+
self.identity_sdk_client.delete_project.return_value = None
|
|
669
879
|
|
|
670
880
|
# Get the command object to test
|
|
671
881
|
self.cmd = project.DeleteProject(self.app, None)
|
|
672
882
|
|
|
673
883
|
def test_project_delete_no_options(self):
|
|
884
|
+
self.identity_sdk_client.find_project.return_value = self.project
|
|
885
|
+
|
|
674
886
|
arglist = [
|
|
675
887
|
self.project.id,
|
|
676
888
|
]
|
|
@@ -681,16 +893,72 @@ class TestProjectDelete(TestProject):
|
|
|
681
893
|
|
|
682
894
|
result = self.cmd.take_action(parsed_args)
|
|
683
895
|
|
|
684
|
-
self.
|
|
896
|
+
self.identity_sdk_client.delete_project.assert_called_with(
|
|
685
897
|
self.project.id,
|
|
686
898
|
)
|
|
687
899
|
self.assertIsNone(result)
|
|
688
900
|
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
901
|
+
def test_project_multi_delete(self):
|
|
902
|
+
self.identity_sdk_client.find_project.side_effect = [
|
|
903
|
+
self.project,
|
|
904
|
+
self.project_with_domain,
|
|
905
|
+
]
|
|
906
|
+
arglist = [self.project.id, self.project_with_domain.id]
|
|
907
|
+
verifylist = [
|
|
908
|
+
('projects', arglist),
|
|
909
|
+
]
|
|
910
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
911
|
+
|
|
912
|
+
result = self.cmd.take_action(parsed_args)
|
|
913
|
+
|
|
914
|
+
self.identity_sdk_client.delete_project.assert_has_calls(
|
|
915
|
+
[
|
|
916
|
+
mock.call(self.project.id),
|
|
917
|
+
mock.call(self.project_with_domain.id),
|
|
918
|
+
]
|
|
919
|
+
)
|
|
920
|
+
self.assertIsNone(result)
|
|
921
|
+
|
|
922
|
+
def test_project_delete_with_forbidden_domain(self):
|
|
923
|
+
self.identity_sdk_client.find_domain.side_effect = [
|
|
924
|
+
sdk_exc.ForbiddenException
|
|
925
|
+
]
|
|
926
|
+
self.identity_sdk_client.find_project.return_value = (
|
|
927
|
+
self.project_with_domain
|
|
928
|
+
)
|
|
929
|
+
|
|
930
|
+
arglist = [
|
|
931
|
+
'--domain',
|
|
932
|
+
self.project_with_domain.domain_id,
|
|
933
|
+
self.project_with_domain.name,
|
|
934
|
+
]
|
|
935
|
+
verifylist = [
|
|
936
|
+
('domain', self.domain.id),
|
|
937
|
+
('projects', [self.project_with_domain.name]),
|
|
938
|
+
]
|
|
939
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
940
|
+
|
|
941
|
+
result = self.cmd.take_action(parsed_args)
|
|
942
|
+
self.identity_sdk_client.find_project.assert_called_with(
|
|
943
|
+
name_or_id=self.project_with_domain.name,
|
|
944
|
+
ignore_missing=False,
|
|
945
|
+
domain_id=self.domain.id,
|
|
946
|
+
)
|
|
947
|
+
self.identity_sdk_client.delete_project.assert_called_once_with(
|
|
948
|
+
self.project_with_domain.id
|
|
949
|
+
)
|
|
950
|
+
self.assertIsNone(result)
|
|
951
|
+
|
|
952
|
+
def test_delete_multi_projects_with_exception(self):
|
|
953
|
+
self.identity_sdk_client.find_project.side_effect = [
|
|
954
|
+
self.project,
|
|
955
|
+
self.project_with_domain,
|
|
956
|
+
sdk_exc.NotFoundException,
|
|
957
|
+
]
|
|
958
|
+
|
|
692
959
|
arglist = [
|
|
693
960
|
self.project.id,
|
|
961
|
+
self.project_with_domain.id,
|
|
694
962
|
'unexist_project',
|
|
695
963
|
]
|
|
696
964
|
verifylist = [
|
|
@@ -702,21 +970,36 @@ class TestProjectDelete(TestProject):
|
|
|
702
970
|
self.cmd.take_action(parsed_args)
|
|
703
971
|
self.fail('CommandError should be raised.')
|
|
704
972
|
except exceptions.CommandError as e:
|
|
705
|
-
self.assertEqual('1 of
|
|
973
|
+
self.assertEqual('1 of 3 projects failed to delete.', str(e))
|
|
706
974
|
|
|
707
|
-
|
|
708
|
-
|
|
975
|
+
self.identity_sdk_client.find_project.assert_has_calls(
|
|
976
|
+
[
|
|
977
|
+
mock.call(name_or_id=self.project.id, ignore_missing=False),
|
|
978
|
+
mock.call(
|
|
979
|
+
name_or_id=self.project_with_domain.id,
|
|
980
|
+
ignore_missing=False,
|
|
981
|
+
),
|
|
982
|
+
mock.call(name_or_id='unexist_project', ignore_missing=False),
|
|
983
|
+
]
|
|
984
|
+
)
|
|
709
985
|
|
|
710
|
-
self.assertEqual(
|
|
711
|
-
self.
|
|
986
|
+
self.assertEqual(3, self.identity_sdk_client.find_project.call_count)
|
|
987
|
+
self.identity_sdk_client.delete_project.assert_has_calls(
|
|
988
|
+
[
|
|
989
|
+
mock.call(self.project.id),
|
|
990
|
+
mock.call(self.project_with_domain.id),
|
|
991
|
+
]
|
|
992
|
+
)
|
|
712
993
|
|
|
713
994
|
|
|
714
|
-
class TestProjectList(
|
|
715
|
-
domain =
|
|
716
|
-
project =
|
|
717
|
-
|
|
995
|
+
class TestProjectList(identity_fakes.TestIdentityv3):
|
|
996
|
+
domain = sdk_fakes.generate_fake_resource(_domain.Domain)
|
|
997
|
+
project = sdk_fakes.generate_fake_resource(
|
|
998
|
+
_project.Project, domain_id=domain.id
|
|
999
|
+
)
|
|
1000
|
+
projects = list(
|
|
1001
|
+
sdk_fakes.generate_fake_resources(_project.Project, count=2)
|
|
718
1002
|
)
|
|
719
|
-
projects = identity_fakes.FakeProject.create_projects()
|
|
720
1003
|
|
|
721
1004
|
columns = (
|
|
722
1005
|
'ID',
|
|
@@ -746,12 +1029,12 @@ class TestProjectList(TestProject):
|
|
|
746
1029
|
def setUp(self):
|
|
747
1030
|
super().setUp()
|
|
748
1031
|
|
|
749
|
-
self.projects_mock.list.return_value = [self.project]
|
|
750
|
-
|
|
751
1032
|
# Get the command object to test
|
|
752
1033
|
self.cmd = project.ListProject(self.app, None)
|
|
753
1034
|
|
|
754
1035
|
def test_project_list_no_options(self):
|
|
1036
|
+
self.identity_sdk_client.projects.return_value = [self.project]
|
|
1037
|
+
|
|
755
1038
|
arglist = []
|
|
756
1039
|
verifylist = []
|
|
757
1040
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -760,12 +1043,14 @@ class TestProjectList(TestProject):
|
|
|
760
1043
|
# returns a tuple containing the column names and an iterable
|
|
761
1044
|
# containing the data to be listed.
|
|
762
1045
|
columns, data = self.cmd.take_action(parsed_args)
|
|
763
|
-
self.
|
|
1046
|
+
self.identity_sdk_client.projects.assert_called_with()
|
|
764
1047
|
|
|
765
1048
|
self.assertEqual(self.columns, columns)
|
|
766
1049
|
self.assertEqual(self.datalist, tuple(data))
|
|
767
1050
|
|
|
768
1051
|
def test_project_list_long(self):
|
|
1052
|
+
self.identity_sdk_client.projects.return_value = [self.project]
|
|
1053
|
+
|
|
769
1054
|
arglist = [
|
|
770
1055
|
'--long',
|
|
771
1056
|
]
|
|
@@ -778,7 +1063,7 @@ class TestProjectList(TestProject):
|
|
|
778
1063
|
# returns a tuple containing the column names and an iterable
|
|
779
1064
|
# containing the data to be listed.
|
|
780
1065
|
columns, data = self.cmd.take_action(parsed_args)
|
|
781
|
-
self.
|
|
1066
|
+
self.identity_sdk_client.projects.assert_called_with()
|
|
782
1067
|
|
|
783
1068
|
collist = ('ID', 'Name', 'Domain ID', 'Description', 'Enabled')
|
|
784
1069
|
self.assertEqual(collist, columns)
|
|
@@ -794,6 +1079,8 @@ class TestProjectList(TestProject):
|
|
|
794
1079
|
self.assertEqual(datalist, tuple(data))
|
|
795
1080
|
|
|
796
1081
|
def test_project_list_domain(self):
|
|
1082
|
+
self.identity_sdk_client.projects.return_value = [self.project]
|
|
1083
|
+
|
|
797
1084
|
arglist = [
|
|
798
1085
|
'--domain',
|
|
799
1086
|
self.project.domain_id,
|
|
@@ -802,7 +1089,7 @@ class TestProjectList(TestProject):
|
|
|
802
1089
|
('domain', self.project.domain_id),
|
|
803
1090
|
]
|
|
804
1091
|
|
|
805
|
-
self.
|
|
1092
|
+
self.identity_sdk_client.find_domain.return_value = self.domain
|
|
806
1093
|
|
|
807
1094
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
808
1095
|
|
|
@@ -810,14 +1097,16 @@ class TestProjectList(TestProject):
|
|
|
810
1097
|
# returns a tuple containing the column names and an iterable
|
|
811
1098
|
# containing the data to be listed.
|
|
812
1099
|
columns, data = self.cmd.take_action(parsed_args)
|
|
813
|
-
self.
|
|
814
|
-
|
|
1100
|
+
self.identity_sdk_client.projects.assert_called_with(
|
|
1101
|
+
domain_id=self.project.domain_id
|
|
815
1102
|
)
|
|
816
1103
|
|
|
817
1104
|
self.assertEqual(self.columns, columns)
|
|
818
1105
|
self.assertEqual(self.datalist, tuple(data))
|
|
819
1106
|
|
|
820
1107
|
def test_project_list_domain_no_perms(self):
|
|
1108
|
+
self.identity_sdk_client.projects.return_value = [self.project]
|
|
1109
|
+
|
|
821
1110
|
arglist = [
|
|
822
1111
|
'--domain',
|
|
823
1112
|
self.project.domain_id,
|
|
@@ -826,23 +1115,30 @@ class TestProjectList(TestProject):
|
|
|
826
1115
|
('domain', self.project.domain_id),
|
|
827
1116
|
]
|
|
828
1117
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
829
|
-
mocker = mock.Mock()
|
|
830
|
-
mocker.return_value = None
|
|
831
1118
|
|
|
832
|
-
|
|
833
|
-
|
|
1119
|
+
self.identity_sdk_client.find_project.side_effect = (
|
|
1120
|
+
sdk_exc.ResourceNotFound
|
|
1121
|
+
)
|
|
1122
|
+
self.identity_sdk_client.find_domain.return_value = self.domain
|
|
1123
|
+
|
|
1124
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
834
1125
|
|
|
835
|
-
self.
|
|
836
|
-
|
|
1126
|
+
self.identity_sdk_client.projects.assert_called_with(
|
|
1127
|
+
domain_id=self.project.domain_id
|
|
837
1128
|
)
|
|
838
1129
|
self.assertEqual(self.columns, columns)
|
|
839
1130
|
self.assertEqual(self.datalist, tuple(data))
|
|
840
1131
|
|
|
841
1132
|
def test_project_list_parent(self):
|
|
842
|
-
self.parent =
|
|
843
|
-
self.project =
|
|
844
|
-
|
|
1133
|
+
self.parent = sdk_fakes.generate_fake_resource(_project.Project)
|
|
1134
|
+
self.project = sdk_fakes.generate_fake_resource(
|
|
1135
|
+
_project.Project,
|
|
1136
|
+
id=self.project.id,
|
|
1137
|
+
name=self.project.name,
|
|
1138
|
+
domain_id=self.domain.id,
|
|
1139
|
+
parent_id=self.parent.id,
|
|
845
1140
|
)
|
|
1141
|
+
self.identity_sdk_client.projects.return_value = [self.project]
|
|
846
1142
|
|
|
847
1143
|
arglist = [
|
|
848
1144
|
'--parent',
|
|
@@ -852,18 +1148,48 @@ class TestProjectList(TestProject):
|
|
|
852
1148
|
('parent', self.parent.id),
|
|
853
1149
|
]
|
|
854
1150
|
|
|
855
|
-
self.
|
|
1151
|
+
self.identity_sdk_client.find_project.return_value = self.parent
|
|
1152
|
+
|
|
1153
|
+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1154
|
+
|
|
1155
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
1156
|
+
self.identity_sdk_client.projects.assert_called_with(
|
|
1157
|
+
parent_id=self.parent.id
|
|
1158
|
+
)
|
|
1159
|
+
|
|
1160
|
+
self.assertEqual(self.columns, columns)
|
|
1161
|
+
self.assertEqual(self.datalist, tuple(data))
|
|
1162
|
+
|
|
1163
|
+
def test_project_list_user(self):
|
|
1164
|
+
self.user = sdk_fakes.generate_fake_resource(_user.User)
|
|
1165
|
+
self.project = sdk_fakes.generate_fake_resource(
|
|
1166
|
+
_project.UserProject,
|
|
1167
|
+
id=self.project.id,
|
|
1168
|
+
name=self.project.name,
|
|
1169
|
+
user_id=self.user.id,
|
|
1170
|
+
)
|
|
1171
|
+
self.identity_sdk_client.user_projects.return_value = [self.project]
|
|
1172
|
+
|
|
1173
|
+
arglist = [
|
|
1174
|
+
'--user',
|
|
1175
|
+
self.user.id,
|
|
1176
|
+
]
|
|
1177
|
+
verifylist = [
|
|
1178
|
+
('user', self.user.id),
|
|
1179
|
+
]
|
|
1180
|
+
|
|
1181
|
+
self.identity_sdk_client.find_user.return_value = self.user
|
|
856
1182
|
|
|
857
1183
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
858
1184
|
|
|
859
1185
|
columns, data = self.cmd.take_action(parsed_args)
|
|
860
|
-
self.
|
|
1186
|
+
self.identity_sdk_client.user_projects.assert_called_with(self.user.id)
|
|
861
1187
|
|
|
862
1188
|
self.assertEqual(self.columns, columns)
|
|
863
1189
|
self.assertEqual(self.datalist, tuple(data))
|
|
864
1190
|
|
|
865
1191
|
def test_project_list_sort(self):
|
|
866
|
-
self.
|
|
1192
|
+
self.identity_sdk_client.projects.return_value = self.projects
|
|
867
1193
|
|
|
868
1194
|
arglist = [
|
|
869
1195
|
'--sort',
|
|
@@ -877,7 +1203,7 @@ class TestProjectList(TestProject):
|
|
|
877
1203
|
# returns a tuple containing the column names and an iterable
|
|
878
1204
|
# containing the data to be listed.
|
|
879
1205
|
(columns, data) = self.cmd.take_action(parsed_args)
|
|
880
|
-
self.
|
|
1206
|
+
self.identity_sdk_client.projects.assert_called_with()
|
|
881
1207
|
|
|
882
1208
|
collist = ('ID', 'Name')
|
|
883
1209
|
self.assertEqual(collist, columns)
|
|
@@ -896,6 +1222,8 @@ class TestProjectList(TestProject):
|
|
|
896
1222
|
self.assertEqual(datalists, tuple(data))
|
|
897
1223
|
|
|
898
1224
|
def test_project_list_my_projects(self):
|
|
1225
|
+
self.identity_sdk_client.user_projects.return_value = [self.project]
|
|
1226
|
+
|
|
899
1227
|
auth_ref = identity_fakes.fake_auth_ref(
|
|
900
1228
|
identity_fakes.TOKEN_WITH_PROJECT_ID,
|
|
901
1229
|
)
|
|
@@ -913,8 +1241,8 @@ class TestProjectList(TestProject):
|
|
|
913
1241
|
# returns a tuple containing the column names and an iterable
|
|
914
1242
|
# containing the data to be listed.
|
|
915
1243
|
columns, data = self.cmd.take_action(parsed_args)
|
|
916
|
-
self.
|
|
917
|
-
|
|
1244
|
+
self.identity_sdk_client.user_projects.assert_called_with(
|
|
1245
|
+
self.app.client_manager.auth_ref.user_id
|
|
918
1246
|
)
|
|
919
1247
|
|
|
920
1248
|
collist = ('ID', 'Name')
|
|
@@ -928,6 +1256,8 @@ class TestProjectList(TestProject):
|
|
|
928
1256
|
self.assertEqual(datalist, tuple(data))
|
|
929
1257
|
|
|
930
1258
|
def test_project_list_with_option_enabled(self):
|
|
1259
|
+
self.identity_sdk_client.projects.return_value = [self.project]
|
|
1260
|
+
|
|
931
1261
|
arglist = ['--enabled']
|
|
932
1262
|
verifylist = [('is_enabled', True)]
|
|
933
1263
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
@@ -938,25 +1268,28 @@ class TestProjectList(TestProject):
|
|
|
938
1268
|
columns, data = self.cmd.take_action(parsed_args)
|
|
939
1269
|
|
|
940
1270
|
kwargs = {'is_enabled': True}
|
|
941
|
-
self.
|
|
1271
|
+
self.identity_sdk_client.projects.assert_called_with(**kwargs)
|
|
942
1272
|
|
|
943
1273
|
self.assertEqual(self.columns, columns)
|
|
944
1274
|
self.assertEqual(self.datalist, tuple(data))
|
|
945
1275
|
|
|
946
1276
|
|
|
947
|
-
class TestProjectSet(
|
|
948
|
-
domain =
|
|
949
|
-
|
|
950
|
-
|
|
1277
|
+
class TestProjectSet(identity_fakes.TestIdentityv3):
|
|
1278
|
+
domain = sdk_fakes.generate_fake_resource(_domain.Domain)
|
|
1279
|
+
|
|
1280
|
+
project_kwargs_no_options = {
|
|
1281
|
+
'domain_id': domain.id,
|
|
1282
|
+
'tags': ['tag1', 'tag2', 'tag3'],
|
|
1283
|
+
}
|
|
1284
|
+
project = sdk_fakes.generate_fake_resource(
|
|
1285
|
+
_project.Project, **project_kwargs_no_options
|
|
951
1286
|
)
|
|
952
1287
|
|
|
953
1288
|
def setUp(self):
|
|
954
1289
|
super().setUp()
|
|
955
1290
|
|
|
956
|
-
self.
|
|
957
|
-
|
|
958
|
-
self.projects_mock.get.return_value = self.project
|
|
959
|
-
self.projects_mock.update.return_value = self.project
|
|
1291
|
+
self.identity_sdk_client.find_domain.return_value = self.domain
|
|
1292
|
+
self.identity_sdk_client.find_project.return_value = self.project
|
|
960
1293
|
|
|
961
1294
|
# Get the command object to test
|
|
962
1295
|
self.cmd = project.SetProject(self.app, None)
|
|
@@ -997,9 +1330,10 @@ class TestProjectSet(TestProject):
|
|
|
997
1330
|
kwargs = {
|
|
998
1331
|
'name': 'qwerty',
|
|
999
1332
|
}
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1333
|
+
|
|
1334
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1335
|
+
self.project.id, **kwargs
|
|
1336
|
+
)
|
|
1003
1337
|
self.assertIsNone(result)
|
|
1004
1338
|
|
|
1005
1339
|
def test_project_set_description(self):
|
|
@@ -1024,7 +1358,9 @@ class TestProjectSet(TestProject):
|
|
|
1024
1358
|
kwargs = {
|
|
1025
1359
|
'description': 'new desc',
|
|
1026
1360
|
}
|
|
1027
|
-
self.
|
|
1361
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1362
|
+
self.project.id, **kwargs
|
|
1363
|
+
)
|
|
1028
1364
|
self.assertIsNone(result)
|
|
1029
1365
|
|
|
1030
1366
|
def test_project_set_enable(self):
|
|
@@ -1047,7 +1383,9 @@ class TestProjectSet(TestProject):
|
|
|
1047
1383
|
kwargs = {
|
|
1048
1384
|
'enabled': True,
|
|
1049
1385
|
}
|
|
1050
|
-
self.
|
|
1386
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1387
|
+
self.project.id, **kwargs
|
|
1388
|
+
)
|
|
1051
1389
|
self.assertIsNone(result)
|
|
1052
1390
|
|
|
1053
1391
|
def test_project_set_disable(self):
|
|
@@ -1070,7 +1408,9 @@ class TestProjectSet(TestProject):
|
|
|
1070
1408
|
kwargs = {
|
|
1071
1409
|
'enabled': False,
|
|
1072
1410
|
}
|
|
1073
|
-
self.
|
|
1411
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1412
|
+
self.project.id, **kwargs
|
|
1413
|
+
)
|
|
1074
1414
|
self.assertIsNone(result)
|
|
1075
1415
|
|
|
1076
1416
|
def test_project_set_property(self):
|
|
@@ -1097,7 +1437,9 @@ class TestProjectSet(TestProject):
|
|
|
1097
1437
|
'fee': 'fi',
|
|
1098
1438
|
'fo': 'fum',
|
|
1099
1439
|
}
|
|
1100
|
-
self.
|
|
1440
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1441
|
+
self.project.id, **kwargs
|
|
1442
|
+
)
|
|
1101
1443
|
self.assertIsNone(result)
|
|
1102
1444
|
|
|
1103
1445
|
def test_project_set_tags(self):
|
|
@@ -1112,7 +1454,7 @@ class TestProjectSet(TestProject):
|
|
|
1112
1454
|
]
|
|
1113
1455
|
verifylist = [
|
|
1114
1456
|
('name', 'qwerty'),
|
|
1115
|
-
('domain', self.
|
|
1457
|
+
('domain', self.domain.id),
|
|
1116
1458
|
('enabled', None),
|
|
1117
1459
|
('project', self.project.name),
|
|
1118
1460
|
('tags', ['foo']),
|
|
@@ -1126,9 +1468,9 @@ class TestProjectSet(TestProject):
|
|
|
1126
1468
|
'name': 'qwerty',
|
|
1127
1469
|
'tags': sorted({'tag1', 'tag2', 'tag3', 'foo'}),
|
|
1128
1470
|
}
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1471
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1472
|
+
self.project.id, **kwargs
|
|
1473
|
+
)
|
|
1132
1474
|
self.assertIsNone(result)
|
|
1133
1475
|
|
|
1134
1476
|
def test_project_remove_tags(self):
|
|
@@ -1142,14 +1484,16 @@ class TestProjectSet(TestProject):
|
|
|
1142
1484
|
verifylist = [
|
|
1143
1485
|
('enabled', None),
|
|
1144
1486
|
('project', self.project.name),
|
|
1145
|
-
('
|
|
1487
|
+
('remove_tags', ['tag1', 'tag2']),
|
|
1146
1488
|
]
|
|
1147
1489
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1148
1490
|
|
|
1149
1491
|
result = self.cmd.take_action(parsed_args)
|
|
1150
1492
|
|
|
1151
1493
|
kwargs = {'tags': list({'tag3'})}
|
|
1152
|
-
self.
|
|
1494
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1495
|
+
self.project.id, **kwargs
|
|
1496
|
+
)
|
|
1153
1497
|
self.assertIsNone(result)
|
|
1154
1498
|
|
|
1155
1499
|
def test_project_set_with_immutable_option(self):
|
|
@@ -1173,7 +1517,9 @@ class TestProjectSet(TestProject):
|
|
|
1173
1517
|
kwargs = {
|
|
1174
1518
|
'options': {'immutable': True},
|
|
1175
1519
|
}
|
|
1176
|
-
self.
|
|
1520
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1521
|
+
self.project.id, **kwargs
|
|
1522
|
+
)
|
|
1177
1523
|
self.assertIsNone(result)
|
|
1178
1524
|
|
|
1179
1525
|
def test_project_set_with_no_immutable_option(self):
|
|
@@ -1197,114 +1543,108 @@ class TestProjectSet(TestProject):
|
|
|
1197
1543
|
kwargs = {
|
|
1198
1544
|
'options': {'immutable': False},
|
|
1199
1545
|
}
|
|
1200
|
-
self.
|
|
1546
|
+
self.identity_sdk_client.update_project.assert_called_with(
|
|
1547
|
+
self.project.id, **kwargs
|
|
1548
|
+
)
|
|
1201
1549
|
self.assertIsNone(result)
|
|
1202
1550
|
|
|
1203
1551
|
|
|
1204
|
-
class TestProjectShow(
|
|
1205
|
-
domain =
|
|
1552
|
+
class TestProjectShow(identity_fakes.TestIdentityv3):
|
|
1553
|
+
domain = sdk_fakes.generate_fake_resource(_domain.Domain)
|
|
1554
|
+
|
|
1555
|
+
columns = (
|
|
1556
|
+
'description',
|
|
1557
|
+
'domain_id',
|
|
1558
|
+
'enabled',
|
|
1559
|
+
'id',
|
|
1560
|
+
'is_domain',
|
|
1561
|
+
'name',
|
|
1562
|
+
'options',
|
|
1563
|
+
'parent_id',
|
|
1564
|
+
'tags',
|
|
1565
|
+
)
|
|
1566
|
+
|
|
1567
|
+
project_kwargs_no_options = {
|
|
1568
|
+
'description': None,
|
|
1569
|
+
'domain_id': None,
|
|
1570
|
+
'enabled': True,
|
|
1571
|
+
'is_domain': False,
|
|
1572
|
+
'parent_id': None,
|
|
1573
|
+
'tags': [],
|
|
1574
|
+
}
|
|
1206
1575
|
|
|
1207
1576
|
def setUp(self):
|
|
1208
1577
|
super().setUp()
|
|
1209
1578
|
|
|
1210
|
-
self.project = identity_fakes.FakeProject.create_one_project(
|
|
1211
|
-
attrs={'domain_id': self.domain.id}
|
|
1212
|
-
)
|
|
1213
|
-
|
|
1214
1579
|
# Get the command object to test
|
|
1215
1580
|
self.cmd = project.ShowProject(self.app, None)
|
|
1216
1581
|
|
|
1217
1582
|
def test_project_show(self):
|
|
1218
|
-
|
|
1583
|
+
project = sdk_fakes.generate_fake_resource(
|
|
1584
|
+
_project.Project, **self.project_kwargs_no_options
|
|
1585
|
+
)
|
|
1586
|
+
self.identity_sdk_client.find_project.return_value = project
|
|
1219
1587
|
|
|
1220
1588
|
arglist = [
|
|
1221
|
-
|
|
1589
|
+
project.id,
|
|
1222
1590
|
]
|
|
1223
1591
|
verifylist = [
|
|
1224
|
-
('project',
|
|
1592
|
+
('project', project.id),
|
|
1225
1593
|
]
|
|
1226
1594
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1227
1595
|
|
|
1228
|
-
self.identity_client.tokens.get_token_data.return_value = {
|
|
1229
|
-
'token': {
|
|
1230
|
-
'project': {
|
|
1231
|
-
'domain': {},
|
|
1232
|
-
'name': parsed_args.project,
|
|
1233
|
-
'id': parsed_args.project,
|
|
1234
|
-
}
|
|
1235
|
-
}
|
|
1236
|
-
}
|
|
1237
|
-
|
|
1238
1596
|
# In base command class ShowOne in cliff, abstract method take_action()
|
|
1239
1597
|
# returns a two-part tuple with a tuple of column names and a tuple of
|
|
1240
1598
|
# data to be shown.
|
|
1241
1599
|
columns, data = self.cmd.take_action(parsed_args)
|
|
1242
1600
|
|
|
1243
|
-
self.
|
|
1244
|
-
|
|
1245
|
-
collist = (
|
|
1246
|
-
'description',
|
|
1247
|
-
'domain_id',
|
|
1248
|
-
'enabled',
|
|
1249
|
-
'id',
|
|
1250
|
-
'is_domain',
|
|
1251
|
-
'name',
|
|
1252
|
-
'parent_id',
|
|
1253
|
-
'tags',
|
|
1601
|
+
self.identity_sdk_client.find_project.assert_called_with(
|
|
1602
|
+
project.id, ignore_missing=False
|
|
1254
1603
|
)
|
|
1255
|
-
|
|
1604
|
+
|
|
1605
|
+
self.assertEqual(self.columns, columns)
|
|
1256
1606
|
datalist = (
|
|
1257
|
-
|
|
1258
|
-
|
|
1607
|
+
None,
|
|
1608
|
+
None,
|
|
1259
1609
|
True,
|
|
1260
|
-
|
|
1610
|
+
project.id,
|
|
1261
1611
|
False,
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1612
|
+
project.name,
|
|
1613
|
+
{},
|
|
1614
|
+
None,
|
|
1615
|
+
[],
|
|
1265
1616
|
)
|
|
1266
1617
|
self.assertEqual(datalist, data)
|
|
1267
1618
|
|
|
1268
1619
|
def test_project_show_parents(self):
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1620
|
+
parent = sdk_fakes.generate_fake_resource(
|
|
1621
|
+
_project.Project, parent_id='default'
|
|
1622
|
+
)
|
|
1623
|
+
project = sdk_fakes.generate_fake_resource(
|
|
1624
|
+
_project.Project,
|
|
1625
|
+
**dict(
|
|
1626
|
+
self.project_kwargs_no_options,
|
|
1627
|
+
parent_id=parent.id,
|
|
1628
|
+
parents={parent.id: {parent.parent_id: None}},
|
|
1629
|
+
),
|
|
1274
1630
|
)
|
|
1275
|
-
self.
|
|
1631
|
+
self.identity_sdk_client.find_project.return_value = project
|
|
1276
1632
|
|
|
1277
1633
|
arglist = [
|
|
1278
|
-
|
|
1634
|
+
project.id,
|
|
1279
1635
|
'--parents',
|
|
1280
1636
|
]
|
|
1281
1637
|
verifylist = [
|
|
1282
|
-
('project',
|
|
1638
|
+
('project', project.id),
|
|
1283
1639
|
('parents', True),
|
|
1284
1640
|
('children', False),
|
|
1285
1641
|
]
|
|
1286
1642
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1287
|
-
self.identity_client.tokens.get_token_data.return_value = {
|
|
1288
|
-
'token': {
|
|
1289
|
-
'project': {
|
|
1290
|
-
'domain': {},
|
|
1291
|
-
'name': parsed_args.project,
|
|
1292
|
-
'id': parsed_args.project,
|
|
1293
|
-
}
|
|
1294
|
-
}
|
|
1295
|
-
}
|
|
1296
1643
|
|
|
1297
1644
|
columns, data = self.cmd.take_action(parsed_args)
|
|
1298
1645
|
|
|
1299
|
-
self.
|
|
1300
|
-
|
|
1301
|
-
call(self.project.id),
|
|
1302
|
-
call(
|
|
1303
|
-
self.project.id,
|
|
1304
|
-
parents_as_ids=True,
|
|
1305
|
-
subtree_as_ids=False,
|
|
1306
|
-
),
|
|
1307
|
-
]
|
|
1646
|
+
self.identity_sdk_client.find_project.assert_called_with(
|
|
1647
|
+
project.id, parents_as_ids=True, ignore_missing=False
|
|
1308
1648
|
)
|
|
1309
1649
|
|
|
1310
1650
|
collist = (
|
|
@@ -1314,63 +1654,51 @@ class TestProjectShow(TestProject):
|
|
|
1314
1654
|
'id',
|
|
1315
1655
|
'is_domain',
|
|
1316
1656
|
'name',
|
|
1657
|
+
'options',
|
|
1317
1658
|
'parent_id',
|
|
1318
1659
|
'parents',
|
|
1319
1660
|
'tags',
|
|
1320
1661
|
)
|
|
1321
|
-
self.assertEqual(
|
|
1662
|
+
self.assertEqual(collist, columns)
|
|
1322
1663
|
datalist = (
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1664
|
+
None,
|
|
1665
|
+
None,
|
|
1666
|
+
True,
|
|
1667
|
+
project.id,
|
|
1668
|
+
False,
|
|
1669
|
+
project.name,
|
|
1670
|
+
{},
|
|
1671
|
+
parent.id,
|
|
1672
|
+
{parent.id: {'default': None}},
|
|
1673
|
+
[],
|
|
1332
1674
|
)
|
|
1333
|
-
self.assertEqual(
|
|
1675
|
+
self.assertEqual(datalist, data)
|
|
1334
1676
|
|
|
1335
1677
|
def test_project_show_subtree(self):
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1678
|
+
child = sdk_fakes.generate_fake_resource(
|
|
1679
|
+
_project.Project, subtree=None
|
|
1680
|
+
)
|
|
1681
|
+
project = sdk_fakes.generate_fake_resource(
|
|
1682
|
+
_project.Project,
|
|
1683
|
+
**dict(self.project_kwargs_no_options, subtree={child.id: None}),
|
|
1341
1684
|
)
|
|
1342
|
-
self.
|
|
1685
|
+
self.identity_sdk_client.find_project.return_value = project
|
|
1343
1686
|
|
|
1344
1687
|
arglist = [
|
|
1345
|
-
|
|
1688
|
+
project.id,
|
|
1346
1689
|
'--children',
|
|
1347
1690
|
]
|
|
1348
1691
|
verifylist = [
|
|
1349
|
-
('project',
|
|
1692
|
+
('project', project.id),
|
|
1350
1693
|
('parents', False),
|
|
1351
1694
|
('children', True),
|
|
1352
1695
|
]
|
|
1353
1696
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1354
|
-
self.identity_client.tokens.get_token_data.return_value = {
|
|
1355
|
-
'token': {
|
|
1356
|
-
'project': {
|
|
1357
|
-
'domain': {},
|
|
1358
|
-
'name': parsed_args.project,
|
|
1359
|
-
'id': parsed_args.project,
|
|
1360
|
-
}
|
|
1361
|
-
}
|
|
1362
|
-
}
|
|
1363
1697
|
|
|
1364
1698
|
columns, data = self.cmd.take_action(parsed_args)
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
call(
|
|
1369
|
-
self.project.id,
|
|
1370
|
-
parents_as_ids=False,
|
|
1371
|
-
subtree_as_ids=True,
|
|
1372
|
-
),
|
|
1373
|
-
]
|
|
1699
|
+
|
|
1700
|
+
self.identity_sdk_client.find_project.assert_called_with(
|
|
1701
|
+
project.id, subtree_as_ids=True, ignore_missing=False
|
|
1374
1702
|
)
|
|
1375
1703
|
|
|
1376
1704
|
collist = (
|
|
@@ -1380,65 +1708,63 @@ class TestProjectShow(TestProject):
|
|
|
1380
1708
|
'id',
|
|
1381
1709
|
'is_domain',
|
|
1382
1710
|
'name',
|
|
1711
|
+
'options',
|
|
1383
1712
|
'parent_id',
|
|
1384
1713
|
'subtree',
|
|
1385
1714
|
'tags',
|
|
1386
1715
|
)
|
|
1387
|
-
self.assertEqual(
|
|
1716
|
+
self.assertEqual(collist, columns)
|
|
1388
1717
|
datalist = (
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1718
|
+
None,
|
|
1719
|
+
None,
|
|
1720
|
+
True,
|
|
1721
|
+
project.id,
|
|
1722
|
+
False,
|
|
1723
|
+
project.name,
|
|
1724
|
+
{},
|
|
1725
|
+
None,
|
|
1726
|
+
{child.id: None},
|
|
1727
|
+
[],
|
|
1398
1728
|
)
|
|
1399
|
-
self.assertEqual(
|
|
1729
|
+
self.assertEqual(datalist, data)
|
|
1400
1730
|
|
|
1401
1731
|
def test_project_show_parents_and_children(self):
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
}
|
|
1732
|
+
parent = sdk_fakes.generate_fake_resource(
|
|
1733
|
+
_project.Project, parent_id='default'
|
|
1734
|
+
)
|
|
1735
|
+
child = sdk_fakes.generate_fake_resource(
|
|
1736
|
+
_project.Project, subtree=None
|
|
1408
1737
|
)
|
|
1409
|
-
|
|
1738
|
+
project = sdk_fakes.generate_fake_resource(
|
|
1739
|
+
_project.Project,
|
|
1740
|
+
**dict(
|
|
1741
|
+
self.project_kwargs_no_options,
|
|
1742
|
+
parent_id=parent.id,
|
|
1743
|
+
parents={parent.id: {parent.parent_id: None}},
|
|
1744
|
+
subtree={child.id: None},
|
|
1745
|
+
),
|
|
1746
|
+
)
|
|
1747
|
+
self.identity_sdk_client.find_project.return_value = project
|
|
1410
1748
|
|
|
1411
1749
|
arglist = [
|
|
1412
|
-
|
|
1750
|
+
project.id,
|
|
1413
1751
|
'--parents',
|
|
1414
1752
|
'--children',
|
|
1415
1753
|
]
|
|
1416
1754
|
verifylist = [
|
|
1417
|
-
('project',
|
|
1755
|
+
('project', project.id),
|
|
1418
1756
|
('parents', True),
|
|
1419
1757
|
('children', True),
|
|
1420
1758
|
]
|
|
1421
1759
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1422
|
-
self.identity_client.tokens.get_token_data.return_value = {
|
|
1423
|
-
'token': {
|
|
1424
|
-
'project': {
|
|
1425
|
-
'domain': {},
|
|
1426
|
-
'name': parsed_args.project,
|
|
1427
|
-
'id': parsed_args.project,
|
|
1428
|
-
}
|
|
1429
|
-
}
|
|
1430
|
-
}
|
|
1431
1760
|
|
|
1432
1761
|
columns, data = self.cmd.take_action(parsed_args)
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
subtree_as_ids=True,
|
|
1440
|
-
),
|
|
1441
|
-
]
|
|
1762
|
+
|
|
1763
|
+
self.identity_sdk_client.find_project.assert_called_with(
|
|
1764
|
+
project.id,
|
|
1765
|
+
parents_as_ids=True,
|
|
1766
|
+
subtree_as_ids=True,
|
|
1767
|
+
ignore_missing=False,
|
|
1442
1768
|
)
|
|
1443
1769
|
|
|
1444
1770
|
collist = (
|
|
@@ -1448,42 +1774,36 @@ class TestProjectShow(TestProject):
|
|
|
1448
1774
|
'id',
|
|
1449
1775
|
'is_domain',
|
|
1450
1776
|
'name',
|
|
1777
|
+
'options',
|
|
1451
1778
|
'parent_id',
|
|
1452
1779
|
'parents',
|
|
1453
1780
|
'subtree',
|
|
1454
1781
|
'tags',
|
|
1455
1782
|
)
|
|
1456
|
-
self.assertEqual(
|
|
1783
|
+
self.assertEqual(collist, columns)
|
|
1457
1784
|
datalist = (
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1785
|
+
None,
|
|
1786
|
+
None,
|
|
1787
|
+
True,
|
|
1788
|
+
project.id,
|
|
1789
|
+
False,
|
|
1790
|
+
project.name,
|
|
1791
|
+
{},
|
|
1792
|
+
parent.id,
|
|
1793
|
+
{parent.id: {'default': None}},
|
|
1794
|
+
{child.id: None},
|
|
1795
|
+
[],
|
|
1468
1796
|
)
|
|
1469
|
-
self.assertEqual(
|
|
1797
|
+
self.assertEqual(datalist, data)
|
|
1470
1798
|
|
|
1471
1799
|
def test_project_show_with_domain(self):
|
|
1472
|
-
project =
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
self.
|
|
1477
|
-
|
|
1478
|
-
'project': {
|
|
1479
|
-
'domain': {"id": self.project.domain_id},
|
|
1480
|
-
'name': self.project.name,
|
|
1481
|
-
'id': self.project.id,
|
|
1482
|
-
}
|
|
1483
|
-
}
|
|
1484
|
-
}
|
|
1800
|
+
project = sdk_fakes.generate_fake_resource(
|
|
1801
|
+
_project.Project,
|
|
1802
|
+
**dict(self.project_kwargs_no_options, domain_id=self.domain.id),
|
|
1803
|
+
)
|
|
1804
|
+
self.identity_sdk_client.find_domain.return_value = self.domain
|
|
1805
|
+
self.identity_sdk_client.find_project.return_value = project
|
|
1485
1806
|
|
|
1486
|
-
identity_client = self.identity_client
|
|
1487
1807
|
arglist = [
|
|
1488
1808
|
"--domain",
|
|
1489
1809
|
self.domain.id,
|
|
@@ -1495,23 +1815,22 @@ class TestProjectShow(TestProject):
|
|
|
1495
1815
|
]
|
|
1496
1816
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1497
1817
|
|
|
1498
|
-
|
|
1499
|
-
|
|
1818
|
+
columns, data = self.cmd.take_action(parsed_args)
|
|
1819
|
+
|
|
1820
|
+
self.identity_sdk_client.find_project.assert_called_with(
|
|
1821
|
+
project.id, domain_id=self.domain.id, ignore_missing=False
|
|
1500
1822
|
)
|
|
1501
|
-
self.assertEqual(self.project.id, project_str)
|
|
1502
1823
|
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1824
|
+
self.assertEqual(self.columns, columns)
|
|
1825
|
+
datalist = (
|
|
1826
|
+
None,
|
|
1827
|
+
self.domain.id,
|
|
1828
|
+
True,
|
|
1829
|
+
project.id,
|
|
1830
|
+
False,
|
|
1506
1831
|
project.name,
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
('project', project.name),
|
|
1511
|
-
]
|
|
1512
|
-
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
|
1513
|
-
|
|
1514
|
-
project_str = common._get_token_resource(
|
|
1515
|
-
identity_client, 'project', parsed_args.project, parsed_args.domain
|
|
1832
|
+
{},
|
|
1833
|
+
None,
|
|
1834
|
+
[],
|
|
1516
1835
|
)
|
|
1517
|
-
self.assertEqual(
|
|
1836
|
+
self.assertEqual(datalist, data)
|