Since: 18.09.2012
Author: Igor Savhenko (igor@scalr.com)
Example #1
0
 public function getScriptingLogAction()
 {
     $this->request->restrictAccess(Acl::RESOURCE_LOGS_SCRIPTING_LOGS);
     $this->request->defineParams(array('executionId' => array('type' => 'string')));
     $info = $this->db->GetRow("SELECT * FROM scripting_log WHERE execution_id = ? LIMIT 1", array($this->getParam('executionId')));
     if (!$info) {
         throw new Exception('Script execution log not found');
     }
     try {
         $dbServer = DBServer::LoadByID($info['server_id']);
         if (!in_array($dbServer->status, array(SERVER_STATUS::INIT, SERVER_STATUS::RUNNING))) {
             throw new Exception();
         }
     } catch (Exception $e) {
         throw new Exception('Server was terminated and logs no longer available');
     }
     //Note! We should not check not-owned-farms permission here. It's approved by Igor.
     if ($dbServer->envId != $this->environment->id) {
         throw new \Scalr_Exception_InsufficientPermissions();
     }
     $client = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $dbServer->getPort(DBServer::PORT_API));
     $logs = $client->getScriptLogs($this->getParam('executionId'));
     $msg = sprintf("STDERR: %s \n\n STDOUT: %s", base64_decode($logs->stderr), base64_decode($logs->stdout));
     $msg = nl2br(htmlspecialchars($msg));
     $this->response->data(array('message' => $msg));
 }
Example #2
0
 private function setConfig(DBServer $dbServer, $behavior, $config)
 {
     $port = $dbServer->GetProperty(SERVER_PROPERTIES::SZR_API_PORT);
     if (!$port) {
         $port = 8010;
     }
     $client = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SERVICE, $port);
     $result = $client->setPreset($behavior, $config);
     return $result->result;
 }
Example #3
0
 public function progressAction()
 {
     $opId = $this->getParam('operationId');
     if ($opId) {
         $operation = $this->db->GetRow("SELECT * FROM server_operations WHERE id = ? LIMIT 1", array($opId));
         $dbServer = DBServer::LoadByID($operation['server_id']);
         $this->user->getPermissions()->validate($dbServer);
     }
     $client2 = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_OPERATION, $dbServer->getPort(DBServer::PORT_API));
     $info = $client2->getStatus($opId);
     var_dump($info);
 }
Example #4
0
 public function getValue(DBFarmRole $dbFarmRole, Scalr_Scaling_FarmRoleMetric $farmRoleMetric)
 {
     $servers = $dbFarmRole->GetServersByFilter(array('status' => SERVER_STATUS::RUNNING));
     $dbFarm = $dbFarmRole->GetFarmObject();
     if (count($servers) == 0) {
         return false;
     }
     $retval = array();
     foreach ($servers as $DBServer) {
         if ($dbFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_EXCLUDE_DBMSR_MASTER) == 1) {
             $isMaster = $DBServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) == 1 || $DBServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) == 1;
             if ($isMaster) {
                 continue;
             }
         }
         if ($DBServer->IsSupported('0.13.0')) {
             $szrClient = Scalr_Net_Scalarizr_Client::getClient($DBServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $DBServer->getPort(DBServer::PORT_API));
             $ramUsage = $szrClient->memInfo();
             $ram = (double) $ramUsage->total_free;
             if ($farmRoleMetric->getSetting(self::SETTING_USE_CACHED)) {
                 $ram = $ram + (double) $ramUsage->cached;
             }
         } else {
             $port = $DBServer->GetProperty(SERVER_PROPERTIES::SZR_SNMP_PORT);
             $this->snmpClient->connect($DBServer->remoteIp, $port ? $port : 161, $dbFarm->Hash, null, null, false);
             $res = $this->snmpClient->get($this->snmpOids['memswap']);
             preg_match_all("/[0-9]+/si", $res, $matches);
             $ram = (double) $matches[0][0];
             if ($farmRoleMetric->getSetting(self::SETTING_USE_CACHED)) {
                 $res = $this->snmpClient->get($this->snmpOids['cachedram']);
                 preg_match_all("/[0-9]+/si", $res, $matches);
                 $cram = (double) $matches[0][0];
                 $ram = $ram + $cram;
             }
         }
         $retval[] = round($ram / 1024, 2);
     }
     return $retval;
 }
