python-openstackclient 8.0.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 (85) hide show
  1. openstackclient/compute/client.py +5 -0
  2. openstackclient/compute/v2/console.py +7 -0
  3. openstackclient/compute/v2/console_connection.py +48 -0
  4. openstackclient/compute/v2/keypair.py +10 -3
  5. openstackclient/compute/v2/server.py +75 -10
  6. openstackclient/compute/v2/server_event.py +1 -1
  7. openstackclient/identity/common.py +79 -0
  8. openstackclient/identity/v3/application_credential.py +2 -2
  9. openstackclient/identity/v3/domain.py +62 -43
  10. openstackclient/identity/v3/group.py +113 -68
  11. openstackclient/identity/v3/project.py +17 -0
  12. openstackclient/identity/v3/user.py +38 -5
  13. openstackclient/image/client.py +5 -0
  14. openstackclient/image/v2/image.py +11 -11
  15. openstackclient/network/client.py +0 -6
  16. openstackclient/network/v2/floating_ip.py +58 -29
  17. openstackclient/network/v2/network_qos_rule.py +3 -11
  18. openstackclient/network/v2/router.py +1 -1
  19. openstackclient/network/v2/security_group.py +5 -4
  20. openstackclient/network/v2/security_group_rule.py +1 -1
  21. openstackclient/shell.py +1 -1
  22. openstackclient/tests/functional/base.py +5 -1
  23. openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
  24. openstackclient/tests/unit/compute/v2/fakes.py +81 -305
  25. openstackclient/tests/unit/compute/v2/test_console.py +18 -1
  26. openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
  27. openstackclient/tests/unit/compute/v2/test_flavor.py +1 -1
  28. openstackclient/tests/unit/compute/v2/test_keypair.py +12 -5
  29. openstackclient/tests/unit/compute/v2/test_server.py +169 -46
  30. openstackclient/tests/unit/compute/v2/test_server_backup.py +32 -71
  31. openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
  32. openstackclient/tests/unit/compute/v2/test_server_image.py +33 -72
  33. openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
  34. openstackclient/tests/unit/identity/v3/test_application_credential.py +47 -25
  35. openstackclient/tests/unit/identity/v3/test_domain.py +115 -105
  36. openstackclient/tests/unit/identity/v3/test_group.py +353 -202
  37. openstackclient/tests/unit/identity/v3/test_project.py +16 -0
  38. openstackclient/tests/unit/identity/v3/test_user.py +86 -6
  39. openstackclient/tests/unit/image/v1/test_image.py +8 -9
  40. openstackclient/tests/unit/image/v2/test_image.py +49 -49
  41. openstackclient/tests/unit/network/v2/fakes.py +405 -485
  42. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +13 -19
  43. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
  44. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +1 -3
  45. openstackclient/tests/unit/network/v2/test_network.py +4 -4
  46. openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
  47. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
  48. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
  49. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
  50. openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
  51. openstackclient/tests/unit/network/v2/test_port.py +17 -17
  52. openstackclient/tests/unit/network/v2/test_router.py +73 -57
  53. openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -27
  54. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +1 -3
  55. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +33 -39
  56. openstackclient/tests/unit/volume/v2/fakes.py +1 -2
  57. openstackclient/tests/unit/volume/v2/test_service.py +57 -91
  58. openstackclient/tests/unit/volume/v2/test_volume.py +108 -105
  59. openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
  60. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
  61. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
  62. openstackclient/tests/unit/volume/v3/test_service.py +221 -141
  63. openstackclient/tests/unit/volume/v3/test_volume.py +130 -119
  64. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  65. openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
  66. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +682 -47
  67. openstackclient/volume/v2/service.py +41 -38
  68. openstackclient/volume/v2/volume.py +63 -37
  69. openstackclient/volume/v2/volume_backup.py +9 -3
  70. openstackclient/volume/v2/volume_snapshot.py +121 -84
  71. openstackclient/volume/v3/block_storage_log_level.py +22 -28
  72. openstackclient/volume/v3/service.py +105 -14
  73. openstackclient/volume/v3/volume.py +200 -39
  74. openstackclient/volume/v3/volume_backup.py +24 -19
  75. openstackclient/volume/v3/volume_snapshot.py +485 -10
  76. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/AUTHORS +8 -0
  77. python_openstackclient-8.1.0.dist-info/METADATA +264 -0
  78. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/RECORD +83 -81
  79. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/entry_points.txt +7 -6
  80. python_openstackclient-8.1.0.dist-info/pbr.json +1 -0
  81. python_openstackclient-8.0.0.dist-info/METADATA +0 -166
  82. python_openstackclient-8.0.0.dist-info/pbr.json +0 -1
  83. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/LICENSE +0 -0
  84. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.1.0.dist-info}/WHEEL +0 -0
  85. {python_openstackclient-8.0.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
+ )