private function GetServerAvailZone(DBServer $DBServer, \Scalr\Service\Aws\Ec2 $ec2, Scalr_Server_LaunchOptions $launchOptions)
{
if ($DBServer->status == SERVER_STATUS::TEMPORARY) {
return false;
}
$server_avail_zone = $DBServer->GetProperty(EC2_SERVER_PROPERTIES::AVAIL_ZONE);
$role_avail_zone = $this->db->GetOne("\n SELECT ec2_avail_zone FROM ec2_ebs\n WHERE server_index=? AND farm_roleid=?\n LIMIT 1\n ", [$DBServer->index, $DBServer->farmRoleId]);
if (!$role_avail_zone) {
if ($server_avail_zone && $server_avail_zone != 'x-scalr-diff' && !stristr($server_avail_zone, "x-scalr-custom")) {
return $server_avail_zone;
}
$role_avail_zone = $DBServer->GetFarmRoleObject()->GetSetting(Entity\FarmRoleSetting::AWS_AVAIL_ZONE);
}
if (!$role_avail_zone) {
return false;
}
if ($role_avail_zone == "x-scalr-diff" || stristr($role_avail_zone, "x-scalr-custom")) {
//TODO: Elastic Load Balancer
$avail_zones = array();
if (stristr($role_avail_zone, "x-scalr-custom")) {
$zones = explode("=", $role_avail_zone);
foreach (explode(":", $zones[1]) as $zoneName) {
if ($zoneName != "") {
$isUnavailable = $DBServer->GetEnvironmentObject()->getPlatformConfigValue("aws.{$launchOptions->cloudLocation}.{$zoneName}.unavailable", false);
if ($isUnavailable && $isUnavailable + 3600 < time()) {
$DBServer->GetEnvironmentObject()->setPlatformConfig(array("aws.{$launchOptions->cloudLocation}.{$zoneName}.unavailable" => false), false);
$isUnavailable = false;
}
if (!$isUnavailable) {
array_push($avail_zones, $zoneName);
}
}
}
} else {
// Get list of all available zones
$avail_zones_resp = $ec2->availabilityZone->describe();
foreach ($avail_zones_resp as $zone) {
/* @var $zone \Scalr\Service\Aws\Ec2\DataType\AvailabilityZoneData */
$zoneName = $zone->zoneName;
if (strstr($zone->zoneState, 'available')) {
$isUnavailable = $DBServer->GetEnvironmentObject()->getPlatformConfigValue("aws.{$launchOptions->cloudLocation}.{$zoneName}.unavailable", false);
if ($isUnavailable && $isUnavailable + 3600 < time()) {
$DBServer->GetEnvironmentObject()->setPlatformConfig(array("aws.{$launchOptions->cloudLocation}.{$zoneName}.unavailable" => false), false);
$isUnavailable = false;
}
if (!$isUnavailable) {
array_push($avail_zones, $zoneName);
}
}
}
}
sort($avail_zones);
$avail_zones = array_reverse($avail_zones);
$servers = $DBServer->GetFarmRoleObject()->GetServersByFilter(array("status" => array(SERVER_STATUS::RUNNING, SERVER_STATUS::INIT, SERVER_STATUS::PENDING)));
$availZoneDistribution = array();
foreach ($servers as $cDbServer) {
if ($cDbServer->serverId != $DBServer->serverId) {
$availZoneDistribution[$cDbServer->GetProperty(EC2_SERVER_PROPERTIES::AVAIL_ZONE)]++;
}
}
$sCount = 1000000;
foreach ($avail_zones as $zone) {
if ((int) $availZoneDistribution[$zone] <= $sCount) {
$sCount = (int) $availZoneDistribution[$zone];
$availZone = $zone;
}
}
return $availZone;
} else {
return $role_avail_zone;
}
}