Example #5
0
 public function getValue(DBFarmRole $dbFarmRole, Scalr_Scaling_FarmRoleMetric $farmRoleMetric)
 {
     $servers = $dbFarmRole->GetServersByFilter(array('status' => SERVER_STATUS::RUNNING));
     $dbFarm = $dbFarmRole->GetFarmObject();
     $retval = array();
     if (count($servers) == 0) {
         return array();
     }
     foreach ($servers as $dbServer) {
         if ($dbServer->IsSupported('0.13.0')) {
             $apiClient = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $dbServer->getPort(DBServer::PORT_API));
             $metrics = $apiClient->scalingMetrics();
             foreach ($metrics as $metric) {
                 if ($metric->id == $farmRoleMetric->metricId) {
                     if ($metric->error) {
                         throw new Exception(sprintf(_("%s metric error on '%s' (%s): %s"), $metric->name, $dbServer->serverId, $dbServer->remoteIp, $metric->error));
                     }
                     $retval[] = $metric->value;
                     break;
                 }
             }
         } else {
             $port = $dbServer->GetProperty(SERVER_PROPERTIES::SZR_SNMP_PORT);
             // Think about global cache
             $this->snmpClient->connect($DBServer->remoteIp, $port ? $port : 161, $dbFarm->Hash, 7, null, true);
             $res = $this->snmpClient->getFullTree(".1.3.6.1.4.1.36632.5");
             $result = array();
             foreach ($res as $oid => $value) {
                 preg_match("/^(.*?)\\.36632\\.5\\.1\\.([0-9]+)\\.([0-9]+)\$/", $oid, $matches);
                 switch ($matches[2]) {
                     case "1":
                         //index
                         $result['index'][$matches[3]] = $value;
                         break;
                     case "2":
                         //metric_id
                         $result['metric_id'][$matches[3]] = $value;
                         break;
                     case "3":
                         //metric_name
                         $result['metric_name'][$matches[3]] = $value;
                         break;
                     case "4":
                         //metric_value
                         $result['metric_value'][$matches[3]] = $value;
                         break;
                     case "5":
                         //error
                         $result['error'][$matches[3]] = $value;
                         break;
                 }
             }
             foreach ($result['metric_id'] as $index => $metric_id) {
                 if ($metric_id == $farmRoleMetric->metricId) {
                     if ($result['error'][$index]) {
                         throw new Exception(sprintf(_("%s metric error on '%s' (%s): %s"), $result['metric_name'][$index], $dbServer->serverId, $dbServer->remoteIp, $result['error'][$index]));
                     }
                     $retval[] = $result['metric_value'][$index];
                     break;
                 }
             }
         }
     }
     return $retval;
 }
Example #6
0
 public function __get($name)
 {
     if ($name == 'scalarizr') {
         $this->scalarizr = new stdClass();
         // Get list of namespaces
         $refl = new ReflectionClass('Scalr_Net_Scalarizr_Client');
         foreach ($refl->getConstants() as $c => $v) {
             if (substr($c, 0, 9) == 'NAMESPACE') {
                 $this->scalarizr->{$v} = Scalr_Net_Scalarizr_Client::getClient($this, $v, $this->getPort(self::PORT_API));
             }
         }
     }
     if (isset($this->{$name})) {
         return $this->{$name};
     } else {
         throw new InvalidArgumentException("Unknown property '{$name}' in class DBServer");
     }
 }
Example #7
0
 public function __construct(DBServer $dbServer, $port = 8010)
 {
     $this->namespace = "postgresql";
     parent::__construct($dbServer, $port);
 }
Example #8
0
 public function __construct(DBServer $dbServer, $port = 8010)
 {
     $this->namespace = "sysinfo";
     parent::__construct($dbServer, $port);
 }
