protected function execute($arguments = array(), $options = array()) { // Context $context = sfContext::createInstance(sfProjectConfiguration::getApplicationConfiguration('app', $options['env'], true)); // initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase($options['connection'])->getConnection(); // add your code here // server id $server = $arguments['server']; $this->log("[INFO] Start server with '{$server}'"); $etva_server = EtvaServerPeer::retrieveByPK($server); if (!$etva_server) { $etva_server = EtvaServerPeer::retrieveByUuid($server); } if (!$etva_server) { $etva_server = EtvaServerPeer::retrieveByName($server); } if (!$etva_server) { $msg_i18n = $context->getI18N()->__(EtvaServerPeer::_ERR_NOTFOUND_, array('name' => $server)); $error = array('success' => false, 'agent' => sfConfig::get('config_acronym'), 'error' => $msg_i18n, 'info' => $msg_i18n); $this->log("[ERROR] " . $error['error']); return $error; } else { if ($nid = $options['node']) { if (!($etva_node = EtvaNodePeer::retrieveByPK($nid))) { //notify event log $msg_i18n = Etva::makeNotifyLogMessage(sfConfig::get('config_acronym'), EtvaNodePeer::_ERR_NOTFOUND_ID_, array('id' => $nid), EtvaServerPeer::_ERR_START_, array('name' => $server)); $error = array('success' => false, 'agent' => sfConfig::get('config_acronym'), 'error' => $msg_i18n, 'info' => $msg_i18n); $this->log("[ERROR] " . $error['error']); return $error; } } else { // get list of nodes that server can assign $nodes_toassign = $etva_server->listNodesAssignTo(); if (count($nodes_toassign)) { $etva_node = $nodes_toassign[0]; // get first } else { //notify event log $msg_i18n = Etva::makeNotifyLogMessage(sfConfig::get('config_acronym'), EtvaServerPeer::_ERR_NO_NODE_TO_ASSIGN_, array(), EtvaServerPeer::_ERR_START_, array('name' => $server)); $error = array('success' => false, 'agent' => sfConfig::get('config_acronym'), 'error' => $msg_i18n, 'info' => $msg_i18n); $this->log("[ERROR] " . $error['error']); return $error; } } $server_va = new EtvaServer_VA($etva_server); if ($options['assign'] || $etva_server->getUnassigned()) { // Assign server to node $response = $server_va->send_assign($etva_node); if (!$response['success']) { $this->log("[ERROR] " . $response['error']); return $response; } } // start server $response = $server_va->send_start($etva_node); if ($response['success']) { // update GA Info $response_ga = $server_va->getGAInfo($etva_node); $this->log("[INFO] " . $response['response']); } else { $this->log("[ERROR] " . $response['error']); } return $response; } }
protected function execute($arguments = array(), $options = array()) { $context = sfContext::createInstance(sfProjectConfiguration::getApplicationConfiguration('app', $options['env'], true)); parent::execute($arguments, $options); // initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $con = $databaseManager->getDatabase($options['connection'])->getConnection(); // add your code here $this->log('[INFO] Checking Servers heartbeat...' . "\n"); $servers_timeout = EtvaServerQuery::create()->filterByVmState(EtvaServer::RUNNING)->filterByGaState(EtvaServerPeer::_GA_RUNNING_)->filterByHasha(1)->where('hbtimeout>0 AND UNIX_TIMESTAMP(heartbeat) < (UNIX_TIMESTAMP(now()) - hbtimeout)')->useEtvaServerAssignQuery('ServerAssign', 'RIGHT JOIN')->useEtvaNodeQuery()->filterByState(EtvaNode::NODE_ACTIVE)->endUse()->endUse()->find(); if (count($servers_timeout) > 0) { foreach ($servers_timeout as $etva_server) { $message = sprintf(' The server %s with id %s get heartbeat timed out (last heartbeat at %s and heartbeat timeout %s secods)', $etva_server->getName(), $etva_server->getId(), $etva_server->getHeartbeat(), $etva_server->getHbtimeout()); $this->log($message); // add log message Etva::makeNotifyLogMessage($this->name, $message); $etva_node = $etva_server->getEtvaNode(); $server_va = new EtvaServer_VA($etva_server); $response_ga = $etva_server->getGAInfo($etva_node); if (!$response_ga['success']) { $msg = sprintf(' Something wrong with node %s agent, can\'t get GA state of the server %s with id %s run.', $etva_node->getName(), $etva_server->getName(), $etva_server->getId()); $this->log($msg); // add log message Etva::makeNotifyLogMessage($this->name, $msg); $etva_server->setGaState(EtvaServerPeer::_GA_STOPPED_); // mark GA as stopped $etva_server->save(); } else { if ($reponse_ga['ga_state'] == EtvaServerPeer::_GA_RUNNING_) { $message_ga = sprintf(' But the explicit check GA state of the server %s with id %s run with success.', $etva_server->getName(), $etva_server->getId()); $this->log($message_ga); // add log message Etva::makeNotifyLogMessage($this->name, $message_ga, array(), null, array(), EtvaEventLogger::INFO); } else { // go restart $starttime = sfConfig::get('app_server_heartbeat_starttime'); $starttime_date = date("c", time() - $starttime); if ($etva_server->getHblaststart() && $etva_server->getHblaststart() > $starttime_date) { $msg = sprintf(' the server %s with id %s is in starttime.', $etva_server->getName(), $etva_server->getId()); $this->log($msg); // add log message Etva::makeNotifyLogMessage($this->name, $msg, array(), null, array(), EtvaEventLogger::INFO); } else { $last_nrestarts = $etva_server->getHbnrestarts(); if ($last_nrestarts >= sfConfig::get('app_server_heartbeat_number_of_restart')) { $msg = sprintf(' the server %s with id %s exceed number of restart.', $etva_server->getName(), $etva_server->getId()); $this->log($msg); // add log message Etva::makeNotifyLogMessage($this->name, $msg); } else { $msg = sprintf(' the server %s with id %s is heartbeat out of date and will be restart.', $etva_server->getName(), $etva_server->getId()); $this->log($msg); // add log message Etva::makeNotifyLogMessage($this->name, $msg, array(), null, array(), EtvaEventLogger::INFO); // force to stop $response_stop = $server_va->send_stop($etva_node, array('force' => 1, 'destroy' => 1)); sleep(5); // wait a few seconds $response_start = $server_va->send_start($etva_node); if (!$response_start['success']) { // start fail... sleep(10); // wait a few seconds $response_start = $server_va->send_start($etva_node); // start again } $etva_server->resetHeartbeat(EtvaServerPeer::_GA_STOPPED_); // reset heartbeat and mark GA as stopped $etva_server->setHbnrestarts($last_nrestarts + 1); // inc number of restart $etva_server->save(); } } } } } } else { $this->log("[INFO] No servers with heartbeat timed out."); } // log the message! $this->log("[INFO] The check servers heartbeat task ran!"); }
public function migrateAllServers(EtvaNode $etva_sparenode = null, $off = false, $ignoreAdmissionGate = false) { // migrate all servers // order by priority HA $querysrvs = EtvaServerQuery::create(); $querysrvs->orderByPriorityHa('desc'); $etva_servers = $this->etva_node->getEtvaServers($querysrvs); foreach ($etva_servers as $etva_server) { $server_va = new EtvaServer_VA($etva_server); $response = array(); $etva_tonode = $etva_sparenode; if (!$etva_tonode) { $list_nodes_toassign = $etva_server->listNodesAssignTo(true); if (count($list_nodes_toassign)) { $etva_tonode = $list_nodes_toassign[0]; } // get first } if ($etva_tonode) { if (!$off && $etva_server->getVmState() == 'running') { error_log("migrate server=" . $etva_server->getName() . " to node=" . $etva_tonode->getName()); $response = $server_va->send_migrate($this->etva_node, $etva_tonode); } else { error_log("move server=" . $etva_server->getName() . " to node=" . $etva_tonode->getName()); $response = $server_va->send_move($this->etva_node, $etva_tonode); // start it server is running or has autostart or has HA or has priority HA if ($off && ($etva_server->getVmState() == 'running' || $etva_server->getAutostart())) { // send start server $start_res = $server_va->send_start($etva_tonode, null, $ignoreAdmissionGate); } } if ($response['success']) { Etva::makeNotifyLogMessage($this->etva_node->getName(), sprintf('Server %s migrate ok', $etva_server->getName()), array(), null, array(), EtvaEventLogger::INFO); error_log(sprintf('Server %s migrate ok', $etva_server->getName())); } else { Etva::makeNotifyLogMessage($this->etva_node->getName(), sprintf('Server %s migrate nok', $etva_server->getName())); error_log(sprintf('Server %s migrate nok', $etva_server->getName())); } } else { Etva::makeNotifyLogMessage($this->etva_node->getName(), sprintf('Can\'t migrate server %s. No node free available.', $etva_server->getName())); error_log(sprintf('Can\'t migrate server %s. No node free available.', $etva_server->getName())); } } }
public function executeJsonStart(sfWebRequest $request) { $to_assign = false; if ($nid = $request->getParameter('nid')) { if (!($etva_node = EtvaNodePeer::retrieveByPK($nid))) { //notify event log $msg_i18n = Etva::makeNotifyLogMessage(sfConfig::get('config_acronym'), EtvaNodePeer::_ERR_NOTFOUND_ID_, array('id' => $nid), EtvaServerPeer::_ERR_START_, array('name' => $server)); $error = array('success' => false, 'agent' => sfConfig::get('config_acronym'), 'error' => $msg_i18n, 'info' => $msg_i18n); // if is a CLI soap request return json encoded data if (sfConfig::get('sf_environment') == 'soap') { return json_encode($error); } // if is browser request return text renderer $error = $this->setJsonError($error); return $this->renderText($error); } $server = $request->getParameter('server'); if (!($etva_server = $etva_node->retrieveServerByName($server))) { //notify event log $msg_i18n = Etva::makeNotifyLogMessage($etva_node->getName(), EtvaServerPeer::_ERR_NOTFOUND_, array('name' => $server), EtvaServerPeer::_ERR_START_, array('name' => $server)); $error = array('agent' => $etva_node->getName(), 'success' => false, 'error' => $msg_i18n); // if is a CLI soap request return json encoded data if (sfConfig::get('sf_environment') == 'soap') { return json_encode($error); } // if is browser request return text renderer $error = $this->setJsonError($error); return $this->renderText($error); } } else { if ($sid = $request->getParameter('sid')) { $etva_server = EtvaServerPeer::retrieveByPK($sid); } else { if ($server = $request->getParameter('server')) { $etva_server = EtvaServerPeer::retrieveByName($server); } } if (!$etva_server) { //notify event log $msg_i18n = Etva::makeNotifyLogMessage($etva_node->getName(), EtvaServerPeer::_ERR_NOTFOUND_, array('name' => $server), EtvaServerPeer::_ERR_START_, array('name' => $server)); $error = array('agent' => $etva_node->getName(), 'success' => false, 'error' => $msg_i18n); // if is a CLI soap request return json encoded data if (sfConfig::get('sf_environment') == 'soap') { return json_encode($error); } // if is browser request return text renderer $error = $this->setJsonError($error); return $this->renderText($error); } $nodes_toassign = $etva_server->listNodesAssignTo(); if (count($nodes_toassign)) { $etva_node = $nodes_toassign[0]; // get first $to_assign = true; } else { //notify event log $msg_i18n = Etva::makeNotifyLogMessage(sfConfig::get('config_acronym'), EtvaServerPeer::_ERR_NO_NODE_TO_ASSIGN_, array(), EtvaServerPeer::_ERR_START_, array('name' => $server)); $error = array('success' => false, 'agent' => sfConfig::get('config_acronym'), 'error' => $msg_i18n, 'info' => $msg_i18n); // if is a CLI soap request return json encoded data if (sfConfig::get('sf_environment') == 'soap') { return json_encode($error); } // if is browser request return text renderer $error = $this->setJsonError($error); return $this->renderText($error); } } $server_va = new EtvaServer_VA($etva_server); if ($to_assign) { $response = $server_va->send_assign($etva_node); if (!$response['success']) { if (sfConfig::get('sf_environment') == 'soap') { return json_encode($response); } $return = $this->setJsonError($response); return $this->renderText($return); } } $response = $server_va->send_start($etva_node); if ($response['success']) { $response_ga = $server_va->getGAInfo($etva_node); // update GA Info $return = json_encode($response); // if the request is made throught soap request... if (sfConfig::get('sf_environment') == 'soap') { return $return; } // if is browser request return text renderer $this->getResponse()->setHttpHeader('Content-type', 'application/json'); return $this->renderText($return); } else { if (sfConfig::get('sf_environment') == 'soap') { return json_encode($response); } $return = $this->setJsonError($response); return $this->renderText($return); } }