Esempio n. 1
0
 public function canAssignServer(EtvaServer $server)
 {
     $server_mem = Etva::MB_to_Byteconvert($server->getMem());
     if ($this->getCputotal() >= $server->getVcpu() && $this->getMaxMem() > $server_mem && !$server->getDevices_VA() && !$server->getHasSnapshots()) {
         if ($server->getVmState() !== EtvaServer::RUNNING || $this->getMemfree() > $server_mem) {
             error_log("canAssignServer OK node=" . $this->getName() . " server=" . $server->getName() . " vmstate=" . $server->getVmState() . " maxmem=" . $this->getMaxMem() . " memfree=" . $this->getMemfree() . " server_mem=" . $server_mem);
             return true;
         }
     }
     error_log("canAssignServer NOK node=" . $this->getName() . " server=" . $server->getName() . " vmstate=" . $server->getVmState() . " maxmem=" . $this->getMaxMem() . " memfree=" . $this->getMemfree() . " server_mem=" . $server_mem);
     return false;
 }
Esempio n. 2
0
 public function getAdmissionGate(EtvaServer $server)
 {
     if ($this->getHasNodeHA()) {
         if ($this->getAdmissionGateType() == self::CLUSTER_ADMISSION_GATE_TYPE_N_HOSTS_TOLERATE || $this->getAdmissionGateType() == self::CLUSTER_ADMISSION_GATE_TYPE_PER_RESOURCES) {
             $nodes = EtvaNodeQuery::create()->leftJoin('EtvaNode.EtvaServerAssign')->leftJoin('EtvaServerAssign.EtvaServer')->addJoinCondition('EtvaServer', 'EtvaServer.VmState = ?', EtvaServer::RUNNING)->withColumn('SUM(EtvaServer.Mem)', 'sum_mem')->withColumn('SUM(EtvaServer.Vcpu)', 'sum_vcpu')->groupBy('EtvaNode.Id')->orderBy('EtvaNode.Memtotal', 'desc')->filterByClusterId($this->getId())->filterByState(EtvaNode::NODE_ACTIVE)->filterByInitialize(EtvaNode::INITIALIZE_OK)->find();
             $n_hosts_tolerate = 0;
             if ($this->getAdmissionGateType() == self::CLUSTER_ADMISSION_GATE_TYPE_N_HOSTS_TOLERATE) {
                 $n_hosts_tolerate = $this->getAdmissionGateValue();
             }
             $n_hosts_tolerate_value = $n_hosts_tolerate;
             $sum_all_Nodes_memtotal = 0;
             $sum_n_biggest_Nodes_memtotal = 0;
             $sum_all_running_Servers_mem = 0;
             $sum_all_Nodes_memfree = 0;
             $max_cpu_Nodes = 0;
             $server_mem_bytes = $server->getMem() * 1024 * 1024;
             foreach ($nodes as $node) {
                 if ($n_hosts_tolerate) {
                     $sum_n_biggest_Nodes_memtotal = +$node->getMemtotal();
                     $n_hosts_tolerate--;
                     // decrease
                 }
                 $sum_all_Nodes_memtotal += $node->getMemtotal();
                 $sum_all_Nodes_memfree += $node->getMemfree();
                 $sum_all_running_Servers_mem += $node->getSum_mem();
                 if (!$max_cpu_Nodes || $node->getCputotal() < $max_cpu_Nodes) {
                     $max_cpu_Nodes = $node->getCputotal();
                 }
             }
             $sum_all_running_Servers_mem_bytes = $sum_all_running_Servers_mem * 1024 * 1024;
             error_log("getAdmissionGate getAdmissionGateType=" . $this->getAdmissionGateType() . " getAdmissionGateValue=" . $this->getAdmissionGateValue() . " sum_all_Nodes_memtotal={$sum_all_Nodes_memtotal} sum_n_biggest_Nodes_memtotal={$sum_n_biggest_Nodes_memtotal} sum_all_running_Servers_mem_bytes={$sum_all_running_Servers_mem_bytes} sum_all_Nodes_memfree={$sum_all_Nodes_memfree} max_cpu_Nodes={$max_cpu_Nodes} vcpu=" . $server->getVcpu() . " mem=" . $server->getMem() . " name=" . $server->getName());
             if ($this->getAdmissionGateType() == self::CLUSTER_ADMISSION_GATE_TYPE_N_HOSTS_TOLERATE) {
                 $sum_all_running_Servers_memfree_bytes_after = $sum_all_Nodes_memtotal - $sum_all_running_Servers_mem_bytes - $server_mem_bytes;
                 $sum_all_Nodes_memfree_after = $sum_all_Nodes_memfree - $server_mem_bytes;
                 error_log("getAdmissionGate TYPE_N_HOSTS_TOLERATE n_hosts_tolerate_value={$n_hosts_tolerate_value} sum_all_running_Servers_memfree_bytes_after={$sum_all_running_Servers_memfree_bytes_after} sum_all_Nodes_memfree_after={$sum_all_Nodes_memfree_after} sum_n_biggest_Nodes_memtotal={$sum_n_biggest_Nodes_memtotal} max_cpu_Nodes={$max_cpu_Nodes} vcpu=" . $server->getVcpu() . " mem=" . $server->getMem() . " name=" . $server->getName());
                 # the all free memory get from running server should not be less then total of sum of memory of biggest nodes
                 if ($sum_all_running_Servers_memfree_bytes_after < $sum_n_biggest_Nodes_memtotal) {
                     return array('success' => false, 'info' => sfContext::getInstance()->getI18N()->__('Unfulfilled policy for (%n_hosts_tolerate_value%) host(s) failures tolerate. The calc of free memory from running servers say that has %free_mem% to garantee %total_mem%.', array('%n_hosts_tolerate_value%' => $n_hosts_tolerate_value, '%free_mem%' => $sum_all_running_Servers_memfree_bytes_after, '%total_mem%' => $sum_n_biggest_Nodes_memtotal)));
                 }
                 # the all free memory verified on nodes should not be less then total of sum of memory of biggest nodes
                 if ($sum_all_Nodes_memfree_after < $sum_n_biggest_Nodes_memtotal) {
                     return array('success' => false, 'info' => sfContext::getInstance()->getI18N()->__('Unfulfilled policy for (%n_hosts_tolerate_value%) host(s) failures tolerate. The node info says that has %free_mem% free memory to garantee %total_mem%.', array('%n_hosts_tolerate_value%' => $n_hosts_tolerate_value, '%free_mem%' => $sum_all_Nodes_memfree_after, '%total_mem%' => $sum_n_biggest_Nodes_memtotal)));
                 }
                 if ($server->getVcpu() > $max_cpu_Nodes) {
                     return array('success' => false, 'info' => sfContext::getInstance()->getI18N()->__('Number max. of cpus (%max_cpu_Nodes%) exceeded.', array('%max_cpu_Nodes%' => $max_cpu_Nodes)));
                 }
             }
             if ($this->getAdmissionGateType() == self::CLUSTER_ADMISSION_GATE_TYPE_PER_RESOURCES) {
                 $per_resources_value = $this->getAdmissionGateValue();
                 $per_resources = $per_resources_value / 100;
                 $sum_all_running_Servers_memfree_bytes_after = $sum_all_Nodes_memtotal - $sum_all_running_Servers_mem_bytes - $server_mem_bytes;
                 $sum_all_Nodes_memfree_after = $sum_all_Nodes_memfree - $server_mem_bytes;
                 $all_Node_memtotal_threshold = $sum_all_Nodes_memtotal * $per_resources;
                 error_log("getAdmissionGate TYPE_PER_RESOURCES sum_all_running_Servers_memfree_bytes_after={$sum_all_running_Servers_memfree_bytes_after} sum_all_Nodes_memfree_after={$sum_all_Nodes_memfree_after} all_Node_memtotal_threshold={$all_Node_memtotal_threshold} max_cpu_Nodes={$max_cpu_Nodes} vcpu=" . $server->getVcpu() . " mem=" . $server->getMem() . " name=" . $server->getName());
                 # the all free memory get from running server should not be less then percentage of memory of nodes
                 if ($sum_all_running_Servers_memfree_bytes_after < $all_Node_memtotal_threshold) {
                     return array('success' => false, 'info' => sfContext::getInstance()->getI18N()->__('Unfulfilled policy for (%per_resources_value%) percentage of resources reserved to failover. The calc of free memory from running servers say that has %free_mem% to garantee %total_mem%.', array('%per_resources_value%' => $per_resources_value, '%free_mem%' => $sum_all_running_Servers_memfree_bytes_after, '%total_mem%' => $all_Node_memtotal_threshold)));
                 }
                 # the all free memory verified on nodes should not be less then percentage of memory of nodes
                 if ($sum_all_Nodes_memfree_after < $all_Node_memtotal_threshold) {
                     return array('success' => false, 'info' => sfContext::getInstance()->getI18N()->__('Unfulfilled policy for (%per_resources_value%) percentage of resources reserved to failover. The node info says that has %free_mem% free memory to garantee %total_mem%.', array('%per_resources_value%' => $per_resources_value, '%free_mem%' => $sum_all_Nodes_memfree_after, '%total_mem%.' => $all_Node_memtotal_threshold)));
                 }
                 if ($server->getVcpu() > $max_cpu_Nodes) {
                     return array('success' => false, 'info' => sfContext::getInstance()->getI18N()->__('Number max. of cpus (%max_cpu_Nodes%) exceeded.', array('%max_cpu_Nodes%' => $max_cpu_Nodes)));
                 }
             }
         }
     }
     return array('success' => true);
 }
Esempio n. 3
0
 /**
  * checks server state
  * send soap request and update DB state
  * returns response from agent
  */
 private function checkState(EtvaServer $etva_server, $dispatcher)
 {
     $method = 'getstate';
     $response = $etva_server->soapSend($method, $dispatcher);
     $success = $response['success'];
     if (!$success) {
         $etva_server->setState(0);
         $etva_server->save();
         //notify system log
         $message = Etva::getLogMessage(array('name' => $etva_server->getName(), 'info' => $response['info']), EtvaServerPeer::_ERR_SOAPSTATE_);
         $this->dispatcher->notify(new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => $message, 'priority' => EtvaEventLogger::ERR)));
     } else {
         $etva_server->setState(1);
         $etva_server->save();
         //notify system log
         $message = Etva::getLogMessage(array('name' => $etva_server->getName()), EtvaServerPeer::_OK_SOAPSTATE_);
         $this->dispatcher->notify(new sfEvent(sfConfig::get('config_acronym'), 'event.log', array('message' => $message)));
     }
     return $response;
 }