예제 #1
0
 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!");
 }
예제 #3
0
 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()));
         }
     }
 }
예제 #4
0
 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);
     }
 }