python-openstackclient 7.4.0__py3-none-any.whl → 8.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. openstackclient/common/availability_zone.py +3 -6
  2. openstackclient/common/clientmanager.py +2 -1
  3. openstackclient/common/envvars.py +57 -0
  4. openstackclient/common/extension.py +3 -11
  5. openstackclient/common/limits.py +1 -1
  6. openstackclient/common/project_cleanup.py +3 -2
  7. openstackclient/common/quota.py +54 -28
  8. openstackclient/compute/client.py +7 -5
  9. openstackclient/compute/v2/agent.py +5 -5
  10. openstackclient/compute/v2/aggregate.py +17 -15
  11. openstackclient/compute/v2/console.py +10 -4
  12. openstackclient/compute/v2/console_connection.py +48 -0
  13. openstackclient/compute/v2/flavor.py +14 -18
  14. openstackclient/compute/v2/host.py +3 -3
  15. openstackclient/compute/v2/hypervisor.py +10 -4
  16. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  17. openstackclient/compute/v2/keypair.py +18 -13
  18. openstackclient/compute/v2/server.py +144 -121
  19. openstackclient/compute/v2/server_backup.py +1 -1
  20. openstackclient/compute/v2/server_event.py +8 -17
  21. openstackclient/compute/v2/server_group.py +6 -6
  22. openstackclient/compute/v2/server_image.py +1 -1
  23. openstackclient/compute/v2/server_migration.py +6 -6
  24. openstackclient/compute/v2/server_volume.py +4 -4
  25. openstackclient/compute/v2/service.py +9 -13
  26. openstackclient/compute/v2/usage.py +4 -6
  27. openstackclient/identity/client.py +2 -4
  28. openstackclient/identity/common.py +95 -17
  29. openstackclient/identity/v2_0/ec2creds.py +4 -3
  30. openstackclient/identity/v2_0/endpoint.py +12 -10
  31. openstackclient/identity/v2_0/project.py +6 -6
  32. openstackclient/identity/v2_0/role.py +1 -1
  33. openstackclient/identity/v2_0/service.py +7 -7
  34. openstackclient/identity/v2_0/user.py +6 -21
  35. openstackclient/identity/v3/access_rule.py +2 -5
  36. openstackclient/identity/v3/application_credential.py +2 -2
  37. openstackclient/identity/v3/consumer.py +4 -3
  38. openstackclient/identity/v3/credential.py +6 -7
  39. openstackclient/identity/v3/domain.py +63 -44
  40. openstackclient/identity/v3/ec2creds.py +4 -3
  41. openstackclient/identity/v3/endpoint.py +104 -88
  42. openstackclient/identity/v3/endpoint_group.py +1 -1
  43. openstackclient/identity/v3/group.py +116 -72
  44. openstackclient/identity/v3/identity_provider.py +1 -2
  45. openstackclient/identity/v3/limit.py +4 -9
  46. openstackclient/identity/v3/mapping.py +4 -3
  47. openstackclient/identity/v3/policy.py +5 -8
  48. openstackclient/identity/v3/project.py +23 -6
  49. openstackclient/identity/v3/region.py +2 -5
  50. openstackclient/identity/v3/registered_limit.py +4 -8
  51. openstackclient/identity/v3/role.py +15 -16
  52. openstackclient/identity/v3/service.py +8 -8
  53. openstackclient/identity/v3/service_provider.py +3 -6
  54. openstackclient/identity/v3/tag.py +2 -2
  55. openstackclient/identity/v3/token.py +1 -2
  56. openstackclient/identity/v3/trust.py +74 -25
  57. openstackclient/identity/v3/user.py +47 -11
  58. openstackclient/image/client.py +7 -5
  59. openstackclient/image/v1/image.py +11 -15
  60. openstackclient/image/v2/cache.py +2 -4
  61. openstackclient/image/v2/image.py +41 -48
  62. openstackclient/image/v2/metadef_namespaces.py +4 -3
  63. openstackclient/image/v2/metadef_resource_type_association.py +1 -2
  64. openstackclient/image/v2/metadef_resource_types.py +1 -2
  65. openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +9 -1370
  66. openstackclient/network/client.py +4 -16
  67. openstackclient/network/common.py +16 -12
  68. openstackclient/network/utils.py +3 -3
  69. openstackclient/network/v2/address_group.py +5 -9
  70. openstackclient/network/v2/address_scope.py +2 -3
  71. openstackclient/network/v2/default_security_group_rule.py +1 -2
  72. openstackclient/network/v2/floating_ip.py +69 -47
  73. openstackclient/network/v2/floating_ip_port_forwarding.py +7 -7
  74. openstackclient/network/v2/ip_availability.py +1 -2
  75. openstackclient/network/v2/l3_conntrack_helper.py +8 -12
  76. openstackclient/network/v2/local_ip.py +24 -26
  77. openstackclient/network/v2/local_ip_association.py +4 -5
  78. openstackclient/network/v2/ndp_proxy.py +9 -10
  79. openstackclient/network/v2/network.py +12 -16
  80. openstackclient/network/v2/network_agent.py +29 -37
  81. openstackclient/network/v2/network_auto_allocated_topology.py +4 -5
  82. openstackclient/network/v2/network_flavor.py +1 -1
  83. openstackclient/network/v2/network_flavor_profile.py +5 -5
  84. openstackclient/network/v2/network_meter.py +3 -3
  85. openstackclient/network/v2/network_meter_rule.py +5 -8
  86. openstackclient/network/v2/network_qos_policy.py +4 -4
  87. openstackclient/network/v2/network_qos_rule.py +7 -16
  88. openstackclient/network/v2/network_rbac.py +4 -4
  89. openstackclient/network/v2/network_segment.py +6 -7
  90. openstackclient/network/v2/network_segment_range.py +16 -20
  91. openstackclient/network/v2/network_trunk.py +24 -16
  92. openstackclient/network/v2/port.py +28 -29
  93. openstackclient/network/v2/router.py +53 -42
  94. openstackclient/network/v2/security_group.py +13 -19
  95. openstackclient/network/v2/security_group_rule.py +10 -11
  96. openstackclient/network/v2/subnet.py +31 -30
  97. openstackclient/network/v2/subnet_pool.py +4 -4
  98. openstackclient/object/client.py +2 -3
  99. openstackclient/object/v1/container.py +2 -3
  100. openstackclient/object/v1/object.py +2 -9
  101. openstackclient/shell.py +22 -5
  102. openstackclient/tests/functional/base.py +7 -3
  103. openstackclient/tests/functional/common/test_quota.py +3 -1
  104. openstackclient/tests/functional/compute/v2/common.py +12 -6
  105. openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
  106. openstackclient/tests/functional/compute/v2/test_server.py +2 -3
  107. openstackclient/tests/functional/compute/v2/test_server_event.py +1 -1
  108. openstackclient/tests/functional/identity/v2/test_user.py +1 -1
  109. openstackclient/tests/functional/identity/v3/common.py +3 -8
  110. openstackclient/tests/functional/identity/v3/test_application_credential.py +10 -10
  111. openstackclient/tests/functional/identity/v3/test_endpoint.py +3 -3
  112. openstackclient/tests/functional/identity/v3/test_group.py +3 -3
  113. openstackclient/tests/functional/identity/v3/test_idp.py +3 -7
  114. openstackclient/tests/functional/identity/v3/test_limit.py +4 -4
  115. openstackclient/tests/functional/identity/v3/test_project.py +5 -14
  116. openstackclient/tests/functional/identity/v3/test_region.py +1 -3
  117. openstackclient/tests/functional/identity/v3/test_registered_limit.py +3 -3
  118. openstackclient/tests/functional/identity/v3/test_role.py +1 -1
  119. openstackclient/tests/functional/identity/v3/test_role_assignment.py +13 -31
  120. openstackclient/tests/functional/identity/v3/test_service_provider.py +3 -7
  121. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  122. openstackclient/tests/functional/network/v2/common.py +7 -3
  123. openstackclient/tests/functional/network/v2/test_address_group.py +4 -0
  124. openstackclient/tests/functional/network/v2/test_l3_conntrack_helper.py +15 -11
  125. openstackclient/tests/functional/network/v2/test_local_ip.py +4 -0
  126. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +2 -2
  127. openstackclient/tests/functional/network/v2/test_network_ndp_proxy.py +2 -3
  128. openstackclient/tests/functional/network/v2/test_network_rbac.py +2 -2
  129. openstackclient/tests/functional/network/v2/test_network_trunk.py +1 -1
  130. openstackclient/tests/functional/network/v2/test_port.py +17 -7
  131. openstackclient/tests/functional/network/v2/test_router.py +42 -0
  132. openstackclient/tests/functional/network/v2/test_subnet_pool.py +4 -0
  133. openstackclient/tests/unit/api/test_compute_v2.py +67 -87
  134. openstackclient/tests/unit/common/test_availability_zone.py +6 -14
  135. openstackclient/tests/unit/common/test_command.py +1 -1
  136. openstackclient/tests/unit/common/test_extension.py +5 -7
  137. openstackclient/tests/unit/common/test_limits.py +1 -1
  138. openstackclient/tests/unit/common/test_project_cleanup.py +5 -6
  139. openstackclient/tests/unit/common/test_quota.py +51 -28
  140. openstackclient/tests/unit/compute/v2/fakes.py +85 -315
  141. openstackclient/tests/unit/compute/v2/test_agent.py +16 -16
  142. openstackclient/tests/unit/compute/v2/test_aggregate.py +56 -60
  143. openstackclient/tests/unit/compute/v2/test_console.py +34 -17
  144. openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
  145. openstackclient/tests/unit/compute/v2/test_flavor.py +72 -72
  146. openstackclient/tests/unit/compute/v2/test_host.py +8 -8
  147. openstackclient/tests/unit/compute/v2/test_hypervisor.py +22 -30
  148. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +2 -2
  149. openstackclient/tests/unit/compute/v2/test_keypair.py +36 -29
  150. openstackclient/tests/unit/compute/v2/test_server.py +693 -606
  151. openstackclient/tests/unit/compute/v2/test_server_backup.py +36 -77
  152. openstackclient/tests/unit/compute/v2/test_server_event.py +18 -20
  153. openstackclient/tests/unit/compute/v2/test_server_group.py +25 -31
  154. openstackclient/tests/unit/compute/v2/test_server_image.py +37 -78
  155. openstackclient/tests/unit/compute/v2/test_server_migration.py +41 -41
  156. openstackclient/tests/unit/compute/v2/test_server_volume.py +12 -12
  157. openstackclient/tests/unit/compute/v2/test_service.py +39 -45
  158. openstackclient/tests/unit/compute/v2/test_usage.py +5 -5
  159. openstackclient/tests/unit/identity/v2_0/fakes.py +1 -1
  160. openstackclient/tests/unit/identity/v3/test_access_rule.py +1 -3
  161. openstackclient/tests/unit/identity/v3/test_application_credential.py +48 -26
  162. openstackclient/tests/unit/identity/v3/test_domain.py +115 -105
  163. openstackclient/tests/unit/identity/v3/test_endpoint.py +167 -172
  164. openstackclient/tests/unit/identity/v3/test_group.py +353 -202
  165. openstackclient/tests/unit/identity/v3/test_mappings.py +2 -2
  166. openstackclient/tests/unit/identity/v3/test_project.py +16 -0
  167. openstackclient/tests/unit/identity/v3/test_trust.py +5 -2
  168. openstackclient/tests/unit/identity/v3/test_user.py +102 -6
  169. openstackclient/tests/unit/image/v1/fakes.py +2 -2
  170. openstackclient/tests/unit/image/v1/test_image.py +8 -9
  171. openstackclient/tests/unit/image/v2/test_image.py +84 -46
  172. openstackclient/tests/unit/integ/cli/test_shell.py +1 -2
  173. openstackclient/tests/unit/network/test_common.py +2 -2
  174. openstackclient/tests/unit/network/v2/fakes.py +405 -485
  175. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +8 -14
  176. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +62 -54
  177. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +1 -1
  178. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
  179. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +1 -3
  180. openstackclient/tests/unit/network/v2/test_network.py +4 -4
  181. openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
  182. openstackclient/tests/unit/network/v2/test_network_compute.py +11 -11
  183. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
  184. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
  185. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
  186. openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
  187. openstackclient/tests/unit/network/v2/test_network_trunk.py +2 -2
  188. openstackclient/tests/unit/network/v2/test_port.py +21 -22
  189. openstackclient/tests/unit/network/v2/test_router.py +130 -51
  190. openstackclient/tests/unit/network/v2/test_security_group_compute.py +11 -19
  191. openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -27
  192. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +15 -17
  193. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +33 -39
  194. openstackclient/tests/unit/object/v1/test_object_all.py +4 -3
  195. openstackclient/tests/unit/test_shell.py +16 -13
  196. openstackclient/tests/unit/volume/v2/fakes.py +1 -2
  197. openstackclient/tests/unit/volume/v2/test_service.py +57 -91
  198. openstackclient/tests/unit/volume/v2/test_volume.py +109 -106
  199. openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
  200. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
  201. openstackclient/tests/unit/volume/v2/test_volume_transfer_request.py +1 -1
  202. openstackclient/tests/unit/volume/v3/fakes.py +2 -8
  203. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
  204. openstackclient/tests/unit/volume/v3/test_service.py +221 -141
  205. openstackclient/tests/unit/volume/v3/test_volume.py +131 -120
  206. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +4 -4
  207. openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
  208. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +683 -49
  209. openstackclient/tests/unit/volume/v3/test_volume_transfer_request.py +1 -1
  210. openstackclient/volume/client.py +1 -3
  211. openstackclient/volume/v2/consistency_group.py +4 -8
  212. openstackclient/volume/v2/consistency_group_snapshot.py +1 -2
  213. openstackclient/volume/v2/qos_specs.py +1 -2
  214. openstackclient/volume/v2/service.py +41 -38
  215. openstackclient/volume/v2/volume.py +71 -53
  216. openstackclient/volume/v2/volume_backup.py +15 -10
  217. openstackclient/volume/v2/volume_snapshot.py +129 -93
  218. openstackclient/volume/v2/volume_transfer_request.py +0 -3
  219. openstackclient/volume/v2/volume_type.py +10 -21
  220. openstackclient/volume/v3/block_storage_cluster.py +3 -3
  221. openstackclient/volume/v3/block_storage_log_level.py +22 -28
  222. openstackclient/volume/v3/block_storage_manage.py +1 -3
  223. openstackclient/volume/v3/service.py +105 -14
  224. openstackclient/volume/v3/volume.py +218 -58
  225. openstackclient/volume/v3/volume_attachment.py +3 -2
  226. openstackclient/volume/v3/volume_backup.py +31 -27
  227. openstackclient/volume/v3/volume_group.py +2 -1
  228. openstackclient/volume/v3/volume_group_snapshot.py +2 -1
  229. openstackclient/volume/v3/volume_snapshot.py +489 -13
  230. openstackclient/volume/v3/volume_type.py +10 -21
  231. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/AUTHORS +11 -0
  232. python_openstackclient-8.1.0.dist-info/METADATA +264 -0
  233. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/RECORD +238 -259
  234. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/WHEEL +1 -1
  235. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/entry_points.txt +7 -47
  236. python_openstackclient-8.1.0.dist-info/pbr.json +1 -0
  237. openstackclient/tests/functional/volume/v1/__init__.py +0 -0
  238. openstackclient/tests/functional/volume/v1/common.py +0 -35
  239. openstackclient/tests/functional/volume/v1/test_qos.py +0 -100
  240. openstackclient/tests/functional/volume/v1/test_service.py +0 -76
  241. openstackclient/tests/functional/volume/v1/test_snapshot.py +0 -232
  242. openstackclient/tests/functional/volume/v1/test_transfer_request.py +0 -111
  243. openstackclient/tests/functional/volume/v1/test_volume.py +0 -228
  244. openstackclient/tests/functional/volume/v1/test_volume_type.py +0 -213
  245. openstackclient/tests/unit/volume/v1/__init__.py +0 -0
  246. openstackclient/tests/unit/volume/v1/fakes.py +0 -615
  247. openstackclient/tests/unit/volume/v1/test_qos_specs.py +0 -471
  248. openstackclient/tests/unit/volume/v1/test_service.py +0 -295
  249. openstackclient/tests/unit/volume/v1/test_transfer_request.py +0 -380
  250. openstackclient/tests/unit/volume/v1/test_type.py +0 -633
  251. openstackclient/tests/unit/volume/v1/test_volume.py +0 -1447
  252. openstackclient/tests/unit/volume/v1/test_volume_backup.py +0 -435
  253. openstackclient/volume/v1/__init__.py +0 -0
  254. openstackclient/volume/v1/qos_specs.py +0 -377
  255. openstackclient/volume/v1/service.py +0 -136
  256. openstackclient/volume/v1/volume.py +0 -734
  257. openstackclient/volume/v1/volume_backup.py +0 -302
  258. openstackclient/volume/v1/volume_snapshot.py +0 -433
  259. openstackclient/volume/v1/volume_transfer_request.py +0 -200
  260. openstackclient/volume/v1/volume_type.py +0 -520
  261. python_openstackclient-7.4.0.dist-info/METADATA +0 -172
  262. python_openstackclient-7.4.0.dist-info/pbr.json +0 -1
  263. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/LICENSE +0 -0
  264. {python_openstackclient-7.4.0.dist-info → python_openstackclient-8.1.0.dist-info}/top_level.txt +0 -0
