Scalr\Modules\Platforms\Ec2\Ec2PlatformModule::GetServerAvailZone PHP Метод

GetServerAvailZone() приватный Метод

Gets Avail zone for the specified DB server
private GetServerAvailZone ( DBServer $DBServer, Ec2 $ec2, Scalr_Server_LaunchOption\Scalr_Server_LaunchOptions $launchOptions )
$DBServer DBServer
$ec2 Scalr\Service\Aws\Ec2
$launchOptions Scalr_Server_LaunchOption\Scalr_Server_LaunchOptions
    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;
        }
    }