@@ -4984,6 +4984,167 @@ def test_rebuild_with_key_name_and_unset(self):
49844984 self .cmd , arglist , verifylist )
49854985
49864986
4987+ class TestEvacuateServer (TestServer ):
4988+
4989+ def setUp (self ):
4990+ super (TestEvacuateServer , self ).setUp ()
4991+ # Return value for utils.find_resource for image
4992+ self .image = image_fakes .FakeImage .create_one_image ()
4993+ self .images_mock .get .return_value = self .image
4994+
4995+ # Fake the rebuilt new server.
4996+ attrs = {
4997+ 'image' : {
4998+ 'id' : self .image .id
4999+ },
5000+ 'networks' : {},
5001+ 'adminPass' : 'passw0rd' ,
5002+ }
5003+ new_server = compute_fakes .FakeServer .create_one_server (attrs = attrs )
5004+
5005+ # Fake the server to be rebuilt. The IDs of them should be the same.
5006+ attrs ['id' ] = new_server .id
5007+ methods = {
5008+ 'evacuate' : new_server ,
5009+ }
5010+ self .server = compute_fakes .FakeServer .create_one_server (
5011+ attrs = attrs ,
5012+ methods = methods
5013+ )
5014+
5015+ # Return value for utils.find_resource for server.
5016+ self .servers_mock .get .return_value = self .server
5017+
5018+ self .cmd = server .EvacuateServer (self .app , None )
5019+
5020+ def _test_evacuate (self , args , verify_args , evac_args ):
5021+ parsed_args = self .check_parser (self .cmd , args , verify_args )
5022+
5023+ # Get the command object to test
5024+ self .cmd .take_action (parsed_args )
5025+
5026+ self .servers_mock .get .assert_called_with (self .server .id )
5027+ self .server .evacuate .assert_called_with (** evac_args )
5028+
5029+ def test_evacuate (self ):
5030+ args = [
5031+ self .server .id ,
5032+ ]
5033+ verify_args = [
5034+ ('server' , self .server .id ),
5035+ ]
5036+ evac_args = {
5037+ 'host' : None , 'on_shared_storage' : False , 'password' : None ,
5038+ }
5039+ self ._test_evacuate (args , verify_args , evac_args )
5040+
5041+ def test_evacuate_with_password (self ):
5042+ args = [
5043+ self .server .id ,
5044+ '--password' , 'password' ,
5045+ ]
5046+ verify_args = [
5047+ ('server' , self .server .id ),
5048+ ('password' , 'password' ),
5049+ ]
5050+ evac_args = {
5051+ 'host' : None , 'on_shared_storage' : False , 'password' : 'password' ,
5052+ }
5053+ self ._test_evacuate (args , verify_args , evac_args )
5054+
5055+ def test_evacuate_with_host (self ):
5056+ self .app .client_manager .compute .api_version = \
5057+ api_versions .APIVersion ('2.29' )
5058+
5059+ host = 'target-host'
5060+ args = [
5061+ self .server .id ,
5062+ '--host' , 'target-host' ,
5063+ ]
5064+ verify_args = [
5065+ ('server' , self .server .id ),
5066+ ('host' , 'target-host' ),
5067+ ]
5068+ evac_args = {'host' : host , 'password' : None }
5069+
5070+ self ._test_evacuate (args , verify_args , evac_args )
5071+
5072+ def test_evacuate_with_host_pre_v229 (self ):
5073+ self .app .client_manager .compute .api_version = \
5074+ api_versions .APIVersion ('2.28' )
5075+
5076+ args = [
5077+ self .server .id ,
5078+ '--host' , 'target-host' ,
5079+ ]
5080+ verify_args = [
5081+ ('server' , self .server .id ),
5082+ ('host' , 'target-host' ),
5083+ ]
5084+ parsed_args = self .check_parser (self .cmd , args , verify_args )
5085+
5086+ self .assertRaises (
5087+ exceptions .CommandError ,
5088+ self .cmd .take_action ,
5089+ parsed_args )
5090+
5091+ def test_evacuate_without_share_storage (self ):
5092+ self .app .client_manager .compute .api_version = \
5093+ api_versions .APIVersion ('2.13' )
5094+
5095+ args = [
5096+ self .server .id ,
5097+ '--shared-storage'
5098+ ]
5099+ verify_args = [
5100+ ('server' , self .server .id ),
5101+ ('shared_storage' , True ),
5102+ ]
5103+ evac_args = {
5104+ 'host' : None , 'on_shared_storage' : True , 'password' : None ,
5105+ }
5106+ self ._test_evacuate (args , verify_args , evac_args )
5107+
5108+ def test_evacuate_without_share_storage_post_v213 (self ):
5109+ self .app .client_manager .compute .api_version = \
5110+ api_versions .APIVersion ('2.14' )
5111+
5112+ args = [
5113+ self .server .id ,
5114+ '--shared-storage'
5115+ ]
5116+ verify_args = [
5117+ ('server' , self .server .id ),
5118+ ('shared_storage' , True ),
5119+ ]
5120+ parsed_args = self .check_parser (self .cmd , args , verify_args )
5121+
5122+ self .assertRaises (
5123+ exceptions .CommandError ,
5124+ self .cmd .take_action ,
5125+ parsed_args )
5126+
5127+ @mock .patch .object (common_utils , 'wait_for_status' , return_value = True )
5128+ def test_evacuate_with_wait_ok (self , mock_wait_for_status ):
5129+ args = [
5130+ self .server .id ,
5131+ '--wait' ,
5132+ ]
5133+ verify_args = [
5134+ ('server' , self .server .id ),
5135+ ('wait' , True ),
5136+ ]
5137+ evac_args = {
5138+ 'host' : None , 'on_shared_storage' : False , 'password' : None ,
5139+ }
5140+ self ._test_evacuate (args , verify_args , evac_args )
5141+ mock_wait_for_status .assert_called_once_with (
5142+ self .servers_mock .get ,
5143+ self .server .id ,
5144+ callback = mock .ANY ,
5145+ )
5146+
5147+
49875148class TestServerRemoveFixedIP (TestServer ):
49885149
49895150 def setUp (self ):
0 commit comments