public static function Create(ServerCreateInfo $creInfo, $isImport = false, $setPendingStatus = false)
{
$db = \Scalr::getDb();
$startWithLetter = in_array($creInfo->platform, array(SERVER_PLATFORMS::CLOUDSTACK, SERVER_PLATFORMS::IDCF, SERVER_PLATFORMS::GCE));
if ($isImport) {
$startWithLetter = true;
}
$server_id = Scalr::GenerateUID(false, $startWithLetter);
$status = !$isImport ? SERVER_STATUS::PENDING_LAUNCH : SERVER_STATUS::IMPORTING;
if ($setPendingStatus) {
$status = SERVER_STATUS::PENDING;
}
// Assigns Farm index to the server
if (!$isImport) {
// This query select the least lower vacant Farm index from the available.
// If there are no available indexes the query returns NULL so we need cast result to integer
// to make sure it will use Farm index equal to 1 in this case.
// We ingore terminated and pending terminating instances to release their indexes.
$farmIndex = 1 + intval($db->GetOne("\n SELECT s.farm_index\n FROM servers s\n WHERE s.farm_id = ? AND s.status NOT IN (?, ?)\n AND NOT EXISTS (SELECT 1 FROM servers WHERE farm_id = s.farm_id AND farm_index = s.farm_index + 1 AND status NOT IN (?, ?))\n ORDER BY s.farm_index\n LIMIT 1\n ", [$creInfo->farmId ? $creInfo->farmId : $creInfo->dbFarmRole->FarmID, SERVER_STATUS::TERMINATED, SERVER_STATUS::PENDING_TERMINATE, SERVER_STATUS::TERMINATED, SERVER_STATUS::PENDING_TERMINATE]));
} else {
// Default Farm index value is considered to equal 1
$farmIndex = 1;
}
// IF no index defined
if (!$creInfo->index && !$isImport) {
$indexes = $db->GetAll("SELECT `index` FROM servers WHERE farm_roleid = ? AND status NOT IN (?, ?)", [$creInfo->dbFarmRole->ID, SERVER_STATUS::TERMINATED, SERVER_STATUS::PENDING_TERMINATE]);
$usedIndexes = [];
if (!empty($indexes)) {
foreach ($indexes as $index) {
$usedIndexes[$index['index']] = true;
}
}
for ($i = 1;; $i++) {
if (!isset($usedIndexes[$i])) {
$creInfo->index = $i;
break;
}
}
} elseif ($isImport) {
$creInfo->index = 0;
}
$client_id = $creInfo->clientId ? $creInfo->clientId : $creInfo->dbFarmRole->GetFarmObject()->ClientID;
$instanceTypeName = null;
$instanceTypeId = $creInfo->dbFarmRole ? $creInfo->dbFarmRole->getInstanceType() : null;
if (in_array($creInfo->platform, [SERVER_PLATFORMS::EC2, SERVER_PLATFORMS::GCE])) {
$instanceTypeName = $instanceTypeId;
}
$db->Execute("\n INSERT INTO servers\n SET `server_id` = ?,\n `farm_id` = ?,\n `env_id` = ?,\n `farm_roleid` = ?,\n `client_id` = ?,\n `platform` = ?,\n `status` = ?,\n `remote_ip` = ?,\n `local_ip` = ?,\n `dtadded` = NOW(),\n `index` = ?,\n `farm_index` = ?,\n `cloud_location` = ?,\n `type` = ?,\n `instance_type_name`= ?\n ", [$server_id, $creInfo->farmId ? $creInfo->farmId : $creInfo->dbFarmRole->FarmID, $creInfo->envId, $creInfo->dbFarmRole ? $creInfo->dbFarmRole->ID : 0, $client_id, $creInfo->platform, $status, $creInfo->remoteIp, $creInfo->localIp, $creInfo->index, $farmIndex, $creInfo->dbFarmRole ? $creInfo->dbFarmRole->CloudLocation : null, $instanceTypeId, $instanceTypeName]);
$DBServer = DBServer::LoadByID($server_id);
$DBServer->SetProperties($creInfo->GetProperties());
$DBServer->setOsType($DBServer->osType);
try {
if ($DBServer->farmRoleId) {
$db->Execute("\n INSERT INTO servers_launch_timelog\n SET `server_id` = ?,\n `os_family` = ?,\n `os_version` = ?,\n `cloud` = ?,\n `cloud_location` = ?,\n `server_type` = ?,\n `behaviors` = ?,\n `ts_created` = ?\n ", [$server_id, $DBServer->GetFarmRoleObject()->GetRoleObject()->getOs()->family, $DBServer->GetFarmRoleObject()->GetRoleObject()->getOs()->version, $DBServer->platform, $DBServer->cloudLocation, $DBServer->getType(), implode(",", $DBServer->GetFarmRoleObject()->GetRoleObject()->getBehaviors()), time()]);
}
} catch (Exception $e) {
}
return $DBServer;
}