@@ -198,3 +198,232 @@ def test_volume_revert_to_snapshot(self):
198198 self .snapshot .id ,
199199 ignore_missing = False ,
200200 )
201+
202+
203+ class TestVolumeCreate (BaseVolumeTest ):
204+ columns = (
205+ 'attachments' ,
206+ 'availability_zone' ,
207+ 'consistency_group_id' ,
208+ 'created_at' ,
209+ 'description' ,
210+ 'extended_replication_status' ,
211+ 'group_id' ,
212+ 'host' ,
213+ 'id' ,
214+ 'image_id' ,
215+ 'is_bootable' ,
216+ 'is_encrypted' ,
217+ 'is_multiattach' ,
218+ 'location' ,
219+ 'metadata' ,
220+ 'migration_id' ,
221+ 'migration_status' ,
222+ 'name' ,
223+ 'project_id' ,
224+ 'provider_id' ,
225+ 'replication_driver_data' ,
226+ 'replication_status' ,
227+ 'scheduler_hints' ,
228+ 'size' ,
229+ 'snapshot_id' ,
230+ 'source_volume_id' ,
231+ 'status' ,
232+ 'updated_at' ,
233+ 'user_id' ,
234+ 'volume_image_metadata' ,
235+ 'volume_type' ,
236+ )
237+
238+ def setUp (self ):
239+ super ().setUp ()
240+
241+ self .new_volume = sdk_fakes .generate_fake_resource (
242+ _volume .Volume , ** {'size' : 1 }
243+ )
244+
245+ self .datalist = (
246+ self .new_volume .attachments ,
247+ self .new_volume .availability_zone ,
248+ self .new_volume .consistency_group_id ,
249+ self .new_volume .created_at ,
250+ self .new_volume .description ,
251+ self .new_volume .extended_replication_status ,
252+ self .new_volume .group_id ,
253+ self .new_volume .host ,
254+ self .new_volume .id ,
255+ self .new_volume .image_id ,
256+ self .new_volume .is_bootable ,
257+ self .new_volume .is_encrypted ,
258+ self .new_volume .is_multiattach ,
259+ self .new_volume .location ,
260+ self .new_volume .metadata ,
261+ self .new_volume .migration_id ,
262+ self .new_volume .migration_status ,
263+ self .new_volume .name ,
264+ self .new_volume .project_id ,
265+ self .new_volume .provider_id ,
266+ self .new_volume .replication_driver_data ,
267+ self .new_volume .replication_status ,
268+ self .new_volume .scheduler_hints ,
269+ self .new_volume .size ,
270+ self .new_volume .snapshot_id ,
271+ self .new_volume .source_volume_id ,
272+ self .new_volume .status ,
273+ self .new_volume .updated_at ,
274+ self .new_volume .user_id ,
275+ self .new_volume .volume_image_metadata ,
276+ self .new_volume .volume_type ,
277+ )
278+
279+ # Get the command object to test
280+ self .cmd = volume .CreateVolume (self .app , None )
281+
282+ def test_volume_create_remote_source (self ):
283+ self .volume_sdk_client .manage_volume .return_value = self .new_volume
284+
285+ arglist = [
286+ '--remote-source' ,
287+ 'key=val' ,
288+ '--host' ,
289+ 'fake_host' ,
290+ self .new_volume .name ,
291+ ]
292+ verifylist = [
293+ ('remote_source' , {'key' : 'val' }),
294+ ('host' , 'fake_host' ),
295+ ('name' , self .new_volume .name ),
296+ ]
297+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
298+
299+ columns , data = self .cmd .take_action (parsed_args )
300+
301+ self .volume_sdk_client .manage_volume .assert_called_with (
302+ host = 'fake_host' ,
303+ ref = {'key' : 'val' },
304+ name = parsed_args .name ,
305+ description = parsed_args .description ,
306+ volume_type = parsed_args .type ,
307+ availability_zone = parsed_args .availability_zone ,
308+ metadata = parsed_args .property ,
309+ bootable = parsed_args .bootable ,
310+ cluster = getattr (parsed_args , 'cluster' , None ),
311+ )
312+
313+ self .assertEqual (self .columns , columns )
314+ self .assertCountEqual (self .datalist , data )
315+
316+ def test_volume_create_remote_source_pre_316 (self ):
317+ self ._set_mock_microversion ('3.15' )
318+ arglist = [
319+ '--remote-source' ,
320+ 'key=val' ,
321+ '--cluster' ,
322+ 'fake_cluster' ,
323+ self .new_volume .name ,
324+ ]
325+ verifylist = [
326+ ('remote_source' , {'key' : 'val' }),
327+ ('cluster' , 'fake_cluster' ),
328+ ('name' , self .new_volume .name ),
329+ ]
330+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
331+
332+ exc = self .assertRaises (
333+ exceptions .CommandError , self .cmd .take_action , parsed_args
334+ )
335+ self .assertIn (
336+ '--os-volume-api-version 3.16 or greater is required' , str (exc )
337+ )
338+
339+ def test_volume_create_remote_source_host_and_cluster (self ):
340+ self ._set_mock_microversion ('3.16' )
341+ arglist = [
342+ '--remote-source' ,
343+ 'key=val' ,
344+ '--host' ,
345+ 'fake_host' ,
346+ '--cluster' ,
347+ 'fake_cluster' ,
348+ self .new_volume .name ,
349+ ]
350+ verifylist = [
351+ ('remote_source' , {'key' : 'val' }),
352+ ('host' , 'fake_host' ),
353+ ('cluster' , 'fake_cluster' ),
354+ ('name' , self .new_volume .name ),
355+ ]
356+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
357+
358+ exc = self .assertRaises (
359+ exceptions .CommandError , self .cmd .take_action , parsed_args
360+ )
361+ self .assertIn (
362+ 'Only one of --host or --cluster needs to be specified' , str (exc )
363+ )
364+
365+ def test_volume_create_remote_source_no_host_or_cluster (self ):
366+ arglist = [
367+ '--remote-source' ,
368+ 'key=val' ,
369+ self .new_volume .name ,
370+ ]
371+ verifylist = [
372+ ('remote_source' , {'key' : 'val' }),
373+ ('name' , self .new_volume .name ),
374+ ]
375+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
376+
377+ exc = self .assertRaises (
378+ exceptions .CommandError , self .cmd .take_action , parsed_args
379+ )
380+ self .assertIn (
381+ 'One of --host or --cluster needs to be specified to ' , str (exc )
382+ )
383+
384+ def test_volume_create_remote_source_size (self ):
385+ arglist = [
386+ '--size' ,
387+ str (self .new_volume .size ),
388+ '--remote-source' ,
389+ 'key=val' ,
390+ self .new_volume .name ,
391+ ]
392+ verifylist = [
393+ ('size' , self .new_volume .size ),
394+ ('remote_source' , {'key' : 'val' }),
395+ ('name' , self .new_volume .name ),
396+ ]
397+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
398+
399+ exc = self .assertRaises (
400+ exceptions .CommandError , self .cmd .take_action , parsed_args
401+ )
402+ self .assertIn (
403+ '--size, --consistency-group, --hint, --read-only and '
404+ '--read-write options are not supported' ,
405+ str (exc ),
406+ )
407+
408+ def test_volume_create_host_no_remote_source (self ):
409+ arglist = [
410+ '--size' ,
411+ str (self .new_volume .size ),
412+ '--host' ,
413+ 'fake_host' ,
414+ self .new_volume .name ,
415+ ]
416+ verifylist = [
417+ ('size' , self .new_volume .size ),
418+ ('host' , 'fake_host' ),
419+ ('name' , self .new_volume .name ),
420+ ]
421+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
422+
423+ exc = self .assertRaises (
424+ exceptions .CommandError , self .cmd .take_action , parsed_args
425+ )
426+ self .assertIn (
427+ '--host and --cluster options are only supported ' ,
428+ str (exc ),
429+ )
0 commit comments