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 node(s) virtual machines state...' . "\n"); // get nodes active $updated_vm_state = array(); $nodes = EtvaNodeQuery::create()->filterByState(EtvaNode::NODE_ACTIVE)->find(); $affected = 0; foreach ($nodes as $node) { $response = $node->soapSend('domains_stats'); $success = $response['success']; if ($success) { $returned_data = $response['response']; foreach ($returned_data as $i => $server) { $server_data = (array) $server; $etva_server = $node->retrieveServerByName($server_data['name']); if ($etva_server) { $server_id = $etva_server->getId(); // get server id if ($etva_server->getVmState() !== EtvaServer::STATE_MIGRATING) { // only if not in migrating mode $etva_server->setVmState($server_data['state']); $etva_server->save(); } $updated_vm_state[$server_id] = $etva_server->getVmState(); // mark as updated } } } else { $affected++; $errors[] = $response['error']; } } // change state as STOP for servers that are not in array EtvaServerQuery::create()->filterById(array_keys($updated_vm_state), Criteria::NOT_IN)->update(array('VmState' => EtvaServer::STATE_STOP)); if ($nodes) { $message = sprintf('%d Node(s) could not be checked for virtual machines state', $affected); if ($affected > 0) { $context->getEventDispatcher()->notify(new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => $message, 'priority' => EtvaEventLogger::ERR))); } } if (!empty($errors)) { $this->log('[INFO]' . $message); } $logger = new sfFileLogger($context->getEventDispatcher(), array('file' => sfConfig::get("sf_log_dir") . '/cron_status.log')); // log the message! $logger->log("The check virtual machines state task ran!", 6); }
public function getServersWithGA() { $servers = EtvaServerQuery::create()->filterByVmState(EtvaServer::RUNNING)->filterByGaState(EtvaServerPeer::_GA_UNINSTALLED_, Criteria::NOT_EQUAL)->useEtvaServerAssignQuery('ServerAssign', 'RIGHT JOIN')->useEtvaNodeQuery()->filterByState(EtvaNode::NODE_ACTIVE)->filterById($this->getId())->endUse()->endUse()->find(); return $servers; }
public static function getDevicesInUse($etva_node, $ignore_server) { $id = $etva_node->getId(); $servers = EtvaServerQuery::create()->useEtvaServerAssignQuery('ServerAssign', 'RIGHT JOIN')->filterByNodeId($id)->endUse()->find(); $devs_in_use = array(); // gather devices foreach ($servers as $server) { if (isset($ignore_server) && $server->getId() == $ignore_server->getId()) { continue; } $srv_devices = json_decode($server->getDevices()); foreach ($srv_devices as $d) { $devs_in_use[] = $d->idvendor . $d->idproduct . $d->type; } } return array_unique($devs_in_use); }
public function executeJsonLoad(sfWebRequest $request) { $count = 0; $id = $request->getParameter('id'); if ($etva_node = EtvaNodePeer::retrieveByPK($id)) { $count = 1; } else { $msg_i18n = $this->getContext()->getI18N()->__(EtvaNodePeer::_ERR_NOTFOUND_ID_, array('%id%' => $id)); $error = array('success' => false, 'agent' => sfConfig::get('config_acronym'), 'error' => $msg_i18n, 'info' => $msg_i18n); // if is browser request return text renderer $error = $this->setJsonError($error); return $this->renderText($error); } $node_array = $etva_node->toDisplay(); // check if datacenter hasNodeHA? $node_array['datacenter_hasNodeHA'] = $etva_node->getEtvaCluster()->getHasnodeha() ? true : false; $run_servers = $etva_node->getServers(EtvaServerQuery::create()->filterByVmState(EtvaServer::RUNNING)); $stop_servers = $etva_node->getServers(EtvaServerQuery::create()->filterByVmState(EtvaServer::RUNNING, Criteria::NOT_EQUAL)); $node_array['servers_up'] = count($run_servers); $node_array['servers_down'] = count($stop_servers); // get sys info from node $node_va = new EtvaNode_VA($etva_node); $response = $node_va->send_get_sys_info(); if ($response['success']) { $node_array['sysinfo'] = (array) $response['response']; $node_array['node_free_memory'] = Etva::Byte_to_MBconvert($node_array['sysinfo']['meminfo']->NodeFreeMemory); } $return = array('success' => true, 'total' => $count, 'data' => $node_array); $result = json_encode($return); $this->getResponse()->setHttpHeader('Content-type', 'application/json'); return $this->renderText($result); }
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())); } } }
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!"); }
protected function execute($arguments = array(), $options = array()) { // number of workers $n_childs = $options['processes'] - 1; // Start n child $this->startChildren($n_childs); $context = sfContext::createInstance(sfProjectConfiguration::getApplicationConfiguration('app', $options['env'], true)); $this->redefineStdOut(); // initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase($options['connection'])->getConnection(); // add your code here // queue of response $this->queueResourceResponse = msg_get_queue(ftok(__FILE__, 'X')); $backup_location = $arguments['location']; if ($this->iAmParent()) { $this->log('[INFO] Get all nodes with VirtAgent activated...' . "\n"); $query = EtvaServerQuery::create(); // filter servers if ($options['filter']) { $fil_arr = explode(',', $options['filter']); foreach ($fil_arr as $sname) { $query->addOr(EtvaServerPeer::NAME, $sname, Criteria::EQUAL); } } // exclude servers if ($options['exclude']) { $exc_arr = explode(',', $options['exclude']); foreach ($exc_arr as $sname) { $query->addAnd(EtvaServerPeer::NAME, $sname, Criteria::NOT_EQUAL); } } $all_servers = $query->find(); foreach ($all_servers as $server) { // add server to queue to process backup $this->addToQueue($server); } // Wait until queue is consume $this->waitForEmptyQueue(); } else { $msgtype_send = 1; // Child process while ($server = $this->getFromQueue()) { $task_server_backup = new serverBackupTask($this->dispatcher, new sfFormatter()); $res = $task_server_backup->run(array('serverid' => $server->getId()), array('location' => $backup_location, 'shutdown' => 'true', 'do_not_generate_tar' => 'true', 'delete_backups_n_days' => 2)); $error = $task_server_backup->getLastError(); $message = $task_server_backup->getReport(); /*$res = 0; $message = "[INFO] Backup ".$server->getName()." VM successfully.\n"; $error = array('message'=>$message); $this->log($message);*/ // send report to the parent $msgObj = array('return' => $res, 'message' => $message, 'error' => $error, 'server' => $server); msg_send($this->queueResourceResponse, $msgtype_send, $msgObj); } } }
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); $connection = $databaseManager->getDatabase($options['connection'])->getConnection(); // add your code here // Update nodes logical volumes $this->log('[INFO] Update nodes logical volumes info...' . "\n"); $list_nodes = EtvaNodeQuery::create()->find(); foreach ($list_nodes as $node) { $lv_va = new EtvaLogicalvolume_VA(); $lv_errors = $lv_va->send_update($node, false, false); } // Check servers with snapshots $this->log('[INFO] Checking Servers with snapshots...' . "\n"); $errors_arr = array(); $list_servers = EtvaServerQuery::create()->find(); foreach ($list_servers as $server) { $server_lvs = $server->getEtvaLogicalvolumes(); foreach ($server_lvs as $lv) { if ($lv->getPerUsageSnapshots() >= EtvaLogicalvolume::PER_USAGESNAPSHOTS_CRITICAL) { $this->log('[ERROR] Logical volume \'' . $lv->getLvdevice() . '\' of server \'' . $server->getName() . '\' is in CRITICAL with ' . sprintf('%g%%', round($lv->getPerUsageSnapshots() * 100)) . ' of usage by snapshots '); array_push($errors_arr, array('server_name' => $server->getName(), 'lvdevice' => $lv->getLvdevice(), 'per_usage_snapshots' => $lv->getPerUsageSnapshots(), 'status_id' => EtvaServer::USAGESNAPSHOTS_STATUS_CRITICAL, 'status_str' => EtvaServer::USAGESNAPSHOTS_STATUS_CRITICAL_STR)); } else { if ($lv->getPerUsageSnapshots() >= EtvaLogicalvolume::PER_USAGESNAPSHOTS_WARNING) { $this->log('[ERROR] Logical volume \'' . $lv->getLvdevice() . '\' of server \'' . $server->getName() . '\' is in WARNING with ' . sprintf('%g%%', round($lv->getPerUsageSnapshots() * 100)) . ' of usage by snapshots '); array_push($errors_arr, array('server_name' => $server->getName(), 'lvdevice' => $lv->getLvdevice(), 'per_usage_snapshots' => $lv->getPerUsageSnapshots(), 'status_id' => EtvaServer::USAGESNAPSHOTS_STATUS_WARNING, 'status_str' => EtvaServer::USAGESNAPSHOTS_STATUS_WARNING_STR)); } else { $this->log('[INFO] Logical volume \'' . $lv->getLvdevice() . '\' of server \'' . $server->getName() . '\' is in NORMAL with ' . sprintf('%g%%', round($lv->getPerUsageSnapshots() * 100)) . ' of usage by snapshots '); #array_push($errors_arr, array('server_name'=>$server->getName(),'lvdevice'=>$lv->getLvdevice(),'per_usage_snapshots'=>$lv->getPerUsageSnapshots(),'status_id'=>EtvaServer::USAGESNAPSHOTS_STATUS_CRITICAL,'status_str'=>EtvaServer::USAGESNAPSHOTS_STATUS_CRITICAL_STR)); } } } } if (!empty($errors_arr)) { $message = ""; foreach ($errors_arr as $err) { if ($server_name != $err['server_name']) { $server_name = $err['server_name']; $message = $message . "Server '{$server_name}':\r\n"; } $message = $message . " Logical volume '" . $err['lvdevice'] . "' in state '" . $err['status_str'] . "' with " . sprintf('%g%%', round($err['per_usage_snapshots'] * 100)) . " usage of snapshots.\r\n"; } $from = EtvaSettingPeer::retrieveByPK(EtvaSettingPeer::_ALERT_EMAIL_FROM_)->getValue(); if (!$from) { $from = '*****@*****.**'; } $to = EtvaSettingPeer::retrieveByPK(EtvaSettingPeer::_ALERT_EMAIL_)->getValue(); if (!$to) { $to = '*****@*****.**'; } $subject_prefix = EtvaSettingPeer::retrieveByPK(EtvaSettingPeer::_ALERT_SUBJECT_PREFIX_)->getValue(); if (!$subject_prefix) { $subject_prefix = 'Nuxis -'; } #$to = "*****@*****.**"; $subject = $subject_prefix . " " . "Servers snapshots usage report"; $headers = "From: {$from}\r\n"; mail($to, $subject, $message, $headers); $this->log("[INFO] Email with report sent to {$to}"); } else { $this->log("[INFO] No errors to report"); } }
public function executeJsonLoad(sfWebRequest $request) { $id = $request->getParameter('id'); if (!($etva_cluster = EtvaClusterPeer::retrieveByPK($id))) { $msg_i18n = $this->getContext()->getI18N()->__(EtvaClusterPeer::_ERR_CLUSTER_, array('%id%' => $id)); $error = array('success' => false, 'agent' => sfConfig::get('config_acronym'), 'error' => $msg_i18n, 'info' => $msg_i18n); // if is browser request return text renderer $error = $this->setJsonError($error); return $this->renderText($error); } $cluster_array = $etva_cluster->toDisplay(); $list_etva_nodes = $etva_cluster->getEtvaNodes(); $cluster_array['nodes_up'] = 0; $cluster_array['nodes_down'] = 0; $cluster_array['servers_assign'] = 0; $cluster_array['servers_unassign'] = 0; $cluster_array['count_fencing_cmd'] = 0; foreach ($list_etva_nodes as $etva_node) { $cluster_array['mem_text'] += $etva_node->getMemtotal(); $cluster_array['mem_available'] += $etva_node->getMemfree(); $cluster_array['cpus'] += $etva_node->getCputotal(); if ($etva_node->getState() == EtvaNode::NODE_ACTIVE) { $cluster_array['nodes_up'] += 1; } else { $cluster_array['nodes_down'] += 1; } if ($etva_node->getFencingconf_cmd()) { $cluster_array['count_fencing_cmd']++; } } $cluster_array['allnodes_have_fencing_cmd_configured'] = $cluster_array['count_fencing_cmd'] == count($list_etva_nodes) ? 1 : 0; $cluster_array['mem_text'] = Etva::Byte_to_MBconvert($cluster_array['mem_text']); $cluster_array['mem_available'] = Etva::Byte_to_MBconvert($cluster_array['mem_available']); $cluster_array['servers_assign'] = EtvaServerQuery::create()->filterByClusterId($etva_cluster->getId())->useEtvaServerAssignQuery()->endUse()->count(); $cluster_array['servers_unassign'] = EtvaServerQuery::create()->filterByClusterId($etva_cluster->getId())->count() - $cluster_array['servers_assign']; $return = array('success' => true, 'total' => $count, 'data' => $cluster_array); $result = json_encode($return); $this->getResponse()->setHttpHeader('Content-type', 'application/json'); return $this->renderText($result); }
/** * process soap update requests of virtual machines * * $request['uuid'] //node uuid * $request['action'] // domains_stats (updates vms state) or domains_init (initializes agent servers) * $request['vms'] //list of virtual machines sent by VA * * @return array servers array on CM DB * */ public function executeSoapUpdate(sfWebRequest $request) { if (sfConfig::get('sf_environment') == 'soap') { $action = $request->getParameter('action'); $c = new Criteria(); $c->add(EtvaNodePeer::UUID, $request->getParameter('uuid')); if (!($etva_node = EtvaNodePeer::doSelectOne($c))) { $error_msg = sprintf('Object etva_node does not exist (%s).', $request->getParameter('uuid')); $error = array('success' => false, 'error' => $error_msg); //notify event log $node_message = Etva::getLogMessage(array('name' => $request->getParameter('uuid')), EtvaNodePeer::_ERR_NOTFOUND_UUID_); $message = Etva::getLogMessage(array('info' => $node_message), EtvaServerPeer::_ERR_SOAPUPDATE_); $this->dispatcher->notify(new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => $message, 'priority' => EtvaEventLogger::ERR))); return $error; } $node_initialize = $etva_node->getInitialize(); if ($node_initialize != EtvaNode_VA::INITIALIZE_OK) { $error_msg = sprintf('Etva node initialize status: %s', $node_initialize); $error = array('success' => false, 'error' => $error_msg); return $error; } $querysrvs = EtvaServerQuery::create(); $querysrvs->orderByPriorityHa('desc'); $node_servers = $etva_node->getEtvaServers($querysrvs); switch ($action) { case 'domains_stats': $vms = (array) $request->getParameter('vms'); $vms_uuids = array(); $vms = !empty($vms) ? (array) $vms : array(); $not_affected = 0; foreach ($vms as $vm) { $vms_uuids[$vm->uuid] = (array) $vm; } foreach ($node_servers as $node_server) { //error_log(sprintf('node_servers id=%s name=%s priority_ha=%s',$node_server->getId(),$node_server->getName(),$node_server->getPriorityHa())); $server_uuid = $node_server->getUuid(); if (!$node_server->getUnassigned()) { // assigned only // and is not migrating if ($node_server->getVmState() !== EtvaServer::STATE_MIGRATING) { if (isset($vms_uuids[$server_uuid])) { $node_server->setVmState($vms_uuids[$server_uuid]['state']); if (isset($vms_uuids[$server_uuid]['has_snapshots'])) { // set snapshots flags $node_server->setHassnapshots($vms_uuids[$server_uuid]['has_snapshots']); } $node_server->save(); } else { $message_s = sprintf('Node %s could not check state for virtual machine %s(%s)', $etva_node->getName(), $node_server->getName(), $server_uuid); $not_affected++; $this->dispatcher->notify(new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => $message_s, 'priority' => EtvaEventLogger::ERR))); error_log($message_s); } } else { $message_s = sprintf('Node %s could not check state for virtual machine %s(%s) beacuse is migrating', $etva_node->getName(), $node_server->getName(), $server_uuid); error_log($message_s); } } } // update free memory $etva_node->updateMemFree(); $etva_node->save(); //notify system log if ($not_affected > 0) { $message = sprintf('Node %s could not check for %d virtual machine(s) state', $etva_node->getName(), $not_affected); $this->dispatcher->notify(new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => $message, 'priority' => EtvaEventLogger::ERR))); return array('success' => false, 'reason' => '_servers_inconsistency_'); } return array('success' => true); break; case 'domains_gainfo': $vms = (array) $request->getParameter('vms'); $vms_uuids = array(); $vms = !empty($vms) ? (array) $vms : array(); foreach ($vms as $vm) { $vms_uuids[$vm->uuid] = (array) $vm; } foreach ($node_servers as $node_server) { $server_uuid = $node_server->getUuid(); if (!$node_server->getUnassigned()) { // assigned only if (isset($vms_uuids[$server_uuid])) { //$str = json_encode($vms_uuids[$server_uuid]['msg']); $str = $vms_uuids[$server_uuid]['msg']; $obj = json_decode($str); $node_server->mergeGaInfo($str); // merge GA info $node_server->resetHeartbeat(EtvaServerPeer::_GA_RUNNING_); $node_server->setHbnrestarts(0); // reset num of restarts $node_server->save(); $message = sprintf('domains_gainfo guest agent info updated (id=%s name=%s type=%s hb=%s)', $node_server->getId(), $node_server->getName(), $obj->__name__, $node_server->getHeartbeat()); error_log($message); /*$this->dispatcher->notify( new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => $message,'priority'=>EtvaEventLogger::INFO)));*/ } } } return array('success' => true); break; case 'domains_sync': $new_servers = array(); $vms = (array) $request->getParameter('vms'); $vms_uuids = array(); $vms = !empty($vms) ? (array) $vms : array(); $not_affected = 0; foreach ($vms as $vm) { if ($vm) { $vms_uuids[$vm->uuid] = (array) $vm; } } foreach ($node_servers as $node_server) { error_log(sprintf('domains_sync server id=%s name=%s priority_ha=%s', $node_server->getId(), $node_server->getName(), $node_server->getPriorityHa())); if (!$node_server->getUnassigned()) { // ignore unassigned servers $server_name = $node_server->getName(); $new_servers[$server_name] = $node_server->_VA(); $server_uuid = $node_server->getUuid(); if (isset($vms_uuids[$server_uuid])) { if ($vms_uuids[$server_uuid]['state'] != EtvaServer::RUNNING && ($node_server->getVmState() == EtvaServer::RUNNING || $node_server->getAutostart())) { error_log(sprintf('domains_sync server id=%s name=%s should be running', $node_server->getId(), $node_server->getName())); $node_server->setHblaststart('NOW'); // update hb last start $node_server->save(); } unset($vms_uuids[$server_uuid]); } } } $servers_names = array_keys($new_servers); $servers = implode(', ', $servers_names); /* * check if is an appliance restore operation... */ $apli = new Appliance(); $action = $apli->getStage(Appliance::RESTORE_STAGE); if ($action) { $apli->setStage(Appliance::RESTORE_STAGE, Appliance::VA_UPDATE_VMS); } //notify system log if ($new_servers) { $this->dispatcher->notify(new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => Etva::getLogMessage(array('name' => $etva_node->getName(), 'info' => $servers), EtvaServerPeer::_OK_SOAPUPDATE_), 'priority' => EtvaEventLogger::INFO))); } $load_servers = count($new_servers) ? array_values($new_servers) : array(); $destroy_servers = count($vms_uuids) ? array_values($vms_uuids) : array(); $return = array('success' => true, 'load_servers' => $load_servers, 'destroy_servers' => $destroy_servers); return $return; break; default: $new_servers = array(); foreach ($node_servers as $node_server) { if (!$node_server->getUnassigned()) { // ignore unassigned servers $server_name = $node_server->getName(); $new_servers[$server_name] = $node_server->_VA(); } } $servers_names = array_keys($new_servers); $servers = implode(', ', $servers_names); /* * check if is an appliance restore operation... */ $apli = new Appliance(); $action = $apli->getStage(Appliance::RESTORE_STAGE); if ($action) { $apli->setStage(Appliance::RESTORE_STAGE, Appliance::VA_UPDATE_VMS); } //notify system log if ($new_servers) { $this->dispatcher->notify(new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => Etva::getLogMessage(array('name' => $etva_node->getName(), 'info' => $servers), EtvaServerPeer::_OK_SOAPUPDATE_), 'priority' => EtvaEventLogger::INFO))); } return $new_servers; } } }