def test_waiting_for_status_completed( mocker, node, node_fqdn, state, delay, attempts, result_attempt): controller = mock.Mock() timeout_calls = [] check_instances_exist_side_effects = [] check_instances_exist_calls = [] for idx in range(1, min(attempts, result_attempt) + 1): if idx < result_attempt: timeout_calls.append(mock.call(delay)) check_instances_exist_side_effects.append(idx != result_attempt) check_instances_exist_calls.append( mock.call(controller, node_fqdn, state)) mock_patch_is_nova_state = mocker.patch( "octane.util.nova.do_nova_instances_exist", side_effect=check_instances_exist_side_effects) mock_sleep = mocker.patch("time.sleep") if result_attempt > attempts: with pytest.raises(nova.WaiterException): nova.waiting_for_status_completed( controller, node_fqdn, state, attempts, delay) else: nova.waiting_for_status_completed( controller, node_fqdn, state, attempts, delay) assert timeout_calls == mock_sleep.call_args_list assert check_instances_exist_calls == \ mock_patch_is_nova_state.call_args_list
def shutoff_vms(self): controller = env_util.get_one_controller(self.env) node_fqdn = node_util.get_nova_node_handle(self.node) if nova.do_nova_instances_exist(controller, node_fqdn, "ERROR"): raise Exception( "There are instances in ERROR state on {hostname}," "please fix this problem and start upgrade_node " "command again".format(hostname=node_fqdn)) for instance_id in nova.get_active_instances(controller, node_fqdn): nova.run_nova_cmd( ["nova", "stop", instance_id], controller, output=False) nova.waiting_for_status_completed(controller, node_fqdn, "ACTIVE")
def evacuate_host(self): controller = env_util.get_one_controller(self.env) enabled_computes, disabled_computes = nova.get_compute_lists( controller) node_fqdn = node_util.get_nova_node_handle(self.node) if [node_fqdn] == enabled_computes: raise Exception("You try to disable last enabled nova-compute " "service on {hostname} in cluster. " "This leads to disable host evacuation. " "Fix this problem and run unpgrade-node " "command again".format(hostname=node_fqdn)) if nova.do_nova_instances_exist(controller, node_fqdn, "ERROR"): raise Exception( "There are instances in ERROR state on {hostname}," "please fix this problem and start upgrade_node " "command again".format(hostname=node_fqdn)) if node_fqdn in disabled_computes: LOG.warn("Node {0} already disabled".format(node_fqdn)) else: nova.run_nova_cmd( ["nova", "service-disable", node_fqdn, "nova-compute"], controller, False) for instance_id in nova.get_active_instances(controller, node_fqdn): nova.run_nova_cmd( ["nova", "live-migration", instance_id], controller, False) nova.waiting_for_status_completed( controller, node_fqdn, "MIGRATING") if nova.do_nova_instances_exist(controller, node_fqdn): raise Exception( "There are instances on {hostname} after host-evacuation, " "please fix this problem and start upgrade_node " "command again".format(hostname=node_fqdn))