Example #9
0
 function handleWork($farmId)
 {
     $DBFarm = DBFarm::LoadByID($farmId);
     $GLOBALS["SUB_TRANSACTIONID"] = abs(crc32(posix_getpid() . $farmId));
     $GLOBALS["LOGGER_FARMID"] = $farmId;
     if ($DBFarm->Status != FARM_STATUS::RUNNING) {
         $this->logger->warn("[FarmID: {$DBFarm->ID}] Farm terminated. There is no need to scale it.");
         return;
     }
     foreach ($DBFarm->GetFarmRoles() as $DBFarmRole) {
         for ($i = 0; $i < 10; $i++) {
             if ($DBFarmRole->NewRoleID != '') {
                 $this->logger->warn("[FarmID: {$DBFarm->ID}] Role '{$DBFarmRole->GetRoleObject()->name}' being synchronized. This role will not be scalled.");
                 continue 2;
             }
             if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_ENABLED) != '1' && !$DBFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MONGODB) && !$DBFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::RABBITMQ) && !$DBFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::VPC_ROUTER)) {
                 $this->logger->info("[FarmID: {$DBFarm->ID}] Scaling disabled for role '{$DBFarmRole->GetRoleObject()->name}'. Skipping...");
                 continue 2;
             }
             // Get polling interval in seconds
             $polling_interval = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_POLLING_INTERVAL) * 60;
             $dt_last_polling = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_LAST_POLLING_TIME);
             if ($dt_last_polling && $dt_last_polling + $polling_interval > time() && $i == 0) {
                 $this->logger->info("Polling interval: every {$polling_interval} seconds");
                 continue;
             }
             // Set Last polling time
             $DBFarmRole->SetSetting(DBFarmRole::SETTING_SCALING_LAST_POLLING_TIME, time(), DBFarmRole::TYPE_LCL);
             // Get current count of running and pending instances.
             $this->logger->info(sprintf("Processing role '%s'", $DBFarmRole->GetRoleObject()->name));
             $scalingManager = new Scalr_Scaling_Manager($DBFarmRole);
             $scalingDecision = $scalingManager->makeScalingDecition();
             if ($scalingDecision == Scalr_Scaling_Decision::STOP_SCALING) {
                 return;
             }
             if ($scalingDecision == Scalr_Scaling_Decision::NOOP) {
                 continue 2;
             } elseif ($scalingDecision == Scalr_Scaling_Decision::DOWNSCALE) {
                 /*
                  Timeout instance's count decrease. Decreases instance�s count after scaling
                  resolution the spare instances are running�g for selected timeout interval
                  from scaling EditOptions
                 */
                 // We have to check timeout limits before new scaling (downscaling) process will be initiated
                 if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_DOWNSCALE_TIMEOUT_ENABLED)) {
                     // if the farm timeout is exceeded
                     // checking timeout interval.
                     $last_down_scale_data_time = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_DOWNSCALE_DATETIME);
                     $timeout_interval = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_DOWNSCALE_TIMEOUT);
                     // check the time interval to continue scaling or cancel it...
                     if (time() - $last_down_scale_data_time < $timeout_interval * 60) {
                         // if the launch time is too small to terminate smth in this role -> go to the next role in foreach()
                         Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Waiting for downscaling timeout on farm %s, role %s", $DBFarm->Name, $DBFarmRole->GetRoleObject()->name)));
                         continue 2;
                     }
                 }
                 // end Timeout instance's count decrease
                 $sort = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_KEEP_OLDEST) == 1 ? 'DESC' : 'ASC';
                 $servers = $this->db->GetAll("SELECT server_id FROM servers WHERE status = ? AND farm_roleid=? ORDER BY dtadded {$sort}", array(SERVER_STATUS::RUNNING, $DBFarmRole->ID));
                 $got_valid_instance = false;
                 // Select instance that will be terminated
                 //
                 // * Instances ordered by uptime (oldest wil be choosen)
                 // * Instance cannot be mysql master
                 // * Choose the one that was rebundled recently
                 while (!$got_valid_instance && count($servers) > 0) {
                     $item = array_shift($servers);
                     $DBServer = DBServer::LoadByID($item['server_id']);
                     if ($DBServer->GetFarmRoleObject()->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::RABBITMQ)) {
                         $serversCount = count($DBServer->GetFarmRoleObject()->GetServersByFilter(array(), array('status' => array(SERVER_STATUS::TERMINATED, SERVER_STATUS::TROUBLESHOOTING))));
                         if ($DBServer->index == 1 && $serversCount > 1) {
                             continue;
                         }
                     }
                     if ($DBServer->GetProperty(EC2_SERVER_PROPERTIES::IS_LOCKED)) {
                         continue;
                     }
                     // Exclude db master
                     if ($DBServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) != 1 && $DBServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) != 1) {
                         // We do not want to delete the most recently synced instance. Because of LA fluctuation.
                         // I.e. LA may skyrocket during sync and drop dramatically after sync.
                         if ($DBServer->dateLastSync != 0) {
                             $chk_sync_time = $this->db->GetOne("\n                                    SELECT server_id FROM servers\n                                    WHERE dtlastsync > {$DBServer->dateLastSync}\n                                    AND farm_roleid='{$DBServer->farmRoleId}'\n                                    AND status NOT IN('" . SERVER_STATUS::TERMINATED . "', '" . SERVER_STATUS::TROUBLESHOOTING . "')\n                                    LIMIT 1\n                                ");
                             if ($chk_sync_time) {
                                 $got_valid_instance = true;
                             }
                         } else {
                             $got_valid_instance = true;
                         }
                     }
                 }
                 if ($DBServer && $got_valid_instance) {
                     $this->logger->info(sprintf("Server '%s' selected for termination...", $DBServer->serverId));
                     $allow_terminate = false;
                     if ($DBServer->platform == SERVER_PLATFORMS::EC2) {
                         $aws = $DBServer->GetEnvironmentObject()->aws($DBServer);
                         // Shutdown an instance just before a full hour running
                         if (!$DBServer->GetFarmRoleObject()->GetSetting(DBFarmRole::SETTING_SCALING_IGNORE_FULL_HOUR)) {
                             $response = $aws->ec2->instance->describe($DBServer->GetProperty(EC2_SERVER_PROPERTIES::INSTANCE_ID))->get(0);
                             if ($response && count($response->instancesSet)) {
                                 $launch_time = $response->instancesSet->get(0)->launchTime->getTimestamp();
                                 $time = 3600 - (time() - $launch_time) % 3600;
                                 // Terminate instance in < 10 minutes for full hour.
                                 if ($time <= 600) {
                                     $allow_terminate = true;
                                 } else {
                                     $timeout = round(($time - 600) / 60, 1);
                                     Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Farm %s, role %s scaling down. Server '%s' will be terminated in %s minutes. Launch time: %s", $DBFarm->Name, $DBServer->GetFarmRoleObject()->GetRoleObject()->name, $DBServer->serverId, $timeout, $response->instancesSet->get(0)->launchTime->format('c'))));
                                 }
                             }
                         } else {
                             $allow_terminate = true;
                         }
                         //Releases memory
                         $DBServer->GetEnvironmentObject()->getContainer()->release('aws');
                         unset($aws);
                     } else {
                         $allow_terminate = true;
                     }
                     if ($allow_terminate) {
                         //Check safe shutdown
                         if ($DBServer->GetFarmRoleObject()->GetSetting(DBFarmRole::SETTING_SCALING_SAFE_SHUTDOWN) == 1) {
                             if ($DBServer->IsSupported('0.11.3')) {
                                 try {
                                     $port = $DBServer->GetProperty(SERVER_PROPERTIES::SZR_API_PORT);
                                     if (!$port) {
                                         $port = 8010;
                                     }
                                     $szrClient = Scalr_Net_Scalarizr_Client::getClient($DBServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $port);
                                     $res = $szrClient->callAuthShutdownHook();
                                 } catch (Exception $e) {
                                     $res = $e->getMessage();
                                 }
                             } else {
                                 Logger::getLogger(LOG_CATEGORY::FARM)->error(new FarmLogMessage($DBFarm->ID, sprintf("Safe shutdown enabled, but not supported by scalarizr installed on server '%s'. Ignoring.", $DBServer->serverId)));
                             }
                             if ($res != '1') {
                                 Logger::getLogger(LOG_CATEGORY::FARM)->warn(new FarmLogMessage($DBFarm->ID, sprintf("Safe shutdown enabled. Server '%s'. Script returned '%s', server won't be terminated while return value not '1'", $DBServer->serverId, $res)));
                                 break;
                             }
                         }
                         try {
                             $DBServer->terminate('SCALING_DOWN', false);
                             $DBFarmRole->SetSetting(DBFarmRole::SETTING_SCALING_DOWNSCALE_DATETIME, time(), DBFarmRole::TYPE_LCL);
                             Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Farm %s, role %s scaling down. Server '%s' marked as 'Pending terminate' and will be fully terminated in 3 minutes.", $DBFarm->Name, $DBServer->GetFarmRoleObject()->GetRoleObject()->name, $DBServer->serverId)));
                         } catch (Exception $e) {
                             $this->logger->fatal(sprintf("Cannot terminate %s: %s", $DBFarm->ID, $DBServer->serverId, $e->getMessage()));
                         }
                     }
                 } else {
                     $this->logger->warn(sprintf("[FarmID: %s] Scalr unable to determine what instance it should terminate (FarmRoleID: %s). Skipping...", $DBFarm->ID, $DBFarmRole->ID));
                 }
                 break;
             } elseif ($scalingDecision == Scalr_Scaling_Decision::UPSCALE) {
                 /*
                 Timeout instance's count increase. Increases  instance's count after
                 scaling resolution �need more instances� for selected timeout interval
                 from scaling EditOptions
                 */
                 if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_UPSCALE_TIMEOUT_ENABLED)) {
                     // if the farm timeout is exceeded
                     // checking timeout interval.
                     $last_up_scale_data_time = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_UPSCALE_DATETIME);
                     $timeout_interval = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_UPSCALE_TIMEOUT);
                     // check the time interval to continue scaling or cancel it...
                     if (time() - $last_up_scale_data_time < $timeout_interval * 60) {
                         // if the launch time is too small to terminate smth in this role -> go to the next role in foreach()
                         Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Waiting for upscaling timeout on farm %s, role %s", $DBFarm->Name, $DBFarmRole->GetRoleObject()->name)));
                         continue 2;
                     }
                 }
                 // end Timeout instance's count increase
                 //Check DBMsr. Do not start slave during slave2master process
                 $isDbMsr = $DBFarmRole->GetRoleObject()->getDbMsrBehavior();
                 if ($isDbMsr) {
                     if ($DBFarmRole->GetSetting(Scalr_Db_Msr::SLAVE_TO_MASTER)) {
                         $runningServers = $DBFarmRole->GetRunningInstancesCount();
                         if ($runningServers > 0) {
                             Logger::getLogger(LOG_CATEGORY::FARM)->warn(new FarmLogMessage($DBFarm->ID, sprintf("Role is in slave2master promotion process. Do not launch new slaves while there is no active slaves")));
                             continue 2;
                         } else {
                             $DBFarmRole->SetSetting(Scalr_Db_Msr::SLAVE_TO_MASTER, 0, DBFarmRole::TYPE_LCL);
                         }
                     }
                 }
                 if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_ONE_BY_ONE) == 1) {
                     $pendingInstances = $DBFarmRole->GetPendingInstancesCount();
                     if ($pendingInstances > 0) {
                         Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("There are %s pending intances of %s role on % farm. Waiting...", $pendingInstances, $DBFarmRole->GetRoleObject()->name, $DBFarm->Name)));
                         continue 2;
                     }
                 }
                 $fstatus = $this->db->GetOne("SELECT status FROM farms WHERE id=? LIMIT 1", array($DBFarm->ID));
                 if ($fstatus != FARM_STATUS::RUNNING) {
                     $this->logger->warn("[FarmID: {$DBFarm->ID}] Farm terminated. There is no need to scale it.");
                     return;
                 }
                 $ServerCreateInfo = new ServerCreateInfo($DBFarmRole->Platform, $DBFarmRole);
                 try {
                     $DBServer = Scalr::LaunchServer($ServerCreateInfo, null, false, "Scaling up");
                     $DBFarmRole->SetSetting(DBFarmRole::SETTING_SCALING_UPSCALE_DATETIME, time(), DBFarmRole::TYPE_LCL);
                     Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Farm %s, role %s scaling up. Starting new instance. ServerID = %s.", $DBFarm->Name, $DBServer->GetFarmRoleObject()->GetRoleObject()->name, $DBServer->serverId)));
                 } catch (Exception $e) {
                     Logger::getLogger(LOG_CATEGORY::SCALING)->error($e->getMessage());
                 }
             }
         }
     }
 }