@@ -12,108 +12,83 @@
12
12
  # under the License.
13
13
  #
14
14
 
15
- from cinderclient import api_versions
15
+ from unittest import mock
16
+
17
+ from openstack.block_storage.v3 import service as _service
18
+ from openstack.test import fakes as sdk_fakes
19
+ from osc_lib import exceptions
16
20
 
17
21
  from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
18
22
  from openstackclient.volume.v3 import service
19
23
 
20
24
 
21
- class TestService(volume_fakes.TestVolume):
22
- def setUp(self):
23
- super().setUp()
24
-
25
- # Get a shortcut to the ServiceManager Mock
26
- self.service_mock = self.volume_client.services
27
- self.service_mock.reset_mock()
28
-
29
-
30
- class TestServiceList(TestService):
31
- # The service to be listed
32
- services = volume_fakes.create_one_service()
33
-
25
+ class TestServiceList(volume_fakes.TestVolume):
34
26
  def setUp(self):
35
27
  super().setUp()
36
28
 
37
- self.service_mock.list.return_value = [self.services]
29
+ self.service = sdk_fakes.generate_fake_resource(_service.Service)
30
+ self.volume_sdk_client.services.return_value = [self.service]
38
31
 
39
- # Get the command object to test
40
32
  self.cmd = service.ListService(self.app, None)
