private function onHostDown(\Scalr_Messaging_Msg $message, DBServer $dbserver)
{
// If insatnce is already SUSPENDED or TERMINATED it means that hostdown was already processed by CloudPoller
// and no need to process it again
if (in_array($dbserver->status, array(\SERVER_STATUS::SUSPENDED, \SERVER_STATUS::TERMINATED))) {
return true;
}
$isStopping = false;
$isRebooting = false;
$p = PlatformFactory::NewPlatform($dbserver->platform);
$status = $p->GetServerRealStatus($dbserver);
if ($dbserver->isOpenstack()) {
$status = $p->GetServerRealStatus($dbserver);
if (stristr($status->getName(), 'REBOOT') || stristr($status->getName(), 'HARD_REBOOT')) {
//Hard reboot
$isRebooting = true;
} elseif ($status->isRunning()) {
// Soft reboot
$isRebooting = true;
} elseif (!$status->isTerminated()) {
$isStopping = true;
}
} elseif ($dbserver->platform == \SERVER_PLATFORMS::GCE) {
if ($status->getName() == 'STOPPING') {
// We don't know is this shutdown or stop so let's ignore HostDown
// and wait for status change
return false;
} elseif ($status->getName() == 'RUNNING') {
$isRebooting = true;
} elseif ($status->isSuspended() && $dbserver->status != \SERVER_STATUS::PENDING_TERMINATE) {
$isStopping = true;
}
} else {
if ($status->isRunning()) {
$isRebooting = true;
} elseif (!$status->isTerminated()) {
$isStopping = true;
}
}
if ($isStopping) {
$event = new HostDownEvent($dbserver);
$event->isSuspended = true;
} elseif ($isRebooting) {
$event = new RebootBeginEvent($dbserver);
} else {
$event = false;
if ($dbserver->farmId) {
$wasHostDownFired = $this->db->GetOne("SELECT id FROM events WHERE event_server_id = ? AND type = ? AND is_suspend = '0'", array($dbserver->serverId, 'HostDown'));
//TODO:
if (!$wasHostDownFired) {
$event = new HostDownEvent($dbserver);
}
}
}
return $event;
}