@@ -94,6 +94,12 @@ def router(self):
9494 return rpc .ClientRouter (default_client )
9595
9696
97+ # placeholder used as a default parameter value to distinguish between the case
98+ # when the parameter is specified by the caller with None from the case when it
99+ # was not specified
100+ NOT_SPECIFIED = object ()
101+
102+
97103class InstanceHelperMixin :
98104
99105 def _wait_for_server_parameter (
@@ -493,12 +499,42 @@ def _unshelve_server(self, server, expected_state='ACTIVE'):
493499 self .api .post_server_action (server ['id' ], {'unshelve' : {}})
494500 return self ._wait_for_state_change (server , expected_state )
495501
496- def _evacuate_server (self , server , host , expected_state = 'ACTIVE' ):
502+ def _evacuate_server (
503+ self , server , extra_post_args = None , expected_host = None ,
504+ expected_state = 'ACTIVE' , expected_task_state = NOT_SPECIFIED ,
505+ expected_migration_status = 'done' ):
497506 """Evacuate a server."""
498- self .api .post_server_action (server ['id' ], {'evacuate' : {}})
499- self ._wait_for_server_parameter (
500- self .server , {'OS-EXT-SRV-ATTR:host' : host ,
501- 'status' : expected_state })
507+ api = getattr (self , 'admin_api' , self .api )
508+
509+ post = {'evacuate' : {}}
510+ if extra_post_args :
511+ post ['evacuate' ].update (extra_post_args )
512+
513+ expected_result = {'status' : expected_state }
514+ if expected_host :
515+ expected_result ['OS-EXT-SRV-ATTR:host' ] = expected_host
516+ if expected_task_state is not NOT_SPECIFIED :
517+ expected_result ['OS-EXT-STS:task_state' ] = expected_task_state
518+
519+ api .post_server_action (server ['id' ], post )
520+
521+ # NOTE(gibi): The order of waiting for the migration and returning
522+ # a fresh server from _wait_for_server_parameter is important as
523+ # the compute manager sets status of the instance before sets the
524+ # host and finally sets the migration status. So waiting for the
525+ # migration first makes the returned server object more consistent.
526+ self ._wait_for_migration_status (server , [expected_migration_status ])
527+ return self ._wait_for_server_parameter (server , expected_result )
528+
529+ def _start_server (self , server ):
530+ self .api .post_server_action (server ['id' ], {'os-start' : None })
531+ return self ._wait_for_state_change (server , 'ACTIVE' )
532+
533+ def _stop_server (self , server , wait_for_stop = True ):
534+ self .api .post_server_action (server ['id' ], {'os-stop' : None })
535+ if wait_for_stop :
536+ return self ._wait_for_state_change (server , 'SHUTOFF' )
537+ return server
502538
503539
504540class PlacementHelperMixin :
0 commit comments