Example #10
0
 public function xGrowStorageAction()
 {
     $dbFarmRole = DBFarmRole::LoadByID($this->getParam('farmRoleId'));
     $this->user->getPermissions()->validate($dbFarmRole->GetFarmObject());
     $behavior = Scalr_Role_Behavior::loadByName($dbFarmRole->GetRoleObject()->getDbMsrBehavior());
     $master = $behavior->getMasterServer($dbFarmRole);
     if ($master) {
         $port = $master->GetProperty(SERVER_PROPERTIES::SZR_API_PORT);
         if (!$port) {
             $port = 8010;
         }
         try {
             $client = Scalr_Net_Scalarizr_Client::getClient($master, Scalr_Net_Scalarizr_Client::NAMESPACE_MYSQL, $port);
             $volume = Scalr_Storage_Volume::init()->loadById($dbFarmRole->GetSetting(Scalr_Db_Msr::VOLUME_ID));
             if ($volume->type != MYSQL_STORAGE_ENGINE::EBS && $volume->type != MYSQL_STORAGE_ENGINE::RAID_EBS && $volume->type != 'raid') {
                 throw new Exception("Grow feature available only for EBS and RAID storage types");
             }
             if ($volume->size >= (int) $this->getParam('newSize')) {
                 throw new Exception("New size should be greather than current one ({$volume->size} GB)");
             }
             $volumeConfig = $volume->getConfig();
             $platformAccessData = PlatformFactory::NewPlatform($dbFarmRole->Platform)->GetPlatformAccessData($this->environment, $master);
             $operationId = $client->growStorage($volumeConfig, $this->getParam('newSize'), $platformAccessData);
             $master->operations->add($operationId, Operations::MYSQL_GROW_VOLUME);
             $this->response->data(array('operationId' => $operationId));
         } catch (Exception $e) {
             throw new Exception("Cannot grow storage: {$e->getMessage()}");
         }
     } else {
         throw new Exception("Impossible to increase storage size. No running master server.");
     }
 }