41
33
 
42
34
  def test_service_list(self):
43
35
  arglist = [
44
36
  '--host',
45
- self.services.host,
37
+ self.service.host,
46
38
  '--service',
47
- self.services.binary,
39
+ self.service.binary,
48
40
  ]
49
41
  verifylist = [
50
- ('host', self.services.host),
51
- ('service', self.services.binary),
42
+ ('host', self.service.host),
43
+ ('service', self.service.binary),
52
44
  ]
53
45
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
54
46
 
55
- # In base command class Lister in cliff, abstract method take_action()
56
- # returns a tuple containing the column names and an iterable
57
- # containing the data to be listed.
58
47
  columns, data = self.cmd.take_action(parsed_args)
59
48
 
60
- expected_columns = [
49
+ expected_columns = (
61
50
  'Binary',
62
51
  'Host',
63
52
  'Zone',
64
53
  'Status',
65
54
  'State',
66
55
  'Updated At',
67
- ]
68
-
69
- # confirming if all expected columns are present in the result.
70
- self.assertEqual(expected_columns, columns)
71
-
56
+ )
72
57
  datalist = (
73
58
  (
74
- self.services.binary,
75
- self.services.host,
76
- self.services.zone,
77
- self.services.status,
78
- self.services.state,
79
- self.services.updated_at,
59
+ self.service.binary,
60
+ self.service.host,
61
+ self.service.availability_zone,
62
+ self.service.status,
63
+ self.service.state,
64
+ self.service.updated_at,
80
65
  ),
81
66
  )
