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;
}