Example #11
0
 public function xServerGetLaAction()
 {
     $this->request->restrictAccess(Acl::RESOURCE_FARMS_SERVERS);
     $dbServer = DBServer::LoadByID($this->getParam('serverId'));
     $this->user->getPermissions()->validate($dbServer);
     if (!$dbServer->IsSupported('0.13.0')) {
         $la = "Unknown";
     } else {
         if ($dbServer->osType == 'linux') {
             try {
                 $szrClient = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $dbServer->getPort(DBServer::PORT_API));
                 $la = $szrClient->loadAverage();
                 if ($la[0] !== null && $la[0] !== false) {
                     $la = number_format($la[0], 2);
                 } else {
                     $la = "Unknown";
                 }
             } catch (Exception $e) {
                 $la = "Unknown";
             }
         } else {
             $la = "Not available";
         }
     }
     $this->response->data(array('la' => $la));
 }
Example #12
0
 public function statusAction()
 {
     $this->request->defineParams(array('farmId' => array('type' => 'int'), 'farmRoleId' => array('type' => 'int'), 'type'));
     $dbFarm = DBFarm::LoadByID($this->getParam('farmId'));
     $this->user->getPermissions()->validate($dbFarm);
     if ($this->getParam('farmRoleId')) {
         $dbFarmRole = DBFarmRole::LoadByID($this->getParam('farmRoleId'));
         if ($dbFarmRole->FarmID != $dbFarm->ID) {
             throw new Exception("Role not found");
         }
     } elseif ($this->getParam('type')) {
         foreach ($dbFarm->GetFarmRoles() as $sDbFarmRole) {
             if ($sDbFarmRole->GetRoleObject()->hasBehavior($this->getParam('type'))) {
                 $dbFarmRole = $sDbFarmRole;
                 break;
             }
         }
         if (!$dbFarmRole) {
             throw new Exception("Role not found");
         }
     } else {
         throw new Scalr_UI_Exception_NotFound();
     }
     $data = array('farmRoleId' => $dbFarmRole->ID, 'farmHash' => $dbFarm->Hash, 'pmaAccessConfigured' => false, 'staticDnsSupported' => \Scalr::config('scalr.dns.static.enabled'));
     $data['backupsNotSupported'] = in_array($dbFarmRole->Platform, array(SERVER_PLATFORMS::CLOUDSTACK, SERVER_PLATFORMS::IDCF, SERVER_PLATFORMS::UCLOUD));
     if ($dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_PMA_USER)) {
         $data['pmaAccessConfigured'] = true;
     } else {
         $errmsg = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_PMA_REQUEST_ERROR);
         if (!$errmsg) {
             $time = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_PMA_REQUEST_TIME);
             if ($time) {
                 if ($time + 3600 < time()) {
                     $data['pmaAccessError'] = _("Scalr didn't receive auth info from MySQL instance. Please check that MySQL running and Scalr has access to it.");
                 } else {
                     $data['pmaAccessSetupInProgress'] = true;
                 }
             }
         } else {
             $data['pmaAccessError'] = $errmsg;
         }
     }
     //TODO: Legacy code. Move to DB_MSR
     if ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL)) {
         $data['dbType'] = Scalr_Db_Msr::DB_TYPE_MYSQL;
         $data['dtLastBundle'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BUNDLE_TS) ? Scalr_Util_DateTime::convertTz((int) $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BUNDLE_TS), 'd M Y \\a\\t H:i:s') : 'Never';
         $data['dtLastBackup'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BCP_TS) ? Scalr_Util_DateTime::convertTz((int) $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BCP_TS), 'd M Y \\a\\t H:i:s') : 'Never';
         $data['additionalInfo']['MasterUsername'] = '******';
         $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_ROOT_PASSWORD);
         $slaveNumber = 0;
         foreach ($dbFarmRole->GetServersByFilter() as $dbServer) {
             if ($dbServer->status != SERVER_STATUS::RUNNING) {
                 //TODO:
                 continue;
             }
             if ($dbServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) == 1) {
                 $data['isBundleRunning'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_IS_BUNDLE_RUNNING);
                 $data['bundleServerId'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_BUNDLE_SERVER_ID);
                 if ($data['isBundleRunning']) {
                     $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? AND status = ? ORDER BY timestamp DESC LIMIT 1", array($data['bundleServerId'], 'MySQL data bundle', 'running'));
                 } elseif ($data['bundleServerId']) {
                     $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? ORDER BY timestamp DESC LIMIT 1", array($data['bundleServerId'], 'MySQL data bundle'));
                 }
                 if ($opId) {
                     $data['bundleOperationId'] = $opId;
                 }
             }
             $data['isBackupRunning'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_IS_BCP_RUNNING);
             $data['backupServerId'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_BCP_SERVER_ID);
             if (!$data['backupOperationId']) {
                 if ($data['isBackupRunning']) {
                     $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? AND status = ? ORDER BY timestamp DESC LIMIT 1", array($data['backupServerId'], 'MySQL backup', 'running'));
                 } elseif ($data['backupServerId']) {
                     $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? ORDER BY timestamp DESC LIMIT 1", array($data['backupServerId'], 'MySQL backup'));
                 }
                 if ($opId) {
                     $data['backupOperationId'] = $opId;
                 }
             }
             try {
                 $isCloudstack = in_array($dbFarmRole->Platform, array(SERVER_PLATFORMS::CLOUDSTACK, SERVER_PLATFORMS::IDCF, SERVER_PLATFORMS::UCLOUD));
                 $isMaster = $dbServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) == 1;
                 if (!$isCloudstack) {
                     $rStatus = $this->getMySqlReplicationStatus($isMaster ? 'MASTER' : 'SLAVE', $dbServer->remoteIp, 'scalr_stat', $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_STAT_PASSWORD));
                 }
                 if ($isMaster) {
                     $MasterPosition = $rStatus['Position'];
                     $master_ip = $dbServer->remoteIp;
                     $master_iid = $dbServer->serverId;
                 } else {
                     $num = ++$slaveNumber;
                     $SlavePosition = $rStatus['Exec_Master_Log_Pos'];
                 }
                 $d = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "replicationRole" => $isMaster ? 'Master' : "Slave #{$num}");
                 if (!$isCloudstack) {
                     $d['data'] = $rStatus;
                     $d['masterPosition'] = $MasterPosition;
                     $d['slavePosition'] = $SlavePosition;
                 }
                 $data["replicationStatus"][] = $d;
             } catch (Exception $e) {
                 $data["replicationStatus"][] = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "error" => $e->msg ? $e->msg : $e->getMessage(), "replicationRole" => $isMaster ? 'Master' : 'Slave');
             }
         }
     } else {
         $data['dbType'] = $dbFarmRole->GetRoleObject()->getDbMsrBehavior();
         if (!$data['dbType']) {
             $this->response->failure("Unknown db type");
         }
         $behavior = Scalr_Role_Behavior::loadByName($data['dbType']);
         $masterServer = $behavior->getMasterServer($dbFarmRole);
         // Get Stoarge usage
         $size = array('total' => -1, 'used' => -1, 'free' => -1);
         if ($masterServer) {
             try {
                 $port = $masterServer->GetProperty(SERVER_PROPERTIES::SZR_API_PORT);
                 if (!$port) {
                     $port = 8010;
                 }
                 $client = Scalr_Net_Scalarizr_Client::getClient($masterServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $port);
                 if ($data['dbType'] == ROLE_BEHAVIORS::REDIS) {
                     $mpoint = '/mnt/redisstorage';
                 } elseif ($data['dbType'] == ROLE_BEHAVIORS::POSTGRESQL) {
                     $mpoint = '/mnt/pgstorage';
                 } else {
                     $mpoint = '/mnt/dbstorage';
                 }
                 $usage = (array) $client->statvfs(array($mpoint));
                 $size = (array) $usage[$mpoint];
                 if ($size['total']) {
                     $size['used'] = $size['total'] - $size['free'];
                     // Convert KB to GB
                     foreach ($size as $k => $v) {
                         $size[$k] = round($v / 1024 / 1024, 2);
                     }
                 }
             } catch (Exception $e) {
                 $this->response->varDump($e->getMessage());
             }
         }
         $data['storage'] = array('engine' => $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_ENGINE), 'id' => $dbFarmRole->GetSetting(Scalr_Db_Msr::VOLUME_ID) ? $dbFarmRole->GetSetting(Scalr_Db_Msr::VOLUME_ID) : '', 'fs' => $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_FSTYPE), 'size' => $size);
         switch ($data['storage']['engine']) {
             case MYSQL_STORAGE_ENGINE::EBS:
                 $data['storage']['engineName'] = 'Single EBS volume';
                 break;
             case MYSQL_STORAGE_ENGINE::RAID_EBS:
                 $data['storage']['engineName'] = sprintf('RAID %s on %s EBS volumes', $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_RAID_LEVEL), $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_RAID_DISKS_COUNT));
                 break;
             case MYSQL_STORAGE_ENGINE::LVM:
                 $data['storage']['engineName'] = 'LVM on ephemeral device(s)';
                 break;
             case MYSQL_STORAGE_ENGINE::EPH:
                 $data['storage']['engineName'] = 'Ephemeral device';
                 break;
             case MYSQL_STORAGE_ENGINE::CSVOL:
                 $data['storage']['engineName'] = 'Single Cloudstack volume';
                 break;
             default:
                 $data['storage']['engineName'] = $data['storage']['engine'];
                 break;
         }
         $data['additionalInfo']['MasterUsername'] = '******';
         if ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::POSTGRESQL)) {
             $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Postgresql::ROOT_PASSWORD);
             $name = 'PostgreSQL';
         } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::REDIS)) {
             $ports = @json_decode($dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::PORTS_ARRAY));
             $passwords = @json_decode($dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::PASSWD_ARRAY));
             if (!$ports && !$passwords) {
                 $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::MASTER_PASSWORD);
             } else {
                 $data['additionalInfo']['MasterPassword'] = "";
                 foreach ($ports as $i => $port) {
                     $data['additionalInfo']['MasterPassword'] .= "Port {$port}: {$passwords[$i]}<br>";
                 }
             }
             $name = 'Redis';
         } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL2)) {
             $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Mysql2::ROOT_PASSWORD);
             $name = 'MySQL';
         } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::PERCONA)) {
             $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Percona::ROOT_PASSWORD);
             $name = 'Percona Server';
         } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MARIADB)) {
             $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Mariadb::ROOT_PASSWORD);
             $name = 'MariaDB';
         }
         if (!$data['additionalInfo']['MasterPassword']) {
             $data['additionalInfo']['MasterPassword'] = "";
         }
         $data['name'] = $name;
         if ($dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_ENGINE) == 'lvm') {
             $data['noDataBundleForSlaves'] = $dbFarmRole->GetSetting(Scalr_Role_DbMsrBehavior::ROLE_NO_DATA_BUNDLE_FOR_SLAVES) ? true : false;
         }
         $data['dtLastBackup'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_LAST_TS) ? Scalr_Util_DateTime::convertTz((int) $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_LAST_TS), 'd M Y \\a\\t H:i:s') : 'Never';
         $data['dtLastBundle'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_LAST_TS) ? Scalr_Util_DateTime::convertTz((int) $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_LAST_TS), 'd M Y \\a\\t H:i:s') : 'Never';
         $slaveNumber = 0;
         foreach ($dbFarmRole->GetServersByFilter() as $dbServer) {
             if ($dbServer->status != SERVER_STATUS::RUNNING) {
                 //TODO:
                 continue;
             }
             if ($dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) == 1) {
                 $data['isBundleRunning'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_IS_RUNNING);
                 $data['bundleServerId'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_SERVER_ID);
                 if ($data['isBundleRunning']) {
                     $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? AND status = ? ORDER BY timestamp DESC LIMIT 1", array($data['bundleServerId'], "{$name} data bundle", 'running'));
                 } elseif ($data['bundleServerId']) {
                     $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? ORDER BY timestamp DESC LIMIT 1", array($data['bundleServerId'], "{$name} data bundle"));
                 }
                 if ($opId) {
                     $data['bundleOperationId'] = $opId;
                 }
             }
             $data['isBackupRunning'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_IS_RUNNING);
             $data['backupServerId'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_SERVER_ID);
             if (!$data['backupOperationId']) {
                 if ($data['isBackupRunning']) {
                     $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? AND status = ? ORDER BY timestamp DESC LIMIT 1", array($data['backupServerId'], "{$name} backup", 'running'));
                 } elseif ($data['backupServerId']) {
                     $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? ORDER BY timestamp DESC LIMIT 1", array($data['backupServerId'], "{$name} backup"));
                 }
                 if ($opId) {
                     $data['backupOperationId'] = $opId;
                 }
             }
             try {
                 $isCloudstack = in_array($dbFarmRole->Platform, array(SERVER_PLATFORMS::CLOUDSTACK, SERVER_PLATFORMS::IDCF, SERVER_PLATFORMS::UCLOUD));
                 $isMaster = $dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) == 1;
                 if (!$isCloudstack && in_array($this->getParam('type'), array(ROLE_BEHAVIORS::MYSQL2, ROLE_BEHAVIORS::PERCONA, ROLE_BEHAVIORS::MARIADB))) {
                     $password = $dbFarmRole->GetSetting(Scalr_Db_Msr_Mysql2::STAT_PASSWORD);
                     $rStatus = $this->getMySqlReplicationStatus($isMaster ? 'MASTER' : 'SLAVE', $dbServer->remoteIp, 'scalr_stat', $password);
                 }
                 if ($isMaster) {
                     $MasterPosition = $rStatus['Position'];
                     $master_ip = $dbServer->remoteIp;
                     $master_iid = $dbServer->serverId;
                 } else {
                     $num = ++$slaveNumber;
                     $SlavePosition = $rStatus['Exec_Master_Log_Pos'];
                 }
                 $d = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "replicationRole" => $isMaster ? 'Master' : "Slave #{$num}");
                 if (!$isCloudstack) {
                     $d['data'] = $rStatus;
                     $d['masterPosition'] = $MasterPosition;
                     $d['slavePosition'] = $SlavePosition;
                 }
                 $data["replicationStatus"][] = $d;
             } catch (Exception $e) {
                 $data["replicationStatus"][] = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "error" => $e->msg ? $e->msg : $e->getMessage(), "replicationRole" => $isMaster ? 'Master' : 'Slave');
             }
         }
     }
     $this->response->page('ui/dbmsr/status.js', $data);
 }
