@@ -94,6 +94,12 @@ def router(self):
94
94
return rpc .ClientRouter (default_client )
95
95
96
96
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
+
97
103
class InstanceHelperMixin :
98
104
99
105
def _wait_for_server_parameter (
@@ -493,12 +499,42 @@ def _unshelve_server(self, server, expected_state='ACTIVE'):
493
499
self .api .post_server_action (server ['id' ], {'unshelve' : {}})
494
500
return self ._wait_for_state_change (server , expected_state )
495
501
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' ):
497
506
"""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
502
538
503
539
504
540
class PlacementHelperMixin :
0 commit comments