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.
Files changed (233) hide show
  1. openstackclient/api/object_store_v1.py +4 -1
  2. openstackclient/command.py +27 -0
  3. openstackclient/common/availability_zone.py +1 -1
  4. openstackclient/common/clientmanager.py +59 -21
  5. openstackclient/common/configuration.py +1 -1
  6. openstackclient/common/extension.py +1 -1
  7. openstackclient/common/limits.py +1 -1
  8. openstackclient/common/module.py +5 -3
  9. openstackclient/common/project_cleanup.py +10 -8
  10. openstackclient/common/quota.py +54 -23
  11. openstackclient/common/versions.py +1 -2
  12. openstackclient/compute/v2/agent.py +1 -1
  13. openstackclient/compute/v2/aggregate.py +6 -5
  14. openstackclient/compute/v2/console.py +5 -3
  15. openstackclient/compute/v2/console_connection.py +1 -1
  16. openstackclient/compute/v2/flavor.py +1 -1
  17. openstackclient/compute/v2/host.py +1 -1
  18. openstackclient/compute/v2/hypervisor.py +1 -1
  19. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  20. openstackclient/compute/v2/keypair.py +1 -1
  21. openstackclient/compute/v2/server.py +78 -29
  22. openstackclient/compute/v2/server_backup.py +1 -1
  23. openstackclient/compute/v2/server_event.py +1 -1
  24. openstackclient/compute/v2/server_group.py +4 -2
  25. openstackclient/compute/v2/server_image.py +1 -1
  26. openstackclient/compute/v2/server_migration.py +1 -1
  27. openstackclient/compute/v2/server_volume.py +1 -1
  28. openstackclient/compute/v2/service.py +1 -1
  29. openstackclient/compute/v2/usage.py +6 -4
  30. openstackclient/identity/common.py +33 -1
  31. openstackclient/identity/v2_0/catalog.py +3 -2
  32. openstackclient/identity/v2_0/ec2creds.py +1 -1
  33. openstackclient/identity/v2_0/endpoint.py +1 -1
  34. openstackclient/identity/v2_0/project.py +17 -7
  35. openstackclient/identity/v2_0/role.py +1 -1
  36. openstackclient/identity/v2_0/role_assignment.py +3 -3
  37. openstackclient/identity/v2_0/service.py +4 -2
  38. openstackclient/identity/v2_0/token.py +1 -1
  39. openstackclient/identity/v2_0/user.py +2 -2
  40. openstackclient/identity/v3/access_rule.py +16 -4
  41. openstackclient/identity/v3/application_credential.py +30 -10
  42. openstackclient/identity/v3/catalog.py +3 -3
  43. openstackclient/identity/v3/consumer.py +1 -1
  44. openstackclient/identity/v3/credential.py +1 -1
  45. openstackclient/identity/v3/domain.py +10 -4
  46. openstackclient/identity/v3/ec2creds.py +1 -1
  47. openstackclient/identity/v3/endpoint.py +33 -12
  48. openstackclient/identity/v3/endpoint_group.py +1 -1
  49. openstackclient/identity/v3/federation_protocol.py +40 -41
  50. openstackclient/identity/v3/group.py +11 -5
  51. openstackclient/identity/v3/identity_provider.py +12 -10
  52. openstackclient/identity/v3/implied_role.py +1 -1
  53. openstackclient/identity/v3/limit.py +86 -85
  54. openstackclient/identity/v3/mapping.py +1 -1
  55. openstackclient/identity/v3/policy.py +1 -1
  56. openstackclient/identity/v3/project.py +191 -115
  57. openstackclient/identity/v3/region.py +1 -1
  58. openstackclient/identity/v3/registered_limit.py +97 -109
  59. openstackclient/identity/v3/role.py +20 -39
  60. openstackclient/identity/v3/role_assignment.py +12 -23
  61. openstackclient/identity/v3/service.py +1 -1
  62. openstackclient/identity/v3/service_provider.py +1 -1
  63. openstackclient/identity/v3/tag.py +1 -11
  64. openstackclient/identity/v3/token.py +3 -2
  65. openstackclient/identity/v3/trust.py +4 -2
  66. openstackclient/identity/v3/unscoped_saml.py +1 -1
  67. openstackclient/identity/v3/user.py +22 -13
  68. openstackclient/image/v1/image.py +19 -16
  69. openstackclient/image/v2/cache.py +1 -1
  70. openstackclient/image/v2/image.py +16 -12
  71. openstackclient/image/v2/info.py +1 -1
  72. openstackclient/image/v2/metadef_namespaces.py +1 -1
  73. openstackclient/image/v2/metadef_objects.py +1 -1
  74. openstackclient/image/v2/metadef_properties.py +3 -2
  75. openstackclient/image/v2/metadef_resource_type_association.py +1 -1
  76. openstackclient/image/v2/metadef_resource_types.py +1 -1
  77. openstackclient/image/v2/task.py +1 -1
  78. openstackclient/network/common.py +10 -9
  79. openstackclient/network/v2/address_group.py +4 -3
  80. openstackclient/network/v2/address_scope.py +8 -6
  81. openstackclient/network/v2/default_security_group_rule.py +9 -8
  82. openstackclient/network/v2/floating_ip.py +16 -9
  83. openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
  84. openstackclient/network/v2/ip_availability.py +7 -4
  85. openstackclient/network/v2/l3_conntrack_helper.py +11 -4
  86. openstackclient/network/v2/local_ip.py +13 -7
  87. openstackclient/network/v2/local_ip_association.py +7 -4
  88. openstackclient/network/v2/ndp_proxy.py +13 -6
  89. openstackclient/network/v2/network.py +33 -16
  90. openstackclient/network/v2/network_agent.py +5 -5
  91. openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
  92. openstackclient/network/v2/network_flavor.py +1 -1
  93. openstackclient/network/v2/network_flavor_profile.py +1 -1
  94. openstackclient/network/v2/network_meter.py +1 -1
  95. openstackclient/network/v2/network_meter_rule.py +1 -1
  96. openstackclient/network/v2/network_qos_policy.py +7 -5
  97. openstackclient/network/v2/network_qos_rule.py +1 -1
  98. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  99. openstackclient/network/v2/network_rbac.py +8 -5
  100. openstackclient/network/v2/network_segment.py +2 -2
  101. openstackclient/network/v2/network_segment_range.py +13 -6
  102. openstackclient/network/v2/network_service_provider.py +1 -1
  103. openstackclient/network/v2/network_trunk.py +65 -42
  104. openstackclient/network/v2/port.py +22 -20
  105. openstackclient/network/v2/router.py +19 -8
  106. openstackclient/network/v2/security_group.py +10 -6
  107. openstackclient/network/v2/security_group_rule.py +11 -5
  108. openstackclient/network/v2/subnet.py +17 -18
  109. openstackclient/network/v2/subnet_pool.py +11 -9
  110. openstackclient/network/v2/taas/__init__.py +0 -0
  111. openstackclient/network/v2/taas/tap_flow.py +245 -0
  112. openstackclient/network/v2/taas/tap_mirror.py +237 -0
  113. openstackclient/network/v2/taas/tap_service.py +211 -0
  114. openstackclient/object/v1/account.py +1 -1
  115. openstackclient/object/v1/container.py +1 -1
  116. openstackclient/object/v1/object.py +1 -1
  117. openstackclient/shell.py +18 -8
  118. openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
  119. openstackclient/tests/functional/identity/v3/test_limit.py +47 -0
  120. openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
  121. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  122. openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
  123. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  124. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +46 -132
  125. openstackclient/tests/unit/common/test_command.py +1 -1
  126. openstackclient/tests/unit/common/test_extension.py +2 -3
  127. openstackclient/tests/unit/common/test_module.py +14 -7
  128. openstackclient/tests/unit/common/test_quota.py +79 -0
  129. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  130. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  131. openstackclient/tests/unit/compute/v2/test_flavor.py +1 -3
  132. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  133. openstackclient/tests/unit/compute/v2/test_server.py +370 -38
  134. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  135. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  136. openstackclient/tests/unit/fakes.py +35 -134
  137. openstackclient/tests/unit/identity/test_common.py +100 -0
  138. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  139. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  140. openstackclient/tests/unit/identity/v3/test_application_credential.py +3 -3
  141. openstackclient/tests/unit/identity/v3/test_domain.py +1 -1
  142. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  143. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  144. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  145. openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
  146. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  147. openstackclient/tests/unit/identity/v3/test_project.py +832 -513
  148. openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
  149. openstackclient/tests/unit/identity/v3/test_registered_limit.py +356 -221
  150. openstackclient/tests/unit/identity/v3/test_role.py +1 -82
  151. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  152. openstackclient/tests/unit/image/v2/test_image.py +116 -5
  153. openstackclient/tests/unit/network/test_common.py +9 -13
  154. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  155. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  156. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  157. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  158. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  159. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  160. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  161. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  162. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  163. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  164. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  165. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  166. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  167. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +11 -21
  168. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  169. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  170. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  171. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  172. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  173. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  174. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  175. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  176. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  177. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  178. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  179. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  180. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  181. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  182. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  183. openstackclient/tests/unit/network/v2/test_port.py +75 -86
  184. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  185. openstackclient/tests/unit/network/v2/test_security_group_network.py +19 -26
  186. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +17 -18
  187. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  188. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  189. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  190. openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
  191. openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
  192. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  193. openstackclient/tests/unit/volume/v3/test_volume.py +38 -12
  194. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  195. openstackclient/volume/client.py +7 -17
  196. openstackclient/volume/v2/backup_record.py +1 -1
  197. openstackclient/volume/v2/consistency_group.py +9 -9
  198. openstackclient/volume/v2/consistency_group_snapshot.py +3 -3
  199. openstackclient/volume/v2/qos_specs.py +3 -3
  200. openstackclient/volume/v2/service.py +1 -1
  201. openstackclient/volume/v2/volume.py +14 -7
  202. openstackclient/volume/v2/volume_backend.py +1 -1
  203. openstackclient/volume/v2/volume_backup.py +7 -5
  204. openstackclient/volume/v2/volume_host.py +1 -2
  205. openstackclient/volume/v2/volume_snapshot.py +4 -4
  206. openstackclient/volume/v2/volume_transfer_request.py +3 -3
  207. openstackclient/volume/v2/volume_type.py +16 -11
  208. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  209. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  210. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  211. openstackclient/volume/v3/block_storage_manage.py +1 -1
  212. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  213. openstackclient/volume/v3/service.py +1 -1
  214. openstackclient/volume/v3/volume.py +16 -9
  215. openstackclient/volume/v3/volume_attachment.py +6 -5
  216. openstackclient/volume/v3/volume_backup.py +20 -5
  217. openstackclient/volume/v3/volume_group.py +1 -1
  218. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  219. openstackclient/volume/v3/volume_group_type.py +1 -1
  220. openstackclient/volume/v3/volume_message.py +1 -1
  221. openstackclient/volume/v3/volume_snapshot.py +4 -4
  222. openstackclient/volume/v3/volume_transfer_request.py +3 -3
  223. openstackclient/volume/v3/volume_type.py +20 -14
  224. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/METADATA +15 -13
  225. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/RECORD +231 -219
  226. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/WHEEL +1 -1
  227. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info}/entry_points.txt +15 -0
  228. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/AUTHORS +15 -0
  229. python_openstackclient-9.0.0.dist-info/pbr.json +1 -0
  230. openstackclient/tests/unit/common/test_logs.py +0 -221
  231. python_openstackclient-8.2.0.dist-info/pbr.json +0 -1
  232. {python_openstackclient-8.2.0.dist-info → python_openstackclient-9.0.0.dist-info/licenses}/LICENSE +0 -0
  233. {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 TestProject(identity_fakes.TestIdentityv3):
27
- def setUp(self):
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.project = identity_fakes.FakeProject.create_one_project(
57
- attrs={'domain_id': self.domain.id}
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
- self.project.name,
67
+ project.name,
77
68
  ]
78
69
  verifylist = [
79
70
  ('parent', None),
80
71
  ('enabled', True),
81
- ('name', self.project.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': self.project.name,
94
- 'domain': None,
95
- 'description': None,
96
- 'enabled': True,
97
- 'parent': None,
98
- 'tags': [],
99
- 'options': {},
83
+ 'name': project.name,
84
+ 'is_enabled': True,
100
85
  }
101
- # ProjectManager.create(name=, domain=, description=,
102
- # enabled=, **kwargs)
103
- self.projects_mock.create.assert_called_with(**kwargs)
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
- self.project.description,
118
- self.project.domain_id,
91
+ None,
92
+ None,
119
93
  True,
120
- self.project.id,
94
+ project.id,
121
95
  False,
122
- self.project.name,
123
- self.project.parent_id,
124
- self.project.tags,
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
- self.project.name,
113
+ project.name,
133
114
  ]
134
115
  verifylist = [
135
116
  ('description', 'new desc'),
136
117
  ('enabled', True),
137
- ('name', self.project.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': self.project.name,
151
- 'domain': None,
130
+ 'name': project.name,
152
131
  'description': 'new desc',
153
- 'enabled': True,
154
- 'parent': None,
155
- 'tags': [],
156
- 'options': {},
132
+ 'is_enabled': True,
157
133
  }
158
- # ProjectManager.create(name=, domain=, description=,
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
- self.assertEqual(self.datalist, data)
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
- self.project.domain_id,
169
- self.project.name,
159
+ project.domain_id,
160
+ project.name,
170
161
  ]
171
162
  verifylist = [
172
- ('domain', self.project.domain_id),
163
+ ('domain', project.domain_id),
173
164
  ('enabled', True),
174
- ('name', self.project.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': self.project.name,
188
- 'domain': self.project.domain_id,
189
- 'description': None,
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
- # ProjectManager.create(name=, domain=, description=,
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
- self.assertEqual(self.datalist, data)
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
- self.project.domain_id,
206
- self.project.name,
207
+ project.domain_id,
208
+ project.name,
207
209
  ]
208
210
  verifylist = [
209
- ('domain', self.project.domain_id),
211
+ ('domain', project.domain_id),
210
212
  ('enabled', True),
211
- ('name', self.project.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
- with mock.patch("osc_lib.utils.find_resource", mocker):
220
- columns, data = self.cmd.take_action(parsed_args)
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': self.project.name,
225
- 'domain': self.project.domain_id,
226
- 'description': None,
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.projects_mock.create.assert_called_with(**kwargs)
232
+ self.identity_sdk_client.create_project.assert_called_with(**kwargs)
233
+
233
234
  self.assertEqual(self.columns, columns)
234
- self.assertEqual(self.datalist, data)
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
- self.project.name,
257
+ project.name,
240
258
  ]
241
259
  verifylist = [
242
260
  ('enabled', True),
243
- ('name', self.project.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': self.project.name,
257
- 'domain': None,
258
- 'description': None,
259
- 'enabled': True,
260
- 'parent': None,
261
- 'tags': [],
262
- 'options': {},
274
+ 'name': project.name,
275
+ 'is_enabled': True,
263
276
  }
264
- # ProjectManager.create(name=, domain=, description=,
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
- self.assertEqual(self.datalist, data)
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
- self.project.name,
302
+ project.name,
275
303
  ]
276
304
  verifylist = [
277
305
  ('enabled', False),
278
- ('name', self.project.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': self.project.name,
291
- 'domain': None,
292
- 'description': None,
293
- 'enabled': False,
294
- 'parent': None,
295
- 'tags': [],
296
- 'options': {},
318
+ 'name': project.name,
319
+ 'is_enabled': False,
297
320
  }
298
- # ProjectManager.create(name=, domain=,
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
- self.assertEqual(self.datalist, data)
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
- self.project.name,
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': self.project.name,
327
- 'domain': None,
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
- # ProjectManager.create(name=, domain=, description=,
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(self.columns, columns)
341
- self.assertEqual(self.datalist, data)
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
- self.project.name,
412
+ project.name,
348
413
  ]
349
414
  verifylist = [
350
415
  ('parent', None),
351
416
  ('enabled', True),
352
- ('name', self.project.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': self.project.name,
368
- 'domain': None,
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.projects_mock.create.assert_called_with(**kwargs)
435
+ self.identity_sdk_client.create_project.assert_called_with(**kwargs)
377
436
 
378
437
  self.assertEqual(self.columns, columns)
379
- self.assertEqual(self.datalist, data)
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
- self.project.name,
461
+ project.name,
386
462
  ]
387
463
  verifylist = [
388
464
  ('parent', None),
389
465
  ('enabled', True),
390
- ('name', self.project.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': self.project.name,
406
- 'domain': None,
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.projects_mock.create.assert_called_with(**kwargs)
484
+ self.identity_sdk_client.create_project.assert_called_with(**kwargs)
415
485
 
416
486
  self.assertEqual(self.columns, columns)
417
- self.assertEqual(self.datalist, data)
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
- self.project.name,
510
+ project.name,
424
511
  ]
425
512
  verifylist = [
426
513
  ('parent', None),
427
514
  ('enabled', True),
428
- ('name', self.project.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': self.project.name,
444
- 'domain': None,
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.projects_mock.create.assert_called_with(**kwargs)
533
+ self.identity_sdk_client.create_project.assert_called_with(**kwargs)
453
534
 
454
535
  self.assertEqual(self.columns, columns)
455
- self.assertEqual(self.datalist, data)
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
- self.parent = identity_fakes.FakeProject.create_one_project()
459
- self.project = identity_fakes.FakeProject.create_one_project(
460
- attrs={'domain_id': self.domain.id, 'parent_id': self.parent.id}
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.projects_mock.get.return_value = self.parent
463
- self.projects_mock.create.return_value = self.project
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
- self.project.domain_id,
564
+ project.domain_id,
468
565
  '--parent',
469
- self.parent.name,
470
- self.project.name,
566
+ parent.name,
567
+ project.name,
471
568
  ]
472
569
  verifylist = [
473
- ('domain', self.project.domain_id),
474
- ('parent', self.parent.name),
570
+ ('domain', project.domain_id),
571
+ ('parent', parent.name),
475
572
  ('enabled', True),
476
- ('name', self.project.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': self.project.name,
485
- 'domain': self.project.domain_id,
486
- 'parent': self.parent.id,
487
- 'description': None,
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.projects_mock.create.assert_called_with(**kwargs)
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
- self.project.description,
508
- self.project.domain_id,
509
- self.project.enabled,
510
- self.project.id,
511
- self.project.is_domain,
512
- self.project.name,
513
- self.parent.id,
514
- self.project.tags,
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.projects_mock.resource_class.__name__ = 'Project'
520
- self.projects_mock.get.side_effect = exceptions.NotFound(
521
- 'Invalid parent'
603
+ self.identity_sdk_client.find_project.side_effect = (
604
+ sdk_exc.ResourceNotFound
522
605
  )
523
- self.projects_mock.find.side_effect = exceptions.NotFound(
524
- 'Invalid parent'
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
- self.project.domain_id,
617
+ project.domain_id,
530
618
  '--parent',
531
619
  'invalid',
532
- self.project.name,
620
+ project.name,
533
621
  ]
534
622
  verifylist = [
535
- ('domain', self.project.domain_id),
623
+ ('domain', project.domain_id),
536
624
  ('parent', 'invalid'),
537
625
  ('enabled', True),
538
- ('name', self.project.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
- self.project.domain_id,
649
+ project.domain_id,
552
650
  '--tag',
553
651
  'foo',
554
- self.project.name,
652
+ project.name,
555
653
  ]
556
654
  verifylist = [
557
- ('domain', self.project.domain_id),
655
+ ('domain', project.domain_id),
558
656
  ('enabled', True),
559
- ('name', self.project.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': self.project.name,
573
- 'domain': self.project.domain_id,
574
- 'description': None,
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.projects_mock.create.assert_called_with(**kwargs)
675
+ self.identity_sdk_client.create_project.assert_called_with(**kwargs)
581
676
 
582
677
  self.assertEqual(self.columns, columns)
583
- self.assertEqual(self.datalist, data)
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
- self.project.name,
702
+ project.name,
589
703
  ]
590
704
  verifylist = [
591
705
  ('immutable', True),
592
706
  ('description', None),
593
707
  ('enabled', True),
594
- ('name', self.project.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': self.project.name,
608
- 'domain': None,
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
- # ProjectManager.create(name=, domain=, description=,
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
- self.assertEqual(self.datalist, data)
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
- self.project.name,
752
+ project.name,
626
753
  ]
627
754
  verifylist = [
628
755
  ('immutable', False),
629
756
  ('description', None),
630
757
  ('enabled', True),
631
- ('name', self.project.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': self.project.name,
645
- 'domain': None,
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
- # ProjectManager.create(name=, domain=, description=,
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
- self.assertEqual(self.datalist, data)
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
- class TestProjectDelete(TestProject):
661
- project = identity_fakes.FakeProject.create_one_project()
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
- # This is the return value for utils.find_resource()
667
- self.projects_mock.get.return_value = self.project
668
- self.projects_mock.delete.return_value = None
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.projects_mock.delete.assert_called_with(
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
- @mock.patch.object(utils, 'find_resource')
690
- def test_delete_multi_projects_with_exception(self, find_mock):
691
- find_mock.side_effect = [self.project, exceptions.CommandError]
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 2 projects failed to delete.', str(e))
973
+ self.assertEqual('1 of 3 projects failed to delete.', str(e))
706
974
 
707
- find_mock.assert_any_call(self.projects_mock, self.project.id)
708
- find_mock.assert_any_call(self.projects_mock, 'unexist_project')
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(2, find_mock.call_count)
711
- self.projects_mock.delete.assert_called_once_with(self.project.id)
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(TestProject):
715
- domain = identity_fakes.FakeDomain.create_one_domain()
716
- project = identity_fakes.FakeProject.create_one_project(
717
- attrs={'domain_id': domain.id}
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.projects_mock.list.assert_called_with()
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.projects_mock.list.assert_called_with()
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.domains_mock.get.return_value = self.domain
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.projects_mock.list.assert_called_with(
814
- domain=self.project.domain_id
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
- with mock.patch("osc_lib.utils.find_resource", mocker):
833
- columns, data = self.cmd.take_action(parsed_args)
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.projects_mock.list.assert_called_with(
836
- domain=self.project.domain_id
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 = identity_fakes.FakeProject.create_one_project()
843
- self.project = identity_fakes.FakeProject.create_one_project(
844
- attrs={'domain_id': self.domain.id, 'parent_id': self.parent.id}
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.projects_mock.get.return_value = self.parent
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.projects_mock.list.assert_called_with(parent=self.parent.id)
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.projects_mock.list.return_value = self.projects
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.projects_mock.list.assert_called_with()
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.projects_mock.list.assert_called_with(
917
- user=self.app.client_manager.auth_ref.user_id
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.projects_mock.list.assert_called_with(**kwargs)
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(TestProject):
948
- domain = identity_fakes.FakeDomain.create_one_domain()
949
- project = identity_fakes.FakeProject.create_one_project(
950
- attrs={'domain_id': domain.id, 'tags': ['tag1', 'tag2', 'tag3']}
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.domains_mock.get.return_value = self.domain
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
- # ProjectManager.update(project, name=, domain=, description=,
1001
- # enabled=, **kwargs)
1002
- self.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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.project.domain_id),
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
- # ProjectManager.update(project, name=, domain=, description=,
1130
- # enabled=, **kwargs)
1131
- self.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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
- ('remove_tag', ['tag1', 'tag2']),
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.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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.projects_mock.update.assert_called_with(self.project.id, **kwargs)
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(TestProject):
1205
- domain = identity_fakes.FakeDomain.create_one_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
- self.projects_mock.get.return_value = self.project
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
- self.project.id,
1589
+ project.id,
1222
1590
  ]
1223
1591
  verifylist = [
1224
- ('project', self.project.id),
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.projects_mock.get.assert_called_once_with(self.project.id)
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
- self.assertEqual(collist, columns)
1604
+
1605
+ self.assertEqual(self.columns, columns)
1256
1606
  datalist = (
1257
- self.project.description,
1258
- self.project.domain_id,
1607
+ None,
1608
+ None,
1259
1609
  True,
1260
- self.project.id,
1610
+ project.id,
1261
1611
  False,
1262
- self.project.name,
1263
- self.project.parent_id,
1264
- self.project.tags,
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
- self.project = identity_fakes.FakeProject.create_one_project(
1270
- attrs={
1271
- 'parent_id': self.project.parent_id,
1272
- 'parents': [{'project': {'id': self.project.parent_id}}],
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.projects_mock.get.return_value = self.project
1631
+ self.identity_sdk_client.find_project.return_value = project
1276
1632
 
1277
1633
  arglist = [
1278
- self.project.id,
1634
+ project.id,
1279
1635
  '--parents',
1280
1636
  ]
1281
1637
  verifylist = [
1282
- ('project', self.project.id),
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.projects_mock.get.assert_has_calls(
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(columns, collist)
1662
+ self.assertEqual(collist, columns)
1322
1663
  datalist = (
1323
- self.project.description,
1324
- self.project.domain_id,
1325
- self.project.enabled,
1326
- self.project.id,
1327
- self.project.is_domain,
1328
- self.project.name,
1329
- self.project.parent_id,
1330
- [{'project': {'id': self.project.parent_id}}],
1331
- self.project.tags,
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(data, datalist)
1675
+ self.assertEqual(datalist, data)
1334
1676
 
1335
1677
  def test_project_show_subtree(self):
1336
- self.project = identity_fakes.FakeProject.create_one_project(
1337
- attrs={
1338
- 'parent_id': self.project.parent_id,
1339
- 'subtree': [{'project': {'id': 'children-id'}}],
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.projects_mock.get.return_value = self.project
1685
+ self.identity_sdk_client.find_project.return_value = project
1343
1686
 
1344
1687
  arglist = [
1345
- self.project.id,
1688
+ project.id,
1346
1689
  '--children',
1347
1690
  ]
1348
1691
  verifylist = [
1349
- ('project', self.project.id),
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
- self.projects_mock.get.assert_has_calls(
1366
- [
1367
- call(self.project.id),
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(columns, collist)
1716
+ self.assertEqual(collist, columns)
1388
1717
  datalist = (
1389
- self.project.description,
1390
- self.project.domain_id,
1391
- self.project.enabled,
1392
- self.project.id,
1393
- self.project.is_domain,
1394
- self.project.name,
1395
- self.project.parent_id,
1396
- [{'project': {'id': 'children-id'}}],
1397
- self.project.tags,
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(data, datalist)
1729
+ self.assertEqual(datalist, data)
1400
1730
 
1401
1731
  def test_project_show_parents_and_children(self):
1402
- self.project = identity_fakes.FakeProject.create_one_project(
1403
- attrs={
1404
- 'parent_id': self.project.parent_id,
1405
- 'parents': [{'project': {'id': self.project.parent_id}}],
1406
- 'subtree': [{'project': {'id': 'children-id'}}],
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
- self.projects_mock.get.return_value = self.project
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
- self.project.id,
1750
+ project.id,
1413
1751
  '--parents',
1414
1752
  '--children',
1415
1753
  ]
1416
1754
  verifylist = [
1417
- ('project', self.project.id),
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
- self.projects_mock.get.assert_has_calls(
1434
- [
1435
- call(self.project.id),
1436
- call(
1437
- self.project.id,
1438
- parents_as_ids=True,
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(columns, collist)
1783
+ self.assertEqual(collist, columns)
1457
1784
  datalist = (
1458
- self.project.description,
1459
- self.project.domain_id,
1460
- self.project.enabled,
1461
- self.project.id,
1462
- self.project.is_domain,
1463
- self.project.name,
1464
- self.project.parent_id,
1465
- [{'project': {'id': self.project.parent_id}}],
1466
- [{'project': {'id': 'children-id'}}],
1467
- self.project.tags,
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(data, datalist)
1797
+ self.assertEqual(datalist, data)
1470
1798
 
1471
1799
  def test_project_show_with_domain(self):
1472
- project = identity_fakes.FakeProject.create_one_project(
1473
- {"name": self.project.name}
1474
- )
1475
-
1476
- self.identity_client.tokens.get_token_data.return_value = {
1477
- 'token': {
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
- project_str = common._get_token_resource(
1499
- identity_client, 'project', parsed_args.project, parsed_args.domain
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
- arglist = [
1504
- "--domain",
1505
- project.domain_id,
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
- verifylist = [
1509
- ('domain', project.domain_id),
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(project.name, project_str)
1836
+ self.assertEqual(datalist, data)