Scalr_Scaling_Manager::getFinalDecision PHP Method

getFinalDecision() public method

Makes decision on farm basic scaling settings
public getFinalDecision ( string $scalingMetricDecision = null, integer $scalingMetricInstancesCount = null ) : string
$scalingMetricDecision string optional Decision taken on metrics
$scalingMetricInstancesCount integer optional Scaling amount
return string Returns resulting decision
    public function getFinalDecision($scalingMetricDecision = null, $scalingMetricInstancesCount = null)
    {
        $isDbMsr = $this->dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL) || $this->dbFarmRole->GetRoleObject()->getDbMsrBehavior();
        $needOneByOneLaunch = $this->dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::RABBITMQ) || $this->dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MONGODB);
        // Check do we need upscale to min instances count
        $runningInstances = $this->dbFarmRole->GetRunningInstancesCount();
        $roleTotalInstances = $runningInstances + $this->dbFarmRole->GetPendingInstancesCount();
        // Need to check Date&Time based scaling. Otherwise Scalr downscale role every time.
        if (isset($scalingMetricInstancesCount)) {
            $minInstances = $maxInstances = $scalingMetricInstancesCount;
        } else {
            $maxInstances = $this->dbFarmRole->GetSetting(Entity\FarmRoleSetting::SCALING_MAX_INSTANCES);
            $minInstances = $this->dbFarmRole->GetSetting(Entity\FarmRoleSetting::SCALING_MIN_INSTANCES);
        }
        if ($roleTotalInstances < $minInstances) {
            $this->decisonInfo = "Min: {$roleTotalInstances} < {$minInstances}";
            if ($needOneByOneLaunch) {
                $pendingTerminateInstances = count($this->dbFarmRole->GetServersByFilter(array('status' => SERVER_STATUS::PENDING_TERMINATE)));
                // If we launching DbMSR instances. Master should be running.
                if ($this->dbFarmRole->GetPendingInstancesCount() == 0 && !$pendingTerminateInstances) {
                    $this->logger->info(_("Increasing number of running instances to fit min instances setting"));
                    $this->decisonInfo .= ' OneByOne';
                    return Scalr_Scaling_Decision::UPSCALE;
                } else {
                    $this->logger->info(_("Found servers in Pending or PendingTerminate state. Waiting..."));
                    return Scalr_Scaling_Decision::NOOP;
                }
            } elseif ($isDbMsr) {
                // If we launching DbMSR instances. Master should be running.
                if ($this->dbFarmRole->GetRunningInstancesCount() > 0 || $this->dbFarmRole->GetPendingInstancesCount() == 0) {
                    $this->logger->info(_("Increasing number of running instances to fit min instances setting"));
                    $this->decisonInfo .= ' DbMsr';
                    return Scalr_Scaling_Decision::UPSCALE;
                } else {
                    $this->logger->info(_("Waiting for running master"));
                    return Scalr_Scaling_Decision::NOOP;
                }
            } else {
                $this->logger->info(_("Increasing number of running instances to fit min instances setting"));
                return Scalr_Scaling_Decision::UPSCALE;
            }
        } elseif ($runningInstances > $maxInstances) {
            $this->logger->info(_("Decreasing number of running instances to fit max instances setting ({$scalingMetricInstancesCount})"));
            $this->decisonInfo = "Max: {$roleTotalInstances} > {$maxInstances}";
            return Scalr_Scaling_Decision::DOWNSCALE;
        }
        return isset($scalingMetricDecision) ? $scalingMetricDecision : Scalr_Scaling_Decision::NOOP;
    }