82
-
83
- # confirming if all expected values are present in the result.
67
+ self.assertEqual(expected_columns, columns)
84
68
  self.assertEqual(datalist, tuple(data))
85
-
86
- # checking if proper call was made to list services
87
- self.service_mock.list.assert_called_with(
88
- self.services.host,
89
- self.services.binary,
69
+ self.volume_sdk_client.services.assert_called_with(
70
+ host=self.service.host,
71
+ binary=self.service.binary,
90
72
  )
91
73
 
92
- # checking if prohibited columns are present in output
93
- self.assertNotIn("Disabled Reason", columns)
94
- self.assertNotIn(self.services.disabled_reason, tuple(data))
95
-
96
74
  def test_service_list_with_long_option(self):
97
75
  arglist = [
98
76
  '--host',
99
- self.services.host,
77
+ self.service.host,
100
78
  '--service',
101
- self.services.binary,
79
+ self.service.binary,
102
80
  '--long',
103
81
  ]
104
82
  verifylist = [
105
- ('host', self.services.host),
106
- ('service', self.services.binary),
83
+ ('host', self.service.host),
84
+ ('service', self.service.binary),
107
85
  ('long', True),
108
86
  ]
109
87
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
110
88
 
111
- # In base command class Lister in cliff, abstract method take_action()
112
- # returns a tuple containing the column names and an iterable
113
- # containing the data to be listed.
114
89
  columns, data = self.cmd.take_action(parsed_args)
115
90
 
116
- expected_columns = [
91
+ expected_columns = (
117
92
  'Binary',
118
93
  'Host',
119
94
  'Zone',
@@ -121,55 +96,43 @@ class TestServiceList(TestService):
121
96
  'State',
122
97
  'Updated At',
123
98
  'Disabled Reason',
124
- ]
125
-
126
- # confirming if all expected columns are present in the result.
127
- self.assertEqual(expected_columns, columns)
128
-
99
+ )
129
100
  datalist = (
130
101
  (
131
- self.services.binary,
132
- self.services.host,
133
- self.services.zone,
134
- self.services.status,
135
- self.services.state,
136
- self.services.updated_at,
137
- self.services.disabled_reason,
102
+ self.service.binary,
103
+ self.service.host,
104
+ self.service.availability_zone,
105
+ self.service.status,
106
+ self.service.state,
107
+ self.service.updated_at,
108
+ self.service.disabled_reason,
138
109
  ),
139
110
  )
140
-
141
- # confirming if all expected values are present in the result.
111
+ self.assertEqual(expected_columns, columns)
142
112
  self.assertEqual(datalist, tuple(data))
143
-
144
- self.service_mock.list.assert_called_with(
145
- self.services.host,
146
- self.services.binary,
113
+ self.volume_sdk_client.services.assert_called_with(
114
+ host=self.service.host,
115
+ binary=self.service.binary,
147
116
  )
148
117
 
149
118
  def test_service_list_with_cluster(self):
150
- self.volume_client.api_version = api_versions.APIVersion('3.7')
151
- cluster = {'cluster': 'fake-cluster'}
152
- cluster_service = volume_fakes.create_one_service(attrs=cluster)
153
- self.service_mock.list.return_value = [cluster_service]
119
+ self.set_volume_api_version('3.7')
154
120
 
155
121
  arglist = [
156
122
  '--host',
157
- cluster_service.host,
123
+ self.service.host,
158
124
  '--service',
159
- cluster_service.binary,
125
+ self.service.binary,
160
126
  ]
161
127
  verifylist = [
162
- ('host', cluster_service.host),
163
- ('service', cluster_service.binary),
128
+ ('host', self.service.host),
129
+ ('service', self.service.binary),
164
130
  ]
165
131
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
166
132
 
167
- # In base command class Lister in cliff, abstract method take_action()
168
- # returns a tuple containing the column names and an iterable
169
- # containing the data to be listed.
170
133
  columns, data = self.cmd.take_action(parsed_args)
171
134
 
172
- expected_columns = [
135
+ expected_columns = (
173
136
  'Binary',
174
137
  'Host',
175
138
  'Zone',
@@ -177,60 +140,43 @@ class TestServiceList(TestService):
177
140
  'State',
178
141
  'Updated At',
179
142
  'Cluster',
180
- ]
181
-
182
- # confirming if all expected columns are present in the result.
183
- self.assertEqual(expected_columns, columns)
184
-
143
+ )
185
144
  datalist = (
186
145
  (
187
- cluster_service.binary,
188
- cluster_service.host,
189
- cluster_service.zone,
190
- cluster_service.status,
191
- cluster_service.state,
192
- cluster_service.updated_at,
193
- cluster_service.cluster,
146
+ self.service.binary,
147
+ self.service.host,
148
+ self.service.availability_zone,
149
+ self.service.status,
150
+ self.service.state,
151
+ self.service.updated_at,
152
+ self.service.cluster,
194
153
  ),
195
154
  )
196
-
197
- # confirming if all expected values are present in the result.
155
+ self.assertEqual(expected_columns, columns)
198
156
  self.assertEqual(datalist, tuple(data))
199
-
200
- # checking if proper call was made to list services
201
- self.service_mock.list.assert_called_with(
202
- cluster_service.host,
203
- cluster_service.binary,
157
+ self.volume_sdk_client.services.assert_called_with(
158
+ host=self.service.host,
159
+ binary=self.service.binary,
204
160
  )
205
161
 
206
- # checking if prohibited columns are present in output
207
- self.assertNotIn("Disabled Reason", columns)
208
- self.assertNotIn(cluster_service.disabled_reason, tuple(data))
209
-
210
162
  def test_service_list_with_backend_state(self):
211
- self.volume_client.api_version = api_versions.APIVersion('3.49')
212
- backend_state = {'cluster': 'fake-cluster', 'backend_state': 'up'}
213
- backend_service = volume_fakes.create_one_service(attrs=backend_state)
214
- self.service_mock.list.return_value = [backend_service]
163
+ self.set_volume_api_version('3.49')
215
164
 
216
165
  arglist = [
217
166
  '--host',
218
- backend_service.host,
167
+ self.service.host,
219
168
  '--service',
220
- backend_service.binary,
169
+ self.service.binary,
221
170
  ]
222
171
  verifylist = [
223
- ('host', backend_service.host),
224
- ('service', backend_service.binary),
172
+ ('host', self.service.host),
173
+ ('service', self.service.binary),
225
174
  ]
226
175
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
227
176
 
228
- # In base command class Lister in cliff, abstract method take_action()
229
- # returns a tuple containing the column names and an iterable
230
- # containing the data to be listed.
231
177
  columns, data = self.cmd.take_action(parsed_args)
232
178
 
233
- expected_columns = [
179
+ expected_columns = (
234
180
  'Binary',
235
181
  'Host',
236
182
  'Zone',
@@ -239,33 +185,167 @@ class TestServiceList(TestService):
239
185
  'Updated At',
240
186
  'Cluster',
241
187
  'Backend State',
242
- ]
243
-
244
- # confirming if all expected columns are present in the result.
245
- self.assertEqual(expected_columns, columns)
246
-
188
+ )
247
189
  datalist = (
248
190
  (
249
- backend_service.binary,
250
- backend_service.host,
251
- backend_service.zone,
252
- backend_service.status,
253
- backend_service.state,
254
- backend_service.updated_at,
255
- backend_service.cluster,
256
- backend_service.backend_state,
191
+ self.service.binary,
192
+ self.service.host,
193
+ self.service.availability_zone,
194
+ self.service.status,
195
+ self.service.state,
196
+ self.service.updated_at,
197
+ self.service.cluster,
198
+ self.service.backend_state,
257
199
  ),
258
200
  )
259
-
260
- # confirming if all expected values are present in the result.
201
+ self.assertEqual(expected_columns, columns)
261
202
  self.assertEqual(datalist, tuple(data))
203
+ self.volume_sdk_client.services.assert_called_with(
204
+ host=self.service.host,
205
+ binary=self.service.binary,
206
+ )
207
+
208
+
209
+ class TestServiceSet(volume_fakes.TestVolume):
210
+ def setUp(self):
211
+ super().setUp()
262
212
 
263
- # checking if proper call was made to list services
264
- self.service_mock.list.assert_called_with(
265
- backend_service.host,
266
- backend_service.binary,
213
+ self.service = sdk_fakes.generate_fake_resource(_service.Service)
214
+ self.service.enable = mock.Mock(autospec=True)
215
+ self.service.disable = mock.Mock(autospec=True)
216
+ self.volume_sdk_client.find_service.return_value = self.service
217
+
218
+ self.cmd = service.SetService(self.app, None)
219
+
220
+ def test_service_set_nothing(self):
221
+ arglist = [
222
+ self.service.host,
223
+ self.service.binary,
224
+ ]
225
+ verifylist = [
226
+ ('host', self.service.host),
227
+ ('service', self.service.binary),
228
+ ]
229
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
230
+ result = self.cmd.take_action(parsed_args)
231
+
232
+ self.service.enable.assert_not_called()
233
+ self.service.disable.assert_not_called()
234
+ self.assertIsNone(result)
235
+
236
+ def test_service_set_enable(self):
237
+ arglist = [
238
+ '--enable',
239
+ self.service.host,
240
+ self.service.binary,
241
+ ]
242
+ verifylist = [
243
+ ('enable', True),
244
+ ('host', self.service.host),
245
+ ('service', self.service.binary),
246
+ ]
247
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
248
+
249
+ result = self.cmd.take_action(parsed_args)
250
+
251
+ self.service.enable.assert_called_with(self.volume_sdk_client)
252
+ self.service.disable.assert_not_called()
253
+ self.assertIsNone(result)
254
+
255
+ def test_service_set_disable(self):
256
+ arglist = [
257
+ '--disable',
258
+ self.service.host,
259
+ self.service.binary,
260
+ ]
261
+ verifylist = [
262
+ ('disable', True),
263
+ ('host', self.service.host),
264
+ ('service', self.service.binary),
265
+ ]
266
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
267
+
268
+ result = self.cmd.take_action(parsed_args)
269
+
270
+ self.service.enable.assert_not_called()
271
+ self.service.disable.assert_called_with(
272
+ self.volume_sdk_client, reason=None
267
273
  )
274
+ self.assertIsNone(result)
275
+
276
+ def test_service_set_disable_with_reason(self):
277
+ reason = 'earthquake'
278
+ arglist = [
279
+ '--disable',
280
+ '--disable-reason',
281
+ reason,
282
+ self.service.host,
283
+ self.service.binary,
284
+ ]
285
+ verifylist = [
286
+ ('disable', True),
287
+ ('disable_reason', reason),
288
+ ('host', self.service.host),
289
+ ('service', self.service.binary),
290
+ ]
291
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
292
+
293
+ result = self.cmd.take_action(parsed_args)
294
+
295
+ self.service.enable.assert_not_called()
296
+ self.service.disable.assert_called_with(
297
+ self.volume_sdk_client, reason=reason
298
+ )
299
+ self.assertIsNone(result)
300
+
301
+ def test_service_set_only_with_disable_reason(self):
302
+ reason = 'earthquake'
303
+ arglist = [
304
+ '--disable-reason',
305
+ reason,
306
+ self.service.host,
307
+ self.service.binary,
308
+ ]
309
+ verifylist = [
310
+ ('disable_reason', reason),
311
+ ('host', self.service.host),
312
+ ('service', self.service.binary),
313
+ ]
314
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
315
+
316
+ try:
317
+ self.cmd.take_action(parsed_args)
318
+ self.fail("CommandError should be raised.")
319
+ except exceptions.CommandError as e:
320
+ self.assertEqual(
321
+ "Cannot specify option --disable-reason without "
322
+ "--disable specified.",
323
+ str(e),
324
+ )
325
+
326
+ def test_service_set_enable_with_disable_reason(self):
327
+ reason = 'earthquake'
328
+ arglist = [
329
+ '--enable',
330
+ '--disable-reason',
331
+ reason,
332
+ self.service.host,
333
+ self.service.binary,
334
+ ]
335
+ verifylist = [
336
+ ('enable', True),
337
+ ('disable_reason', reason),
338
+ ('host', self.service.host),
339
+ ('service', self.service.binary),
340
+ ]
341
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
268
342
 
269
- # checking if prohibited columns are present in output
270
- self.assertNotIn("Disabled Reason", columns)
271
- self.assertNotIn(backend_service.disabled_reason, tuple(data))
343
+ try:
344
+ self.cmd.take_action(parsed_args)
345
+ self.fail("CommandError should be raised.")
346
+ except exceptions.CommandError as e:
347
+ self.assertEqual(
348
+ "Cannot specify option --disable-reason without "
349
+ "--disable specified.",
350
+ str(e),
351
+ )