@@ -43,6 +43,10 @@ def setUp(self):
4343 self .servers_mock = self .app .client_manager .compute .servers
4444 self .servers_mock .reset_mock ()
4545
46+ # Get a shortcut to the compute client volumeManager Mock
47+ self .servers_volumes_mock = self .app .client_manager .compute .volumes
48+ self .servers_volumes_mock .reset_mock ()
49+
4650 # Get a shortcut to the compute client FlavorManager Mock
4751 self .flavors_mock = self .app .client_manager .compute .flavors
4852 self .flavors_mock .reset_mock ()
@@ -457,6 +461,174 @@ def test_server_add_port_no_neutron(self):
457461 self .find_port .assert_not_called ()
458462
459463
464+ class TestServerVolume (TestServer ):
465+
466+ def setUp (self ):
467+ super (TestServerVolume , self ).setUp ()
468+
469+ self .volume = volume_fakes .FakeVolume .create_one_volume ()
470+ self .volumes_mock .get .return_value = self .volume
471+
472+ self .methods = {
473+ 'create_server_volume' : None ,
474+ }
475+
476+ # Get the command object to test
477+ self .cmd = server .AddServerVolume (self .app , None )
478+
479+ def test_server_add_volume (self ):
480+ servers = self .setup_servers_mock (count = 1 )
481+ arglist = [
482+ '--device' , '/dev/sdb' ,
483+ servers [0 ].id ,
484+ self .volume .id ,
485+ ]
486+ verifylist = [
487+ ('server' , servers [0 ].id ),
488+ ('volume' , self .volume .id ),
489+ ('device' , '/dev/sdb' ),
490+ ]
491+
492+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
493+
494+ result = self .cmd .take_action (parsed_args )
495+
496+ self .servers_volumes_mock .create_server_volume .assert_called_once_with (
497+ servers [0 ].id , self .volume .id , device = '/dev/sdb' )
498+ self .assertIsNone (result )
499+
500+
501+ class TestServerVolumeV279 (TestServerVolume ):
502+
503+ def test_server_add_volume_with_enable_delete_on_termination (self ):
504+ self .app .client_manager .compute .api_version = api_versions .APIVersion (
505+ '2.79' )
506+
507+ servers = self .setup_servers_mock (count = 1 )
508+ arglist = [
509+ '--enable-delete-on-termination' ,
510+ '--device' , '/dev/sdb' ,
511+ servers [0 ].id ,
512+ self .volume .id ,
513+ ]
514+
515+ verifylist = [
516+ ('server' , servers [0 ].id ),
517+ ('volume' , self .volume .id ),
518+ ('device' , '/dev/sdb' ),
519+ ('enable_delete_on_termination' , True ),
520+ ]
521+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
522+
523+ result = self .cmd .take_action (parsed_args )
524+
525+ self .servers_volumes_mock .create_server_volume .assert_called_once_with (
526+ servers [0 ].id , self .volume .id ,
527+ device = '/dev/sdb' , delete_on_termination = True )
528+ self .assertIsNone (result )
529+
530+ def test_server_add_volume_with_disable_delete_on_termination (self ):
531+ self .app .client_manager .compute .api_version = api_versions .APIVersion (
532+ '2.79' )
533+
534+ servers = self .setup_servers_mock (count = 1 )
535+ arglist = [
536+ '--disable-delete-on-termination' ,
537+ '--device' , '/dev/sdb' ,
538+ servers [0 ].id ,
539+ self .volume .id ,
540+ ]
541+
542+ verifylist = [
543+ ('server' , servers [0 ].id ),
544+ ('volume' , self .volume .id ),
545+ ('device' , '/dev/sdb' ),
546+ ('disable_delete_on_termination' , True ),
547+ ]
548+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
549+
550+ result = self .cmd .take_action (parsed_args )
551+
552+ self .servers_volumes_mock .create_server_volume .assert_called_once_with (
553+ servers [0 ].id , self .volume .id ,
554+ device = '/dev/sdb' , delete_on_termination = False )
555+ self .assertIsNone (result )
556+
557+ def test_server_add_volume_with_enable_delete_on_termination_pre_v279 (
558+ self ):
559+ self .app .client_manager .compute .api_version = api_versions .APIVersion (
560+ '2.78' )
561+
562+ servers = self .setup_servers_mock (count = 1 )
563+ arglist = [
564+ servers [0 ].id ,
565+ self .volume .id ,
566+ '--enable-delete-on-termination' ,
567+ ]
568+ verifylist = [
569+ ('server' , servers [0 ].id ),
570+ ('volume' , self .volume .id ),
571+ ('enable_delete_on_termination' , True ),
572+ ]
573+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
574+
575+ ex = self .assertRaises (exceptions .CommandError ,
576+ self .cmd .take_action ,
577+ parsed_args )
578+ self .assertIn ('--os-compute-api-version 2.79 or greater is required' ,
579+ str (ex ))
580+
581+ def test_server_add_volume_with_disable_delete_on_termination_pre_v279 (
582+ self ):
583+ self .app .client_manager .compute .api_version = api_versions .APIVersion (
584+ '2.78' )
585+
586+ servers = self .setup_servers_mock (count = 1 )
587+ arglist = [
588+ servers [0 ].id ,
589+ self .volume .id ,
590+ '--disable-delete-on-termination' ,
591+ ]
592+ verifylist = [
593+ ('server' , servers [0 ].id ),
594+ ('volume' , self .volume .id ),
595+ ('disable_delete_on_termination' , True ),
596+ ]
597+ parsed_args = self .check_parser (self .cmd , arglist , verifylist )
598+
599+ ex = self .assertRaises (exceptions .CommandError ,
600+ self .cmd .take_action ,
601+ parsed_args )
602+ self .assertIn ('--os-compute-api-version 2.79 or greater is required' ,
603+ str (ex ))
604+
605+ def test_server_add_volume_with_disable_and_enable_delete_on_termination (
606+ self ):
607+ self .app .client_manager .compute .api_version = api_versions .APIVersion (
608+ '2.79' )
609+
610+ servers = self .setup_servers_mock (count = 1 )
611+ arglist = [
612+ '--enable-delete-on-termination' ,
613+ '--disable-delete-on-termination' ,
614+ '--device' , '/dev/sdb' ,
615+ servers [0 ].id ,
616+ self .volume .id ,
617+ ]
618+
619+ verifylist = [
620+ ('server' , servers [0 ].id ),
621+ ('volume' , self .volume .id ),
622+ ('device' , '/dev/sdb' ),
623+ ('enable_delete_on_termination' , True ),
624+ ('disable_delete_on_termination' , True ),
625+ ]
626+ ex = self .assertRaises (utils .ParserException ,
627+ self .check_parser ,
628+ self .cmd , arglist , verifylist )
629+ self .assertIn ('Argument parse failed' , str (ex ))
630+
631+
460632class TestServerAddNetwork (TestServer ):
461633
462634 def setUp (self ):
0 commit comments