python-openstackclient 8.1.0__py3-none-any.whl → 8.2.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 (56) hide show
  1. openstackclient/api/compute_v2.py +2 -2
  2. openstackclient/api/volume_v2.py +60 -0
  3. openstackclient/api/volume_v3.py +60 -0
  4. openstackclient/compute/v2/flavor.py +14 -1
  5. openstackclient/compute/v2/server.py +1 -3
  6. openstackclient/identity/common.py +8 -13
  7. openstackclient/identity/v3/application_credential.py +86 -85
  8. openstackclient/identity/v3/domain.py +5 -6
  9. openstackclient/identity/v3/project.py +25 -20
  10. openstackclient/identity/v3/role.py +7 -2
  11. openstackclient/image/v1/image.py +16 -1
  12. openstackclient/image/v2/cache.py +10 -6
  13. openstackclient/image/v2/image.py +48 -1
  14. openstackclient/image/v2/metadef_objects.py +8 -2
  15. openstackclient/image/v2/metadef_properties.py +9 -2
  16. openstackclient/network/v2/port.py +16 -0
  17. openstackclient/network/v2/security_group.py +44 -3
  18. openstackclient/network/v2/security_group_rule.py +17 -0
  19. openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
  20. openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
  21. openstackclient/tests/functional/image/v2/test_image.py +36 -14
  22. openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
  23. openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
  24. openstackclient/tests/unit/api/test_volume_v2.py +124 -0
  25. openstackclient/tests/unit/api/test_volume_v3.py +124 -0
  26. openstackclient/tests/unit/compute/v2/test_flavor.py +159 -174
  27. openstackclient/tests/unit/compute/v2/test_server.py +42 -51
  28. openstackclient/tests/unit/identity/v3/test_application_credential.py +47 -41
  29. openstackclient/tests/unit/identity/v3/test_domain.py +2 -2
  30. openstackclient/tests/unit/identity/v3/test_project.py +30 -53
  31. openstackclient/tests/unit/identity/v3/test_role.py +2 -8
  32. openstackclient/tests/unit/image/v1/test_image.py +47 -0
  33. openstackclient/tests/unit/image/v2/test_image.py +79 -9
  34. openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
  35. openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
  36. openstackclient/tests/unit/network/v2/fakes.py +1 -0
  37. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +2 -2
  38. openstackclient/tests/unit/network/v2/test_port.py +40 -0
  39. openstackclient/tests/unit/network/v2/test_security_group_network.py +6 -0
  40. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +49 -0
  41. openstackclient/tests/unit/volume/v2/test_volume.py +358 -305
  42. openstackclient/tests/unit/volume/v3/test_volume.py +439 -415
  43. openstackclient/volume/v2/service.py +1 -1
  44. openstackclient/volume/v2/volume.py +78 -52
  45. openstackclient/volume/v3/service.py +1 -1
  46. openstackclient/volume/v3/volume.py +102 -75
  47. openstackclient/volume/v3/volume_group.py +1 -1
  48. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/AUTHORS +5 -0
  49. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/METADATA +7 -7
  50. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/RECORD +55 -51
  51. python_openstackclient-8.2.0.dist-info/pbr.json +1 -0
  52. python_openstackclient-8.1.0.dist-info/pbr.json +0 -1
  53. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/LICENSE +0 -0
  54. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/WHEEL +0 -0
  55. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/entry_points.txt +0 -0
  56. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.2.0.dist-info}/top_level.txt +0 -0
@@ -13,7 +13,9 @@
13
13
 
14
14
  import copy
15
15
  from unittest import mock
16
+ import uuid
16
17
 
18
+ from openstack.block_storage.v3 import backup as _backup
17
19
  from openstack.block_storage.v3 import block_storage_summary as _summary
18
20
  from openstack.block_storage.v3 import snapshot as _snapshot
19
21
  from openstack.block_storage.v3 import volume as _volume
@@ -23,6 +25,7 @@ from osc_lib.cli import format_columns
23
25
  from osc_lib import exceptions
24
26
  from osc_lib import utils
25
27
 
28
+ from openstackclient.api import volume_v3
26
29
  from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
27
30
  from openstackclient.tests.unit.image.v2 import fakes as image_fakes
28
31
  from openstackclient.tests.unit import utils as test_utils
@@ -30,55 +33,81 @@ from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
30
33
  from openstackclient.volume.v3 import volume
31
34
 
32
35
 
33
- # TODO(stephenfin): Combine these two test classes
34
- class TestVolumeCreateLegacy(volume_fakes.TestVolume):
35
- project = identity_fakes.FakeProject.create_one_project()
36
- user = identity_fakes.FakeUser.create_one_user()
37
-
36
+ class TestVolumeCreate(volume_fakes.TestVolume):
38
37
  columns = (
39
38
  'attachments',
40
39
  'availability_zone',
41
40
  'bootable',
41
+ 'cluster_name',
42
+ 'consistencygroup_id',
43
+ 'consumes_quota',
44
+ 'created_at',
42
45
  'description',
46
+ 'encrypted',
47
+ 'encryption_key_id',
48
+ 'group_id',
43
49
  'id',
50
+ 'multiattach',
44
51
  'name',
52
+ 'os-vol-host-attr:host',
53
+ 'os-vol-mig-status-attr:migstat',
54
+ 'os-vol-mig-status-attr:name_id',
55
+ 'os-vol-tenant-attr:tenant_id',
45
56
  'properties',
57
+ 'provider_id',
58
+ 'replication_status',
59
+ 'service_uuid',
60
+ 'shared_targets',
46
61
  'size',
47
62
  'snapshot_id',
63
+ 'source_volid',
48
64
  'status',
49
65
  'type',
66
+ 'updated_at',
67
+ 'user_id',
68
+ 'volume_image_metadata',
69
+ 'volume_type_id',
50
70
  )
51
71
 
52
72
  def setUp(self):
53
73
  super().setUp()
54
74
 
55
- self.volumes_mock = self.volume_client.volumes
56
- self.volumes_mock.reset_mock()
57
-
58
- self.consistencygroups_mock = self.volume_client.consistencygroups
59
- self.consistencygroups_mock.reset_mock()
60
-
61
- self.snapshots_mock = self.volume_client.volume_snapshots
62
- self.snapshots_mock.reset_mock()
63
-
64
- self.backups_mock = self.volume_client.backups
65
- self.backups_mock.reset_mock()
66
-
67
- self.new_volume = volume_fakes.create_one_volume()
68
- self.volumes_mock.create.return_value = self.new_volume
75
+ self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
76
+ self.volume_sdk_client.create_volume.return_value = self.volume
69
77
 
70
78
  self.datalist = (
71
- self.new_volume.attachments,
72
- self.new_volume.availability_zone,
73
- self.new_volume.bootable,
74
- self.new_volume.description,
75
- self.new_volume.id,
76
- self.new_volume.name,
77
- format_columns.DictColumn(self.new_volume.metadata),
78
- self.new_volume.size,
79
- self.new_volume.snapshot_id,
80
- self.new_volume.status,
81
- self.new_volume.volume_type,
79
+ self.volume.attachments,
80
+ self.volume.availability_zone,
81
+ self.volume.is_bootable,
82
+ self.volume.cluster_name,
83
+ self.volume.consistency_group_id,
84
+ self.volume.consumes_quota,
85
+ self.volume.created_at,
86
+ self.volume.description,
87
+ self.volume.is_encrypted,
88
+ self.volume.encryption_key_id,
89
+ self.volume.group_id,
90
+ self.volume.id,
91
+ self.volume.is_multiattach,
92
+ self.volume.name,
93
+ self.volume.host,
94
+ self.volume.migration_status,
95
+ self.volume.migration_id,
96
+ self.volume.project_id,
97
+ format_columns.DictColumn(self.volume.metadata),
98
+ self.volume.provider_id,
99
+ self.volume.replication_status,
100
+ self.volume.service_uuid,
101
+ self.volume.shared_targets,
102
+ self.volume.size,
103
+ self.volume.snapshot_id,
104
+ self.volume.source_volume_id,
105
+ self.volume.status,
106
+ self.volume.volume_type,
107
+ self.volume.updated_at,
108
+ self.volume.user_id,
109
+ self.volume.volume_image_metadata,
110
+ self.volume.volume_type_id,
82
111
  )
