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; }
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); }
/** * 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; }