Example #13
0
 public function GetFreeDeviceName()
 {
     if (!$this->IsSupported('0.11.0')) {
         return $this->GetFreeDeviceNameSNMP();
     }
     $szrClient = Scalr_Net_Scalarizr_Client::getClient($this, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $this->getPort(self::PORT_API));
     $list = $szrClient->blockDevices();
     $map = array("f", "g", "h", "i", "j", "k", "l", "m", "n", "p");
     $n_map = array("1", "2", "3", "4", "5", "6", "7", "8", "9");
     $mapUsed = array();
     foreach ($list as $deviceName) {
         preg_match("/(sd|xvd)([a-z][0-9]*)/", $deviceName, $matches);
         if (!in_array($matches[0][2], $mapUsed)) {
             array_push($mapUsed, $matches[0][2]);
         }
     }
     $deviceL = false;
     foreach ($n_map as $v) {
         foreach ($map as $letter) {
             if (in_array($letter, $mapUsed)) {
                 continue;
             }
             $deviceL = "{$letter}{$v}";
             if (!in_array($deviceL, $mapUsed)) {
                 break;
             } else {
                 $mapUsed = false;
             }
         }
         if ($deviceL) {
             break;
         }
     }
     if (!$deviceL) {
         throw new Exception(_("There is no available device letter on instance for attaching EBS"));
     }
     return "/dev/sd{$deviceL}";
 }