83
112
 
84
113
  # Get the command object to test
@@ -87,87 +116,88 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
87
116
  def test_volume_create_min_options(self):
88
117
  arglist = [
89
118
  '--size',
90
- str(self.new_volume.size),
119
+ str(self.volume.size),
91
120
  ]
92
121
  verifylist = [
93
- ('size', self.new_volume.size),
122
+ ('size', self.volume.size),
94
123
  ]
95
124
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
96
125
 
97
- # In base command class ShowOne in cliff, abstract method take_action()
98
- # returns a two-part tuple with a tuple of column names and a tuple of
99
- # data to be shown.
100
126
  columns, data = self.cmd.take_action(parsed_args)
101
127
 
102
- self.volumes_mock.create.assert_called_with(
103
- size=self.new_volume.size,
128
+ self.volume_sdk_client.create_volume.assert_called_with(
129
+ size=self.volume.size,
104
130
  snapshot_id=None,
105
131
  name=None,
106
132
  description=None,
107
133
  volume_type=None,
108
134
  availability_zone=None,
109
135
  metadata=None,
110
- imageRef=None,
111
- source_volid=None,
112
- consistencygroup_id=None,
136
+ image_id=None,
137
+ source_volume_id=None,
138
+ consistency_group_id=None,
113
139
  scheduler_hints=None,
114
140
  backup_id=None,
115
141
  )
116
142
 
117
143
  self.assertEqual(self.columns, columns)
118
- self.assertCountEqual(self.datalist, data)
144
+ self.assertEqual(self.datalist, data)
119
145
 
120
146
  def test_volume_create_options(self):
121
- consistency_group = volume_fakes.create_one_consistency_group()
122
- self.consistencygroups_mock.get.return_value = consistency_group
147
+ consistency_group_id = 'cg123'
123
148
  arglist = [
124
149
  '--size',
125
- str(self.new_volume.size),
150
+ str(self.volume.size),
126
151
  '--description',
127
- self.new_volume.description,
152
+ self.volume.description,
128
153
  '--type',
129
- self.new_volume.volume_type,
154
+ self.volume.volume_type,
130
155
  '--availability-zone',
131
- self.new_volume.availability_zone,
156
+ self.volume.availability_zone,
132
157
  '--consistency-group',
133
- consistency_group.id,
158
+ consistency_group_id,
134
159
  '--hint',
135
160
  'k=v',
136
- self.new_volume.name,
161
+ self.volume.name,
137
162
  ]
138
163
  verifylist = [
139
- ('size', self.new_volume.size),
140
- ('description', self.new_volume.description),
141
- ('type', self.new_volume.volume_type),
142
- ('availability_zone', self.new_volume.availability_zone),
143
- ('consistency_group', consistency_group.id),
164
+ ('size', self.volume.size),
165
+ ('description', self.volume.description),
166
+ ('type', self.volume.volume_type),
167
+ ('availability_zone', self.volume.availability_zone),
168
+ ('consistency_group', consistency_group_id),
144
169
  ('hint', {'k': 'v'}),
145
- ('name', self.new_volume.name),
170
+ ('name', self.volume.name),
146
171
  ]
147
172
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
148
173
 
149
- # In base command class ShowOne in cliff, abstract method take_action()
150
- # returns a two-part tuple with a tuple of column names and a tuple of
151
- # data to be shown.
152
- columns, data = self.cmd.take_action(parsed_args)
174
+ with mock.patch.object(
175
+ volume_v3,
176
+ 'find_consistency_group',
177
+ return_value={'id': consistency_group_id},
178
+ ) as mock_find_cg:
179
+ columns, data = self.cmd.take_action(parsed_args)
153
180
 
154
- self.volumes_mock.create.assert_called_with(
155
- size=self.new_volume.size,
181
+ self.volume_sdk_client.create_volume.assert_called_with(
182
+ size=self.volume.size,
156
183
  snapshot_id=None,
157
- name=self.new_volume.name,
158
- description=self.new_volume.description,
159
- volume_type=self.new_volume.volume_type,
160
- availability_zone=self.new_volume.availability_zone,
184
+ name=self.volume.name,
185
+ description=self.volume.description,
186
+ volume_type=self.volume.volume_type,
187
+ availability_zone=self.volume.availability_zone,
161
188
  metadata=None,
162
- imageRef=None,
163
- source_volid=None,
164
- consistencygroup_id=consistency_group.id,
189
+ image_id=None,
190
+ source_volume_id=None,
191
+ consistency_group_id=consistency_group_id,
165
192
  scheduler_hints={'k': 'v'},
166
193
  backup_id=None,
167
194
  )
195
+ mock_find_cg.assert_called_once_with(
196
+ self.volume_sdk_client, consistency_group_id
197
+ )
168
198
 
169
199
  self.assertEqual(self.columns, columns)
170
- self.assertCountEqual(self.datalist, data)
200
+ self.assertEqual(self.datalist, data)
171
201
 
172
202
  def test_volume_create_properties(self):
173
203
  arglist = [
@@ -176,38 +206,35 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
176
206
  '--property',
177
207
  'Beta=b',
178
208
  '--size',
179
- str(self.new_volume.size),
180
- self.new_volume.name,
209
+ str(self.volume.size),
210
+ self.volume.name,
181
211
  ]
182
212
  verifylist = [
183
213
  ('properties', {'Alpha': 'a', 'Beta': 'b'}),
184
- ('size', self.new_volume.size),
185
- ('name', self.new_volume.name),
214
+ ('size', self.volume.size),
215
+ ('name', self.volume.name),
186
216
  ]
187
217
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
188
218
 
189
- # In base command class ShowOne in cliff, abstract method take_action()
190
- # returns a two-part tuple with a tuple of column names and a tuple of
191
- # data to be shown.
192
219
  columns, data = self.cmd.take_action(parsed_args)
193
220
 
194
- self.volumes_mock.create.assert_called_with(
195
- size=self.new_volume.size,
221
+ self.volume_sdk_client.create_volume.assert_called_with(
222
+ size=self.volume.size,
196
223
  snapshot_id=None,
197
- name=self.new_volume.name,
224
+ name=self.volume.name,
198
225
  description=None,
199
226
  volume_type=None,
200
227
  availability_zone=None,
201
228
  metadata={'Alpha': 'a', 'Beta': 'b'},
202
- imageRef=None,
203
- source_volid=None,
204
- consistencygroup_id=None,
229
+ image_id=None,
230
+ source_volume_id=None,
231
+ consistency_group_id=None,
205
232
  scheduler_hints=None,
206
233
  backup_id=None,
207
234
  )
208
235
 
209
236
  self.assertEqual(self.columns, columns)
210
- self.assertCountEqual(self.datalist, data)
237
+ self.assertEqual(self.datalist, data)
211
238
 
212
239
  def test_volume_create_image_id(self):
213
240
  image = image_fakes.create_one_image()
@@ -217,38 +244,35 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
217
244
  '--image',
218
245
  image.id,
219
246
  '--size',
220
- str(self.new_volume.size),
221
- self.new_volume.name,
247
+ str(self.volume.size),
248
+ self.volume.name,
222
249
  ]
223
250
  verifylist = [
224
251
  ('image', image.id),
225
- ('size', self.new_volume.size),
226
- ('name', self.new_volume.name),
252
+ ('size', self.volume.size),
253
+ ('name', self.volume.name),
227
254
  ]
228
255
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
229
256
 
230
- # In base command class ShowOne in cliff, abstract method take_action()
231
- # returns a two-part tuple with a tuple of column names and a tuple of
232
- # data to be shown.
233
257
  columns, data = self.cmd.take_action(parsed_args)
234
258
 
235
- self.volumes_mock.create.assert_called_with(
236
- size=self.new_volume.size,
259
+ self.volume_sdk_client.create_volume.assert_called_with(
260
+ size=self.volume.size,
237
261
  snapshot_id=None,
238
- name=self.new_volume.name,
262
+ name=self.volume.name,
239
263
  description=None,
240
264
  volume_type=None,
241
265
  availability_zone=None,
242
266
  metadata=None,
243
- imageRef=image.id,
244
- source_volid=None,
245
- consistencygroup_id=None,
267
+ image_id=image.id,
268
+ source_volume_id=None,
269
+ consistency_group_id=None,
246
270
  scheduler_hints=None,
247
271
  backup_id=None,
248
272
  )
249
273
 
250
274
  self.assertEqual(self.columns, columns)
251
- self.assertCountEqual(self.datalist, data)
275
+ self.assertEqual(self.datalist, data)
252
276
 
253
277
  def test_volume_create_image_name(self):
254
278
  image = image_fakes.create_one_image()
@@ -258,177 +282,173 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
258
282
  '--image',
259
283
  image.name,
260
284
  '--size',
261
- str(self.new_volume.size),
262
- self.new_volume.name,
285
+ str(self.volume.size),
286
+ self.volume.name,
263
287
  ]
264
288
  verifylist = [
265
289
  ('image', image.name),
266
- ('size', self.new_volume.size),
267
- ('name', self.new_volume.name),
290
+ ('size', self.volume.size),
291
+ ('name', self.volume.name),
268
292
  ]
269
293
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
270
294
 
271
- # In base command class ShowOne in cliff, abstract method take_action()
272
- # returns a two-part tuple with a tuple of column names and a tuple of
273
- # data to be shown.
274
295
  columns, data = self.cmd.take_action(parsed_args)
275
296
 
276
- self.volumes_mock.create.assert_called_with(
277
- size=self.new_volume.size,
297
+ self.volume_sdk_client.create_volume.assert_called_with(
298
+ size=self.volume.size,
278
299
  snapshot_id=None,
279
- name=self.new_volume.name,
300
+ name=self.volume.name,
280
301
  description=None,
281
302
  volume_type=None,
282
303
  availability_zone=None,
283
304
  metadata=None,
284
- imageRef=image.id,
285
- source_volid=None,
286
- consistencygroup_id=None,
305
+ image_id=image.id,
306
+ source_volume_id=None,
307
+ consistency_group_id=None,
287
308
  scheduler_hints=None,
288
309
  backup_id=None,
289
310
  )
290
311
 
291
312
  self.assertEqual(self.columns, columns)
292
- self.assertCountEqual(self.datalist, data)
313
+ self.assertEqual(self.datalist, data)
293
314
 
294
315
  def test_volume_create_with_snapshot(self):
295
- snapshot = volume_fakes.create_one_snapshot()
296
- self.new_volume.snapshot_id = snapshot.id
316
+ snapshot = sdk_fakes.generate_fake_resource(_snapshot.Snapshot)
317
+ self.volume_sdk_client.find_snapshot.return_value = snapshot
318
+
297
319
  arglist = [
298
320
  '--snapshot',
299
- self.new_volume.snapshot_id,
300
- self.new_volume.name,
321
+ snapshot.id,
322
+ self.volume.name,
301
323
  ]
302
324
  verifylist = [
303
- ('snapshot', self.new_volume.snapshot_id),
304
- ('name', self.new_volume.name),
325
+ ('snapshot', snapshot.id),
326
+ ('name', self.volume.name),
305
327
  ]
306
328
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
307
329
 
308
- self.snapshots_mock.get.return_value = snapshot
309
-
310
- # In base command class ShowOne in cliff, abstract method take_action()
311
- # returns a two-part tuple with a tuple of column names and a tuple of
312
- # data to be shown.
313
330
  columns, data = self.cmd.take_action(parsed_args)
314
331
 
315
- self.volumes_mock.create.assert_called_once_with(
332
+ self.volume_sdk_client.create_volume.assert_called_with(
316
333
  size=snapshot.size,
317
334
  snapshot_id=snapshot.id,
318
- name=self.new_volume.name,
335
+ name=self.volume.name,
319
336
  description=None,
320
337
  volume_type=None,
321
338
  availability_zone=None,
322
339
  metadata=None,
323
- imageRef=None,
324
- source_volid=None,
325
- consistencygroup_id=None,
340
+ image_id=None,
341
+ source_volume_id=None,
342
+ consistency_group_id=None,
326
343
  scheduler_hints=None,
327
344
  backup_id=None,
328
345
  )
346
+ self.volume_sdk_client.find_snapshot.assert_called_once_with(
347
+ snapshot.id, ignore_missing=False
348
+ )
329
349
 
330
350
  self.assertEqual(self.columns, columns)
331
- self.assertCountEqual(self.datalist, data)
351
+ self.assertEqual(self.datalist, data)
332
352
 
333
353
  def test_volume_create_with_backup(self):
334
354
  self.set_volume_api_version('3.47')
335
355
 
336
- backup = volume_fakes.create_one_backup()
337
- self.new_volume.backup_id = backup.id
356
+ backup = sdk_fakes.generate_fake_resource(_backup.Backup)
357
+ self.volume_sdk_client.find_backup.return_value = backup
358
+
338
359
  arglist = [
339
360
  '--backup',
340
- self.new_volume.backup_id,
341
- self.new_volume.name,
361
+ backup.id,
362
+ self.volume.name,
342
363
  ]
343
364
  verifylist = [
344
- ('backup', self.new_volume.backup_id),
345
- ('name', self.new_volume.name),
365
+ ('backup', backup.id),
366
+ ('name', self.volume.name),
346
367
  ]
347
368
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
348
369
 
349
- self.backups_mock.get.return_value = backup
350
-
351
- # In base command class ShowOne in cliff, abstract method take_action()
352
- # returns a two-part tuple with a tuple of column names and a tuple of
353
- # data to be shown.
354
370
  columns, data = self.cmd.take_action(parsed_args)
355
371
 
356
- self.volumes_mock.create.assert_called_once_with(
372
+ self.volume_sdk_client.create_volume.assert_called_with(
357
373
  size=backup.size,
358
374
  snapshot_id=None,
359
- name=self.new_volume.name,
375
+ name=self.volume.name,
360
376
  description=None,
361
377
  volume_type=None,
362
378
  availability_zone=None,
363
379
  metadata=None,
364
- imageRef=None,
365
- source_volid=None,
366
- consistencygroup_id=None,
380
+ image_id=None,
381
+ source_volume_id=None,
382
+ consistency_group_id=None,
367
383
  scheduler_hints=None,
368
384
  backup_id=backup.id,
369
385
  )
386
+ self.volume_sdk_client.find_backup.assert_called_once_with(
387
+ backup.id, ignore_missing=False
388
+ )
370
389
 
371
390
  self.assertEqual(self.columns, columns)
372
- self.assertCountEqual(self.datalist, data)
391
+ self.assertEqual(self.datalist, data)
373
392
 
374
393
  def test_volume_create_with_backup_pre_v347(self):
375
- backup = volume_fakes.create_one_backup()
376
- self.new_volume.backup_id = backup.id
394
+ backup = sdk_fakes.generate_fake_resource(_backup.Backup)
395
+ self.volume_sdk_client.find_backup.return_value = backup
396
+
377
397
  arglist = [
378
398
  '--backup',
379
- self.new_volume.backup_id,
380
- self.new_volume.name,
399
+ backup.id,
400
+ self.volume.name,
381
401
  ]
382
402
  verifylist = [
383
- ('backup', self.new_volume.backup_id),
384
- ('name', self.new_volume.name),
403
+ ('backup', backup.id),
404
+ ('name', self.volume.name),
385
405
  ]
386
406
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
387
407
 
388
- self.backups_mock.get.return_value = backup
389
-
390
408
  exc = self.assertRaises(
391
409
  exceptions.CommandError, self.cmd.take_action, parsed_args
392
410
  )
393
411
  self.assertIn("--os-volume-api-version 3.47 or greater", str(exc))
394
412
 
413
+ self.volume_sdk_client.create_volume.assert_not_called()
414
+
395
415
  def test_volume_create_with_source_volume(self):
396
- source_vol = "source_vol"
416
+ source_volume = sdk_fakes.generate_fake_resource(_volume.Volume)
417
+ self.volume_sdk_client.find_volume.return_value = source_volume
418
+
397
419
  arglist = [
398
420
  '--source',
399
- self.new_volume.id,
400
- source_vol,
421
+ source_volume.id,
422
+ self.volume.name,
401
423
  ]
402
424
  verifylist = [
403
- ('source', self.new_volume.id),
404
- ('name', source_vol),
425
+ ('source', source_volume.id),
426
+ ('name', self.volume.name),
405
427
  ]
406
428
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
407
429
 
408
- self.volumes_mock.get.return_value = self.new_volume
409
-
410
- # In base command class ShowOne in cliff, abstract method take_action()
411
- # returns a two-part tuple with a tuple of column names and a tuple of
412
- # data to be shown.
413
430
  columns, data = self.cmd.take_action(parsed_args)
414
431
 
415
- self.volumes_mock.create.assert_called_once_with(
416
- size=self.new_volume.size,
432
+ self.volume_sdk_client.create_volume.assert_called_with(
433
+ size=source_volume.size,
417
434
  snapshot_id=None,
418
- name=source_vol,
435
+ name=self.volume.name,
419
436
  description=None,
420
437
  volume_type=None,
421
438
  availability_zone=None,
422
439
  metadata=None,
423
- imageRef=None,
424
- source_volid=self.new_volume.id,
425
- consistencygroup_id=None,
440
+ image_id=None,
441
+ source_volume_id=source_volume.id,
442
+ consistency_group_id=None,
426
443
  scheduler_hints=None,
427
444
  backup_id=None,
428
445
  )
446
+ self.volume_sdk_client.find_volume.assert_called_once_with(
447
+ source_volume.id, ignore_missing=False
448
+ )
429
449
 
430
450
  self.assertEqual(self.columns, columns)
431
- self.assertCountEqual(self.datalist, data)
451
+ self.assertEqual(self.datalist, data)
432
452
 
433
453
  @mock.patch.object(utils, 'wait_for_status', return_value=True)
434
454
  def test_volume_create_with_bootable_and_readonly(self, mock_wait):
@@ -436,192 +456,191 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
436
456
  '--bootable',
437
457
  '--read-only',
438
458
  '--size',
439
- str(self.new_volume.size),
440
- self.new_volume.name,
459
+ str(self.volume.size),
460
+ self.volume.name,
441
461
  ]
442
462
  verifylist = [
443
463
  ('bootable', True),
444
464
  ('read_only', True),
445
- ('size', self.new_volume.size),
446
- ('name', self.new_volume.name),
465
+ ('size', self.volume.size),
466
+ ('name', self.volume.name),
447
467
  ]
448
468
 
449
469
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
450
470
 
451
471
  columns, data = self.cmd.take_action(parsed_args)
452
472
 
453
- self.volumes_mock.create.assert_called_with(
454
- size=self.new_volume.size,
473
+ self.volume_sdk_client.create_volume.assert_called_with(
474
+ size=self.volume.size,
455
475
  snapshot_id=None,
456
- name=self.new_volume.name,
476
+ name=self.volume.name,
457
477
  description=None,
458
478
  volume_type=None,
459
479
  availability_zone=None,
460
480
  metadata=None,
461
- imageRef=None,
462
- source_volid=None,
463
- consistencygroup_id=None,
481
+ image_id=None,
482
+ source_volume_id=None,
483
+ consistency_group_id=None,
464
484
  scheduler_hints=None,
465
485
  backup_id=None,
466
486
  )
467
-
468
- self.assertEqual(self.columns, columns)
469
- self.assertCountEqual(self.datalist, data)
470
- self.volumes_mock.set_bootable.assert_called_with(
471
- self.new_volume.id, True
487
+ self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
488
+ self.volume, True
472
489
  )
473
- self.volumes_mock.update_readonly_flag.assert_called_with(
474
- self.new_volume.id, True
490
+ self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
491
+ self.volume, True
475
492
  )
476
493
 
494
+ self.assertEqual(self.columns, columns)
495
+ self.assertEqual(self.datalist, data)
496
+
477
497
  @mock.patch.object(utils, 'wait_for_status', return_value=True)
478
498
  def test_volume_create_with_nonbootable_and_readwrite(self, mock_wait):
479
499
  arglist = [
480
500
  '--non-bootable',
481
501
  '--read-write',
482
502
  '--size',
483
- str(self.new_volume.size),
484
- self.new_volume.name,
503
+ str(self.volume.size),
504
+ self.volume.name,
485
505
  ]
486
506
  verifylist = [
487
507
  ('bootable', False),
488
508
  ('read_only', False),
489
- ('size', self.new_volume.size),
490
- ('name', self.new_volume.name),
509
+ ('size', self.volume.size),
510
+ ('name', self.volume.name),
491
511
  ]
492
512
 
493
513
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
494
514
 
495
515
  columns, data = self.cmd.take_action(parsed_args)
496
516
 
497
- self.volumes_mock.create.assert_called_with(
498
- size=self.new_volume.size,
517
+ self.volume_sdk_client.create_volume.assert_called_with(
518
+ size=self.volume.size,
499
519
  snapshot_id=None,
500
- name=self.new_volume.name,
520
+ name=self.volume.name,
501
521
  description=None,
502
522
  volume_type=None,
503
523
  availability_zone=None,
504
524
  metadata=None,
505
- imageRef=None,
506
- source_volid=None,
507
- consistencygroup_id=None,
525
+ image_id=None,
526
+ source_volume_id=None,
527
+ consistency_group_id=None,
508
528
  scheduler_hints=None,
509
529
  backup_id=None,
510
530
  )
511
-
512
- self.assertEqual(self.columns, columns)
513
- self.assertCountEqual(self.datalist, data)
514
- self.volumes_mock.set_bootable.assert_called_with(
515
- self.new_volume.id, False
531
+ self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
532
+ self.volume, False
516
533
  )
517
- self.volumes_mock.update_readonly_flag.assert_called_with(
518
- self.new_volume.id, False
534
+ self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
535
+ self.volume, False
519
536
  )
520
537
 
538
+ self.assertEqual(self.columns, columns)
539
+ self.assertEqual(self.datalist, data)
540
+
521
541
  @mock.patch.object(volume.LOG, 'error')
522
542
  @mock.patch.object(utils, 'wait_for_status', return_value=True)
523
543
  def test_volume_create_with_bootable_and_readonly_fail(
524
544
  self, mock_wait, mock_error
525
545
  ):
526
- self.volumes_mock.set_bootable.side_effect = exceptions.CommandError()
527
-
528
- self.volumes_mock.update_readonly_flag.side_effect = (
529
- exceptions.CommandError()
546
+ self.volume_sdk_client.set_volume_bootable_status.side_effect = (
547
+ sdk_exceptions.NotFoundException('foo')
548
+ )
549
+ self.volume_sdk_client.set_volume_readonly.side_effect = (
550
+ sdk_exceptions.NotFoundException('foo')
530
551
  )
531
552
 
532
553
  arglist = [
533
554
  '--bootable',
534
555
  '--read-only',
535
556
  '--size',
536
- str(self.new_volume.size),
537
- self.new_volume.name,
557
+ str(self.volume.size),
558
+ self.volume.name,
538
559
  ]
539
560
  verifylist = [
540
561
  ('bootable', True),
541
562
  ('read_only', True),
542
- ('size', self.new_volume.size),
543
- ('name', self.new_volume.name),
563
+ ('size', self.volume.size),
564
+ ('name', self.volume.name),
544
565
  ]
545
566
 
546
567
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
547
568
 
548
569
  columns, data = self.cmd.take_action(parsed_args)
549
570
 
550
- self.volumes_mock.create.assert_called_with(
551
- size=self.new_volume.size,
571
+ self.volume_sdk_client.create_volume.assert_called_with(
572
+ size=self.volume.size,
552
573
  snapshot_id=None,
553
- name=self.new_volume.name,
574
+ name=self.volume.name,
554
575
  description=None,
555
576
  volume_type=None,
556
577
  availability_zone=None,
557
578
  metadata=None,
558
- imageRef=None,
559
- source_volid=None,
560
- consistencygroup_id=None,
579
+ image_id=None,
580
+ source_volume_id=None,
581
+ consistency_group_id=None,
561
582
  scheduler_hints=None,
562
583
  backup_id=None,
563
584
  )
585
+ self.volume_sdk_client.set_volume_bootable_status.assert_called_once_with(
586
+ self.volume, True
587
+ )
588
+ self.volume_sdk_client.set_volume_readonly.assert_called_once_with(
589
+ self.volume, True
590
+ )
564
591
 
565
592
  self.assertEqual(2, mock_error.call_count)
566
593
  self.assertEqual(self.columns, columns)
567
- self.assertCountEqual(self.datalist, data)
568
- self.volumes_mock.set_bootable.assert_called_with(
569
- self.new_volume.id, True
570
- )
571
- self.volumes_mock.update_readonly_flag.assert_called_with(
572
- self.new_volume.id, True
573
- )
594
+ self.assertEqual(self.datalist, data)
574
595
 
575
596
  @mock.patch.object(volume.LOG, 'error')
576
597
  @mock.patch.object(utils, 'wait_for_status', return_value=False)
577
598
  def test_volume_create_non_available_with_readonly(
578
- self,
579
- mock_wait,
580
- mock_error,
599
+ self, mock_wait, mock_error
581
600
  ):
582
601
  arglist = [
583
602
  '--non-bootable',
584
603
  '--read-only',
585
604
  '--size',
586
- str(self.new_volume.size),
587
- self.new_volume.name,
605
+ str(self.volume.size),
606
+ self.volume.name,
588
607
  ]
589
608
  verifylist = [
590
609
  ('bootable', False),
591
610
  ('read_only', True),
592
- ('size', self.new_volume.size),
593
- ('name', self.new_volume.name),
611
+ ('size', self.volume.size),
612
+ ('name', self.volume.name),
594
613
  ]
595
614
 
596
615
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
597
616
 
598
617
  columns, data = self.cmd.take_action(parsed_args)
599
618
 
600
- self.volumes_mock.create.assert_called_with(
601
- size=self.new_volume.size,
619
+ self.volume_sdk_client.create_volume.assert_called_with(
620
+ size=self.volume.size,
602
621
  snapshot_id=None,
603
- name=self.new_volume.name,
622
+ name=self.volume.name,
604
623
  description=None,
605
624
  volume_type=None,
606
625
  availability_zone=None,
607
626
  metadata=None,
608
- imageRef=None,
609
- source_volid=None,
610
- consistencygroup_id=None,
627
+ image_id=None,
628
+ source_volume_id=None,
629
+ consistency_group_id=None,
611
630
  scheduler_hints=None,
612
631
  backup_id=None,
613
632
  )
614
633
 
615
634
  self.assertEqual(2, mock_error.call_count)
616
635
  self.assertEqual(self.columns, columns)
617
- self.assertCountEqual(self.datalist, data)
636
+ self.assertEqual(self.datalist, data)
618
637
 
619
638
  def test_volume_create_without_size(self):
620
639
  arglist = [
621
- self.new_volume.name,
640
+ self.volume.name,
622
641
  ]
623
642
  verifylist = [
624
- ('name', self.new_volume.name),
643
+ ('name', self.volume.name),
625
644
  ]
626
645
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
627
646
 
@@ -638,15 +657,15 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
638
657
  '--snapshot',
639
658
  'source_snapshot',
640
659
  '--size',
641
- str(self.new_volume.size),
642
- self.new_volume.name,
660
+ str(self.volume.size),
661
+ self.volume.name,
643
662
  ]
644
663
  verifylist = [
645
664
  ('image', 'source_image'),
646
665
  ('source', 'source_volume'),
647
666
  ('snapshot', 'source_snapshot'),
648
- ('size', self.new_volume.size),
649
- ('name', self.new_volume.name),
667
+ ('size', self.volume.size),
668
+ ('name', self.volume.name),
650
669
  ]
651
670
 
652
671
  self.assertRaises(
@@ -665,7 +684,7 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
665
684
  """
666
685
  arglist = [
667
686
  '--size',
668
- str(self.new_volume.size),
687
+ str(self.volume.size),
669
688
  '--hint',
670
689
  'k=v',
671
690
  '--hint',
@@ -680,10 +699,10 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
680
699
  'local_to_instance=v6',
681
700
  '--hint',
682
701
  'different_host=v7',
683
- self.new_volume.name,
702
+ self.volume.name,
684
703
  ]
685
704
  verifylist = [
686
- ('size', self.new_volume.size),
705
+ ('size', self.volume.size),
687
706
  (
688
707
  'hint',
689
708
  {
@@ -693,26 +712,23 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
693
712
  'different_host': ['v5', 'v7'],
694
713
  },
695
714
  ),
696
- ('name', self.new_volume.name),
715
+ ('name', self.volume.name),
697
716
  ]
698
717
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
699
718
 
700
- # In base command class ShowOne in cliff, abstract method take_action()
701
- # returns a two-part tuple with a tuple of column names and a tuple of
702
- # data to be shown.
703
719
  columns, data = self.cmd.take_action(parsed_args)
704
720
 
705
- self.volumes_mock.create.assert_called_with(
706
- size=self.new_volume.size,
721
+ self.volume_sdk_client.create_volume.assert_called_with(
722
+ size=self.volume.size,
707
723
  snapshot_id=None,
708
- name=self.new_volume.name,
724
+ name=self.volume.name,
709
725
  description=None,
710
726
  volume_type=None,
711
727
  availability_zone=None,
712
728
  metadata=None,
713
- imageRef=None,
714
- source_volid=None,
715
- consistencygroup_id=None,
729
+ image_id=None,
730
+ source_volume_id=None,
731
+ consistency_group_id=None,
716
732
  scheduler_hints={
717
733
  'k': 'v2',
718
734
  'same_host': ['v3', 'v4'],
@@ -723,102 +739,22 @@ class TestVolumeCreateLegacy(volume_fakes.TestVolume):
723
739
  )
724
740
 
725
741
  self.assertEqual(self.columns, columns)
726
- self.assertCountEqual(self.datalist, data)
727
-
728
-
729
- class TestVolumeCreate(volume_fakes.TestVolume):
730
- columns = (
731
- 'attachments',
732
- 'availability_zone',
733
- 'consistency_group_id',
734
- 'created_at',
735
- 'description',
736
- 'extended_replication_status',
737
- 'group_id',
738
- 'host',
739
- 'id',
740
- 'image_id',
741
- 'is_bootable',
742
- 'is_encrypted',
743
- 'is_multiattach',
744
- 'location',
745
- 'metadata',
746
- 'migration_id',
747
- 'migration_status',
748
- 'name',
749
- 'project_id',
750
- 'provider_id',
751
- 'replication_driver_data',
752
- 'replication_status',
753
- 'scheduler_hints',
754
- 'size',
755
- 'snapshot_id',
756
- 'source_volume_id',
757
- 'status',
758
- 'updated_at',
759
- 'user_id',
760
- 'volume_image_metadata',
761
- 'volume_type',
762
- )
763
-
764
- def setUp(self):
765
- super().setUp()
766
-
767
- self.new_volume = sdk_fakes.generate_fake_resource(
768
- _volume.Volume, **{'size': 1}
769
- )
770
-
771
- self.datalist = (
772
- self.new_volume.attachments,
773
- self.new_volume.availability_zone,
774
- self.new_volume.consistency_group_id,
775
- self.new_volume.created_at,
776
- self.new_volume.description,
777
- self.new_volume.extended_replication_status,
778
- self.new_volume.group_id,
779
- self.new_volume.host,
780
- self.new_volume.id,
781
- self.new_volume.image_id,
782
- self.new_volume.is_bootable,
783
- self.new_volume.is_encrypted,
784
- self.new_volume.is_multiattach,
785
- self.new_volume.location,
786
- self.new_volume.metadata,
787
- self.new_volume.migration_id,
788
- self.new_volume.migration_status,
789
- self.new_volume.name,
790
- self.new_volume.project_id,
791
- self.new_volume.provider_id,
792
- self.new_volume.replication_driver_data,
793
- self.new_volume.replication_status,
794
- self.new_volume.scheduler_hints,
795
- self.new_volume.size,
796
- self.new_volume.snapshot_id,
797
- self.new_volume.source_volume_id,
798
- self.new_volume.status,
799
- self.new_volume.updated_at,
800
- self.new_volume.user_id,
801
- self.new_volume.volume_image_metadata,
802
- self.new_volume.volume_type,
803
- )
804
-
805
- # Get the command object to test
806
- self.cmd = volume.CreateVolume(self.app, None)
742
+ self.assertEqual(self.datalist, data)
807
743
 
808
744
  def test_volume_create_remote_source(self):
809
- self.volume_sdk_client.manage_volume.return_value = self.new_volume
745
+ self.volume_sdk_client.manage_volume.return_value = self.volume
810
746
 
811
747
  arglist = [
812
748
  '--remote-source',
813
749
  'key=val',
814
750
  '--host',
815
751
  'fake_host',
816
- self.new_volume.name,
752
+ self.volume.name,
817
753
  ]
818
754
  verifylist = [
819
755
  ('remote_source', {'key': 'val'}),
820
756
  ('host', 'fake_host'),
821
- ('name', self.new_volume.name),
757
+ ('name', self.volume.name),
822
758
  ]
823
759
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
824
760
 
@@ -837,7 +773,7 @@ class TestVolumeCreate(volume_fakes.TestVolume):
837
773
  )
838
774
 
839
775
  self.assertEqual(self.columns, columns)
840
- self.assertCountEqual(self.datalist, data)
776
+ self.assertEqual(self.datalist, data)
841
777
 
842
778
  def test_volume_create_remote_source_pre_v316(self):
843
779
  self.set_volume_api_version('3.15')
@@ -846,12 +782,12 @@ class TestVolumeCreate(volume_fakes.TestVolume):
846
782
  'key=val',
847
783
  '--cluster',
848
784
  'fake_cluster',
849
- self.new_volume.name,
785
+ self.volume.name,
850
786
  ]
851
787
  verifylist = [
852
788
  ('remote_source', {'key': 'val'}),
853
789
  ('cluster', 'fake_cluster'),
854
- ('name', self.new_volume.name),
790
+ ('name', self.volume.name),
855
791
  ]
856
792
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
857
793
 
@@ -871,13 +807,13 @@ class TestVolumeCreate(volume_fakes.TestVolume):
871
807
  'fake_host',
872
808
  '--cluster',
873
809
  'fake_cluster',
874
- self.new_volume.name,
810
+ self.volume.name,
875
811
  ]
876
812
  verifylist = [
877
813
  ('remote_source', {'key': 'val'}),
878
814
  ('host', 'fake_host'),
879
815
  ('cluster', 'fake_cluster'),
880
- ('name', self.new_volume.name),
816
+ ('name', self.volume.name),
881
817
  ]
882
818
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
883
819
 
@@ -892,11 +828,11 @@ class TestVolumeCreate(volume_fakes.TestVolume):
892
828
  arglist = [
893
829
  '--remote-source',
894
830
  'key=val',
895
- self.new_volume.name,
831
+ self.volume.name,
896
832
  ]
897
833
  verifylist = [
898
834
  ('remote_source', {'key': 'val'}),
899
- ('name', self.new_volume.name),
835
+ ('name', self.volume.name),
900
836
  ]
901
837
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
902
838
 
@@ -910,15 +846,15 @@ class TestVolumeCreate(volume_fakes.TestVolume):
910
846
  def test_volume_create_remote_source_size(self):
911
847
  arglist = [
912
848
  '--size',
913
- str(self.new_volume.size),
849
+ str(self.volume.size),
914
850
  '--remote-source',
915
851
  'key=val',
916
- self.new_volume.name,
852
+ self.volume.name,
917
853
  ]
918
854
  verifylist = [
919
- ('size', self.new_volume.size),
855
+ ('size', self.volume.size),
920
856
  ('remote_source', {'key': 'val'}),
921
- ('name', self.new_volume.name),
857
+ ('name', self.volume.name),
922
858
  ]
923
859
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
924
860
 
@@ -934,15 +870,15 @@ class TestVolumeCreate(volume_fakes.TestVolume):
934
870
  def test_volume_create_host_no_remote_source(self):
935
871
  arglist = [
936
872
  '--size',
937
- str(self.new_volume.size),
873
+ str(self.volume.size),
938
874
  '--host',
939
875
  'fake_host',
940
- self.new_volume.name,
876
+ self.volume.name,
941
877
  ]
942
878
  verifylist = [
943
- ('size', self.new_volume.size),
879
+ ('size', self.volume.size),
944
880
  ('host', 'fake_host'),
945
- ('name', self.new_volume.name),
881
+ ('name', self.volume.name),
946
882
  ]
947
883
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
948
884
 
@@ -1239,6 +1175,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1239
1175
  'user_id': None,
1240
1176
  'name': None,
1241
1177
  'status': None,
1178
+ 'metadata': None,
1242
1179
  }
1243
1180
  self.volumes_mock.list.assert_called_once_with(
1244
1181
  search_opts=search_opts,
@@ -1282,6 +1219,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1282
1219
  'user_id': None,
1283
1220
  'name': None,
1284
1221
  'status': None,
1222
+ 'metadata': None,
1285
1223
  }
1286
1224
  self.volumes_mock.list.assert_called_once_with(
1287
1225
  search_opts=search_opts,
@@ -1328,6 +1266,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1328
1266
  'user_id': None,
1329
1267
  'name': None,
1330
1268
  'status': None,
1269
+ 'metadata': None,
1331
1270
  }
1332
1271
  self.volumes_mock.list.assert_called_once_with(
1333
1272
  search_opts=search_opts,
@@ -1371,6 +1310,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1371
1310
  'user_id': self.user.id,
1372
1311
  'name': None,
1373
1312
  'status': None,
1313
+ 'metadata': None,
1374
1314
  }
1375
1315
  self.volumes_mock.list.assert_called_once_with(
1376
1316
  search_opts=search_opts,
@@ -1416,6 +1356,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1416
1356
  'user_id': self.user.id,
1417
1357
  'name': None,
1418
1358
  'status': None,
1359
+ 'metadata': None,
1419
1360
  }
1420
1361
  self.volumes_mock.list.assert_called_once_with(
1421
1362
  search_opts=search_opts,
@@ -1459,6 +1400,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1459
1400
  'user_id': None,
1460
1401
  'name': self.mock_volume.name,
1461
1402
  'status': None,
1403
+ 'metadata': None,
1462
1404
  }
1463
1405
  self.volumes_mock.list.assert_called_once_with(
1464
1406
  search_opts=search_opts,
@@ -1502,6 +1444,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1502
1444
  'user_id': None,
1503
1445
  'name': None,
1504
1446
  'status': self.mock_volume.status,
1447
+ 'metadata': None,
1505
1448
  }
1506
1449
  self.volumes_mock.list.assert_called_once_with(
1507
1450
  search_opts=search_opts,
@@ -1544,6 +1487,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1544
1487
  'user_id': None,
1545
1488
  'name': None,
1546
1489
  'status': None,
1490
+ 'metadata': None,
1547
1491
  }
1548
1492
  self.volumes_mock.list.assert_called_once_with(
1549
1493
  search_opts=search_opts,
@@ -1587,6 +1531,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1587
1531
  'user_id': None,
1588
1532
  'name': None,
1589
1533
  'status': None,
1534
+ 'metadata': None,
1590
1535
  }
1591
1536
  self.volumes_mock.list.assert_called_once_with(
1592
1537
  search_opts=search_opts,
@@ -1660,6 +1605,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1660
1605
  'user_id': None,
1661
1606
  'name': None,
1662
1607
  'all_tenants': False,
1608
+ 'metadata': None,
1663
1609
  },
1664
1610
  )
1665
1611
  self.assertCountEqual(datalist, tuple(data))
@@ -1704,6 +1650,7 @@ class TestVolumeList(volume_fakes.TestVolume):
1704
1650
  'user_id': None,
1705
1651
  'name': None,
1706
1652
  'status': None,
1653
+ 'metadata': None,
1707
1654
  }
1708
1655
  self.volumes_mock.list.assert_called_once_with(
1709
1656
  search_opts=search_opts,
@@ -1719,71 +1666,79 @@ class TestVolumeList(volume_fakes.TestVolume):
1719
1666
 
1720
1667
 
1721
1668
  class TestVolumeMigrate(volume_fakes.TestVolume):
1722
- _volume = volume_fakes.create_one_volume()
1723
-
1724
1669
  def setUp(self):
1725
1670
  super().setUp()
1726
1671
 
1727
- self.volumes_mock = self.volume_client.volumes
1728
- self.volumes_mock.reset_mock()
1672
+ self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
1673
+ self.volume_sdk_client.find_volume.return_value = self.volume
1674
+ self.volume_sdk_client.migrate_volume.return_value = None
1729
1675
 
1730
- self.volumes_mock.get.return_value = self._volume
1731
- self.volumes_mock.migrate_volume.return_value = None
1732
- # Get the command object to test
1733
1676
  self.cmd = volume.MigrateVolume(self.app, None)
1734
1677
 
1735
1678
  def test_volume_migrate(self):
1736
1679
  arglist = [
1737
1680
  "--host",
1738
1681
  "host@backend-name#pool",
1739
- self._volume.id,
1682
+ self.volume.id,
1740
1683
  ]
1741
1684
  verifylist = [
1742
1685
  ("force_host_copy", False),
1743
1686
  ("lock_volume", False),
1744
1687
  ("host", "host@backend-name#pool"),
1745
- ("volume", self._volume.id),
1688
+ ("volume", self.volume.id),
1746
1689
  ]
1747
1690
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1748
1691
 
1749
1692
  result = self.cmd.take_action(parsed_args)
1750
- self.volumes_mock.get.assert_called_once_with(self._volume.id)
1751
- self.volumes_mock.migrate_volume.assert_called_once_with(
1752
- self._volume.id, "host@backend-name#pool", False, False
1753
- )
1754
1693
  self.assertIsNone(result)
1755
1694
 
1695
+ self.volume_sdk_client.find_volume.assert_called_with(
1696
+ self.volume.id, ignore_missing=False
1697
+ )
1698
+ self.volume_sdk_client.migrate_volume.assert_called_once_with(
1699
+ self.volume.id,
1700
+ host="host@backend-name#pool",
1701
+ force_host_copy=False,
1702
+ lock_volume=False,
1703
+ )
1704
+
1756
1705
  def test_volume_migrate_with_option(self):
1757
1706
  arglist = [
1758
1707
  "--force-host-copy",
1759
1708
  "--lock-volume",
1760
1709
  "--host",
1761
1710
  "host@backend-name#pool",
1762
- self._volume.id,
1711
+ self.volume.id,
1763
1712
  ]
1764
1713
  verifylist = [
1765
1714
  ("force_host_copy", True),
1766
1715
  ("lock_volume", True),
1767
1716
  ("host", "host@backend-name#pool"),
1768
- ("volume", self._volume.id),
1717
+ ("volume", self.volume.id),
1769
1718
  ]
1770
1719
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1771
1720
 
1772
1721
  result = self.cmd.take_action(parsed_args)
1773
- self.volumes_mock.get.assert_called_once_with(self._volume.id)
1774
- self.volumes_mock.migrate_volume.assert_called_once_with(
1775
- self._volume.id, "host@backend-name#pool", True, True
1776
- )
1777
1722
  self.assertIsNone(result)
1778
1723
 
1724
+ self.volume_sdk_client.find_volume.assert_called_with(
1725
+ self.volume.id, ignore_missing=False
1726
+ )
1727
+ self.volume_sdk_client.migrate_volume.assert_called_once_with(
1728
+ self.volume.id,
1729
+ host="host@backend-name#pool",
1730
+ force_host_copy=True,
1731
+ lock_volume=True,
1732
+ )
1733
+
1779
1734
  def test_volume_migrate_without_host(self):
1780
1735
  arglist = [
1781
- self._volume.id,
1736
+ self.volume.id,
1782
1737
  ]
1783
1738
  verifylist = [
1784
1739
  ("force_host_copy", False),
1785
1740
  ("lock_volume", False),
1786
- ("volume", self._volume.id),
1741
+ ("volume", self.volume.id),
1787
1742
  ]
1788
1743
 
1789
1744
  self.assertRaises(
@@ -1794,6 +1749,9 @@ class TestVolumeMigrate(volume_fakes.TestVolume):
1794
1749
  verifylist,
1795
1750
  )
1796
1751
 
1752
+ self.volume_sdk_client.find_volume.assert_not_called()
1753
+ self.volume_sdk_client.migrate_volume.assert_not_called()
1754
+
1797
1755
 
1798
1756
  class TestVolumeSet(volume_fakes.TestVolume):
1799
1757
  volume_type = volume_fakes.create_one_volume_type()
@@ -2047,41 +2005,91 @@ class TestVolumeShow(volume_fakes.TestVolume):
2047
2005
  def setUp(self):
2048
2006
  super().setUp()
2049
2007
 
2050
- self.volumes_mock = self.volume_client.volumes
2051
- self.volumes_mock.reset_mock()
2008
+ self.volume = sdk_fakes.generate_fake_resource(_volume.Volume)
2009
+ self.volume_sdk_client.find_volume.return_value = self.volume
2010
+
2011
+ self.columns = (
2012
+ 'attachments',
2013
+ 'availability_zone',
2014
+ 'bootable',
2015
+ 'cluster_name',
2016
+ 'consistencygroup_id',
2017
+ 'consumes_quota',
2018
+ 'created_at',
2019
+ 'description',
2020
+ 'encrypted',
2021
+ 'encryption_key_id',
2022
+ 'group_id',
2023
+ 'id',
2024
+ 'multiattach',
2025
+ 'name',
2026
+ 'os-vol-host-attr:host',
2027
+ 'os-vol-mig-status-attr:migstat',
2028
+ 'os-vol-mig-status-attr:name_id',
2029
+ 'os-vol-tenant-attr:tenant_id',
2030
+ 'properties',
2031
+ 'provider_id',
2032
+ 'replication_status',
2033
+ 'service_uuid',
2034
+ 'shared_targets',
2035
+ 'size',
2036
+ 'snapshot_id',
2037
+ 'source_volid',
2038
+ 'status',
2039
+ 'type',
2040
+ 'updated_at',
2041
+ 'user_id',
2042
+ 'volume_image_metadata',
2043
+ 'volume_type_id',
2044
+ )
2045
+ self.data = (
2046
+ self.volume.attachments,
2047
+ self.volume.availability_zone,
2048
+ self.volume.is_bootable,
2049
+ self.volume.cluster_name,
2050
+ self.volume.consistency_group_id,
2051
+ self.volume.consumes_quota,
2052
+ self.volume.created_at,
2053
+ self.volume.description,
2054
+ self.volume.is_encrypted,
2055
+ self.volume.encryption_key_id,
2056
+ self.volume.group_id,
2057
+ self.volume.id,
2058
+ self.volume.is_multiattach,
2059
+ self.volume.name,
2060
+ self.volume.host,
2061
+ self.volume.migration_status,
2062
+ self.volume.migration_id,
2063
+ self.volume.project_id,
2064
+ format_columns.DictColumn(self.volume.metadata),
2065
+ self.volume.provider_id,
2066
+ self.volume.replication_status,
2067
+ self.volume.service_uuid,
2068
+ self.volume.shared_targets,
2069
+ self.volume.size,
2070
+ self.volume.snapshot_id,
2071
+ self.volume.source_volume_id,
2072
+ self.volume.status,
2073
+ self.volume.volume_type,
2074
+ self.volume.updated_at,
2075
+ self.volume.user_id,
2076
+ self.volume.volume_image_metadata,
2077
+ self.volume.volume_type_id,
2078
+ )
2052
2079
 
2053
- self._volume = volume_fakes.create_one_volume()
2054
- self.volumes_mock.get.return_value = self._volume
2055
- # Get the command object to test
2056
2080
  self.cmd = volume.ShowVolume(self.app, None)
2057
2081
 
2058
2082
  def test_volume_show(self):
2059
- arglist = [self._volume.id]
2060
- verifylist = [("volume", self._volume.id)]
2083
+ arglist = [self.volume.id]
2084
+ verifylist = [("volume", self.volume.id)]
2061
2085
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
2062
2086
 
2063
2087
  columns, data = self.cmd.take_action(parsed_args)
2064
- self.volumes_mock.get.assert_called_with(self._volume.id)
2065
2088
 
2066
- self.assertEqual(
2067
- tuple(sorted(self._volume.keys())),
2068
- columns,
2069
- )
2070
- self.assertTupleEqual(
2071
- (
2072
- self._volume.attachments,
2073
- self._volume.availability_zone,
2074
- self._volume.bootable,
2075
- self._volume.description,
2076
- self._volume.id,
2077
- self._volume.name,
2078
- format_columns.DictColumn(self._volume.metadata),
2079
- self._volume.size,
2080
- self._volume.snapshot_id,
2081
- self._volume.status,
2082
- self._volume.volume_type,
2083
- ),
2084
- data,
2089
+ self.assertEqual(self.columns, columns)
2090
+ self.assertEqual(self.data, data)
2091
+ self.volume_sdk_client.find_volume.assert_called_with(
2092
+ self.volume.id, ignore_missing=False
2085
2093
  )
2086
2094
 
2087
2095
 
@@ -2327,29 +2335,45 @@ class TestVolumeRevertToSnapshot(volume_fakes.TestVolume):
2327
2335
 
2328
2336
  class TestColumns(volume_fakes.TestVolume):
2329
2337
  def test_attachments_column_without_server_cache(self):
2330
- _volume = volume_fakes.create_one_volume()
2331
- server_id = _volume.attachments[0]['server_id']
2332
- device = _volume.attachments[0]['device']
2338
+ vol = sdk_fakes.generate_fake_resource(
2339
+ _volume.Volume,
2340
+ attachments=[
2341
+ {
2342
+ 'device': '/dev/' + uuid.uuid4().hex,
2343
+ 'server_id': uuid.uuid4().hex,
2344
+ },
2345
+ ],
2346
+ )
2347
+ server_id = vol.attachments[0]['server_id']
2348
+ device = vol.attachments[0]['device']
2333
2349
 
2334
- col = volume.AttachmentsColumn(_volume.attachments, {})
2350
+ col = volume.AttachmentsColumn(vol.attachments, {})
2335
2351
  self.assertEqual(
2336
2352
  f'Attached to {server_id} on {device} ',
2337
2353
  col.human_readable(),
2338
2354
  )
2339
- self.assertEqual(_volume.attachments, col.machine_readable())
2355
+ self.assertEqual(vol.attachments, col.machine_readable())
2340
2356
 
2341
2357
  def test_attachments_column_with_server_cache(self):
2342
- _volume = volume_fakes.create_one_volume()
2358
+ vol = sdk_fakes.generate_fake_resource(
2359
+ _volume.Volume,
2360
+ attachments=[
2361
+ {
2362
+ 'device': '/dev/' + uuid.uuid4().hex,
2363
+ 'server_id': uuid.uuid4().hex,
2364
+ },
2365
+ ],
2366
+ )
2343
2367
 
2344
- server_id = _volume.attachments[0]['server_id']
2345
- device = _volume.attachments[0]['device']
2368
+ server_id = vol.attachments[0]['server_id']
2369
+ device = vol.attachments[0]['device']
2346
2370
  fake_server = mock.Mock()
2347
2371
  fake_server.name = 'fake-server-name'
2348
2372
  server_cache = {server_id: fake_server}
2349
2373
 
2350
- col = volume.AttachmentsColumn(_volume.attachments, server_cache)
2374
+ col = volume.AttachmentsColumn(vol.attachments, server_cache)
2351
2375
  self.assertEqual(
2352
2376
  'Attached to {} on {} '.format('fake-server-name', device),
2353
2377
  col.human_readable(),
2354
2378
  )
2355
- self.assertEqual(_volume.attachments, col.machine_readable())
2379
+ self.assertEqual(vol.attachments, col.machine_readable())