public function xSaveAction() { //TODO: Think about WebSockets $this->request->defineParams(array('config' => array('type' => 'json'))); $farmRole = DBFarmRole::LoadByID($this->getParam('farmRoleId')); $this->user->getPermissions()->validate($farmRole); $behavior = $this->getParam('behavior'); $updateFarmRoleSettings = false; if (!$farmRole->GetRoleObject()->hasBehavior($behavior)) { throw new Exception("Behavior not assigned to this role"); } $config = array(); foreach ($this->getParam('config') as $conf) { if (!$config[$conf['configFile']]) { $config[$conf['configFile']] = array(); } if ($config[$conf['configFile']][$conf['key']] === null) { $config[$conf['configFile']][$conf['key']] = $conf['value']; } else { throw new Exception("Variable {$conf['key']} from {$conf['configFile']} already defined. Please remove second definition"); } } // Update master if ($this->getParam('masterServerId')) { $dbServer = DBServer::LoadByID($this->getParam('masterServerId')); $this->user->getPermissions()->validate($dbServer); if ($dbServer->farmRoleId != $farmRole->ID) { throw new Exception("Server not found"); } if ($dbServer->status != SERVER_STATUS::RUNNING) { throw new Exception("Master server is not running. Config cannot be applied."); } $this->setConfig($dbServer, $behavior, $config); $servers = 0; $savedServers = 1; $updateFarmRoleSettings = true; foreach ($farmRole->GetServersByFilter(array('status' => array(SERVER_STATUS::RUNNING, SERVER_STATUS::INIT))) as $server) { $servers++; try { if ($server->serverId == $dbServer->serverId) { continue; } $this->setConfig($server, $behavior, $config); $savedServers++; } catch (Exception $e) { $warn[] = sprintf("Cannot update configuration on %s (%s): %s", $server->serverId, $server->remoteIp, $e->getMessage()); } } } else { $updateFarmRoleSettings = true; } if ($updateFarmRoleSettings) { $farmRole->SetServiceConfiguration($behavior, $config); } if (!$warn) { $this->response->success(sprintf("Config successfully applied on %s of %s servers", $savedServers, $servers)); } else { $this->response->warning(sprintf("Config was applied on %s of %s servers: %s", $savedServers, $servers, implode("\n", $warn))); } }
public function xListTasksAction() { $this->request->defineParams(array('sort' => array('type' => 'json', 'default' => array('property' => 'dtadded', 'direction' => 'DESC')))); $sql = "SELECT id FROM dm_deployment_tasks WHERE status !='" . Scalr_Dm_DeploymentTask::STATUS_ARCHIVED . "' AND env_id = '{$this->getEnvironmentId()}'"; $response = $this->buildResponseFromSql($sql, array("id")); foreach ($response["data"] as $k => $row) { $data = false; try { $deploymentTask = Scalr_Dm_DeploymentTask::init()->loadById($row['id']); $application = $deploymentTask->getApplication(); try { $dbServer = DBServer::LoadByID($deploymentTask->serverId); $serverIndex = $dbServer->index; } catch (Exception $e) { } $data = array('id' => $deploymentTask->id, 'application_name' => $application->name, 'application_id' => $deploymentTask->applicationId, 'server_id' => $deploymentTask->serverId, 'server_index' => $serverIndex, 'remote_path' => $deploymentTask->remotePath, 'status' => $deploymentTask->status, 'dtadded' => $deploymentTask->dtAdded ? Scalr_Util_DateTime::convertTz($deploymentTask->dtAdded) : "", 'dtdeployed' => $deploymentTask->dtDeployed ? Scalr_Util_DateTime::convertTz($deploymentTask->dtDeployed) : "Never"); try { $dbFarmRole = DBFarmRole::LoadByID($deploymentTask->farmRoleId); $data['farm_roleid'] = $dbFarmRole->ID; $data['role_name'] = $dbFarmRole->GetRoleObject()->name; $data['farm_id'] = $dbFarmRole->FarmID; $data['farm_name'] = $dbFarmRole->GetFarmObject()->Name; } catch (Exception $e) { } } catch (Exception $e) { } $response["data"][$k] = $data; } $this->response->data($response); }
public function xListTasksAction() { $this->request->defineParams(array('sort' => array('type' => 'json', 'default' => array('property' => 'dtadded', 'direction' => 'DESC')))); $sql = "\n SELECT\n dt.id, dma.name AS application_name, servers.index AS server_index, farms.name AS farm_name, roles.name AS role_name,\n dt.status AS status, dt.dtadded AS dtadded\n FROM dm_deployment_tasks dt\n LEFT JOIN dm_applications dma ON dt.dm_application_id = dma.id\n LEFT JOIN servers ON servers.id = dt.server_id\n LEFT JOIN farms ON servers.farm_id = farms.id\n LEFT JOIN roles ON servers.farm_roleid = roles.id\n WHERE dt.`status` != ? AND dt.env_id = ?\n "; $args = array(Scalr_Dm_DeploymentTask::STATUS_ARCHIVED, $this->getEnvironmentId()); list($sql, $args) = $this->request->prepareFarmSqlQuery($sql, $args, 'farms'); $response = $this->buildResponseFromSql2($sql, array('id', 'application_name', 'farm_name', 'role_name', 'server_index', 'status', 'dtadded', 'dtdeployed'), array(), $args); foreach ($response["data"] as $k => $row) { $data = false; try { $deploymentTask = Scalr_Dm_DeploymentTask::init()->loadById($row['id']); $application = $deploymentTask->getApplication(); try { $dbServer = DBServer::LoadByID($deploymentTask->serverId); $serverIndex = $dbServer->index; } catch (Exception $e) { } $data = array('id' => $deploymentTask->id, 'application_name' => $application->name, 'application_id' => $deploymentTask->applicationId, 'server_id' => $deploymentTask->serverId, 'server_index' => $serverIndex, 'remote_path' => $deploymentTask->remotePath, 'status' => $deploymentTask->status, 'dtadded' => $deploymentTask->dtAdded ? Scalr_Util_DateTime::convertTz($deploymentTask->dtAdded) : "", 'dtdeployed' => $deploymentTask->dtDeployed ? Scalr_Util_DateTime::convertTz($deploymentTask->dtDeployed) : "Never"); try { $dbFarmRole = DBFarmRole::LoadByID($deploymentTask->farmRoleId); $data['farm_roleid'] = $dbFarmRole->ID; $data['role_name'] = $dbFarmRole->GetRoleObject()->name; $data['farm_id'] = $dbFarmRole->FarmID; $data['farm_name'] = $dbFarmRole->GetFarmObject()->Name; } catch (Exception $e) { } } catch (Exception $e) { } $response["data"][$k] = $data; } $this->response->data($response); }
function getScalingDecision() { $algo = Scalr_Scaling_Algorithm::get($this->getMetric()->algorithm); $sensor = Scalr_Scaling_Sensor::get($this->getMetric()->alias); $dbFarmRole = DBFarmRole::LoadByID($this->farmRoleId); if ($sensor) { try { $sensorValue = $sensor->getValue($dbFarmRole, $this); } catch (Exception $e) { $this->logger->warn(new FarmLogMessage($dbFarmRole->FarmID, sprintf("Unable to read Scaling Metric value: %s", $e->getMessage()))); return Scalr_Scaling_Decision::NOOP; } $this->logger->info(sprintf(_("Raw sensor value (id: %s, metric_id: %s, metric name: %s): %s"), $this->id, $this->metricId, $this->getMetric()->name, serialize($sensorValue))); switch ($this->getMetric()->calcFunction) { default: $value = $sensorValue[0]; break; case "avg": $value = count($sensorValue) != 0 ? @array_sum($sensorValue) / count($sensorValue) : 0; break; case "sum": $value = @array_sum($sensorValue); break; } $this->lastValue = round($value, 5); $this->save(); $invert = $sensor->isInvert; } else { $invert = false; } return $algo->makeDecision($dbFarmRole, $this, $invert); }
/** * Release used elastic IPs if farm terminated * * @param FarmTerminatedEvent $event */ public function OnFarmTerminated(\FarmTerminatedEvent $event) { $this->Logger->info(sprintf(_("Keep elastic IPs: %s"), $event->KeepElasticIPs)); if ($event->KeepElasticIPs == 1) { return; } $DBFarm = \DBFarm::LoadByID($this->FarmID); $ips = $this->DB->GetAll("SELECT * FROM elastic_ips WHERE farmid=?", array($this->FarmID)); if (count($ips) > 0) { foreach ($ips as $ip) { try { $DBFarmRole = \DBFarmRole::LoadByID($ip['farm_roleid']); if (in_array($DBFarmRole->Platform, array(\SERVER_PLATFORMS::CLOUDSTACK, \SERVER_PLATFORMS::IDCF))) { $cs = $DBFarm->GetEnvironmentObject()->cloudstack($DBFarmRole->Platform); $cs->disassociateIpAddress($ip['allocation_id']); $this->DB->Execute("DELETE FROM elastic_ips WHERE ipaddress=?", array($ip['ipaddress'])); } } catch (\Exception $e) { if (!stristr($e->getMessage(), "does not belong to you")) { $this->Logger->error(sprintf(_("Cannot release elastic IP %s from farm %s: %s"), $ip['ipaddress'], $DBFarm->Name, $e->getMessage())); continue; } } } } }
public function xGetFarmRoleStaticIpsAction($region, $cloudLocation, $farmRoleId) { $p = PlatformFactory::NewPlatform(SERVER_PLATFORMS::GCE); $gceClient = $p->getClient($this->environment); $projectId = $this->environment->keychain(SERVER_PLATFORMS::GCE)->properties[Entity\CloudCredentialsProperty::GCE_PROJECT_ID]; $map = []; if ($farmRoleId) { $dbFarmRole = DBFarmRole::LoadByID($farmRoleId); $this->user->getPermissions()->validate($dbFarmRole); $maxInstances = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::SCALING_MAX_INSTANCES); for ($i = 1; $i <= $maxInstances; $i++) { $map[] = array('serverIndex' => $i); } $servers = $dbFarmRole->GetServersByFilter(); for ($i = 0, $c = count($servers); $i < $c; $i++) { if ($servers[$i]->status != SERVER_STATUS::TERMINATED && $servers[$i]->index) { $map[$servers[$i]->index - 1]['serverIndex'] = $servers[$i]->index; $map[$servers[$i]->index - 1]['serverId'] = $servers[$i]->serverId; $map[$servers[$i]->index - 1]['remoteIp'] = $servers[$i]->remoteIp; $map[$servers[$i]->index - 1]['instanceId'] = $servers[$i]->GetProperty(GCE_SERVER_PROPERTIES::SERVER_NAME); } } $ips = $this->db->GetAll('SELECT ipaddress, instance_index FROM elastic_ips WHERE farm_roleid = ?', array($dbFarmRole->ID)); for ($i = 0, $c = count($ips); $i < $c; $i++) { $map[$ips[$i]['instance_index'] - 1]['elasticIp'] = $ips[$i]['ipaddress']; } } $response = $gceClient->addresses->listAddresses($projectId, $region); $ips = []; /* @var $ip \Google_Service_Compute_Address */ foreach ($response as $ip) { $itm = array('ipAddress' => $ip->getAddress(), 'description' => $ip->getDescription()); if ($ip->status == 'IN_USE') { $itm['instanceId'] = substr(strrchr($ip->users[0], "/"), 1); } $info = $this->db->GetRow("SELECT * FROM elastic_ips WHERE ipaddress = ? LIMIT 1", [$itm['ipAddress']]); if ($info) { try { if ($info['server_id'] == $itm['instanceId']) { for ($i = 0, $c = count($map); $i < $c; $i++) { if ($map[$i]['elasticIp'] == $itm['ipAddress']) { $map[$i]['warningInstanceIdDoesntMatch'] = true; } } } $farmRole = DBFarmRole::LoadByID($info['farm_roleid']); $this->user->getPermissions()->validate($farmRole); $itm['roleName'] = $farmRole->Alias; $itm['farmName'] = $farmRole->GetFarmObject()->Name; $itm['serverIndex'] = $info['instance_index']; } catch (Exception $e) { } } //Invar: Mark Router EIP ad USED $ips[] = $itm; } $this->response->data(['data' => ['staticIps' => ['map' => $map, 'ips' => $ips]]]); }
private function getFarmRoleStaticIps($cloudLocation, $farmRoleId) { $gceClient = $this->getGceClient($this->environment); $projectId = $this->environment->getPlatformConfigValue(GoogleCEPlatformModule::PROJECT_ID); $map = array(); if ($farmRoleId) { $dbFarmRole = DBFarmRole::LoadByID($farmRoleId); $this->user->getPermissions()->validate($dbFarmRole); $maxInstances = $dbFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_MAX_INSTANCES); for ($i = 1; $i <= $maxInstances; $i++) { $map[] = array('serverIndex' => $i); } $servers = $dbFarmRole->GetServersByFilter(); for ($i = 0; $i < count($servers); $i++) { if ($servers[$i]->status != SERVER_STATUS::TERMINATED && $servers[$i]->status != SERVER_STATUS::TROUBLESHOOTING && $servers[$i]->index) { $map[$servers[$i]->index - 1]['serverIndex'] = $servers[$i]->index; $map[$servers[$i]->index - 1]['serverId'] = $servers[$i]->serverId; $map[$servers[$i]->index - 1]['remoteIp'] = $servers[$i]->remoteIp; $map[$servers[$i]->index - 1]['instanceId'] = $servers[$i]->GetProperty(GCE_SERVER_PROPERTIES::SERVER_NAME); } } $ips = $this->db->GetAll('SELECT ipaddress, instance_index FROM elastic_ips WHERE farm_roleid = ?', array($dbFarmRole->ID)); for ($i = 0; $i < count($ips); $i++) { $map[$ips[$i]['instance_index'] - 1]['elasticIp'] = $ips[$i]['ipaddress']; } } $response = $gceClient->addresses->listAddresses($projectId, $cloudLocation); $ips = array(); /* @var $ip \Google_Service_Compute_Address */ foreach ($response as $ip) { var_dump($ip); $itm = array('ipAddress' => $ip->address); $info = $this->db->GetRow("\n SELECT * FROM elastic_ips WHERE ipaddress = ? LIMIT 1\n ", array($itm['ipAddress'])); if ($info) { try { if ($info['server_id'] && $itm['instanceId']) { $dbServer = DBServer::LoadByID($info['server_id']); if ($dbServer->GetProperty(EC2_SERVER_PROPERTIES::INSTANCE_ID) != $itm['instanceId']) { for ($i = 0; $i < count($map); $i++) { if ($map[$i]['elasticIp'] == $itm['ipAddress']) { $map[$i]['warningInstanceIdDoesntMatch'] = true; } } } } $farmRole = DBFarmRole::LoadByID($info['farm_roleid']); $this->user->getPermissions()->validate($farmRole); $itm['roleName'] = $farmRole->GetRoleObject()->name; $itm['farmName'] = $farmRole->GetFarmObject()->Name; $itm['serverIndex'] = $info['instance_index']; } catch (Exception $e) { } } //TODO: Mark Router EIP ad USED $ips[] = $itm; } return array('map' => $map, 'ips' => $ips); }
public function ListFarmRoleParams() { $farmRoleId = $this->GetArg("farm-role-id"); if (!$farmRoleId) { throw new Exception("'farm-role-id' required"); } $dbFarmRole = DBFarmRole::LoadByID($farmRoleId); if ($dbFarmRole->FarmID != $this->DBServer->farmId) { throw new Exception("You can request this information ONLY for roles within server farm"); } $ResponseDOMDocument = $this->CreateResponse(); // Base configuration if ($this->DBServer->farmRoleId == $farmRoleId) { $data = Scalr_Role_Behavior::loadByName(ROLE_BEHAVIORS::BASE)->getBaseConfiguration($this->DBServer); foreach ((array) $data as $k => $v) { $bodyEl = $this->serialize($v, $k, $ResponseDOMDocument); $ResponseDOMDocument->documentElement->appendChild($bodyEl); } } $role = $dbFarmRole->GetRoleObject(); $behaviors = $role->getBehaviors(); foreach ($behaviors as $behavior) { $data = null; if ($behavior == ROLE_BEHAVIORS::MONGODB || $behavior == ROLE_BEHAVIORS::CHEF || $behavior == ROLE_BEHAVIORS::HAPROXY || $behavior == ROLE_BEHAVIORS::NGINX || $behavior == ROLE_BEHAVIORS::RABBITMQ || $behavior == ROLE_BEHAVIORS::APACHE || $behavior == ROLE_BEHAVIORS::VPC_ROUTER) { $data = Scalr_Role_Behavior::loadByName($behavior)->getConfiguration($this->DBServer); } if ($data === null) { if ($behavior == ROLE_BEHAVIORS::CF_CLOUD_CONTROLLER) { $data = new stdClass(); $data->version = $dbFarmRole->GetSetting(Scalr_Role_Behavior_CfCloudController::ROLE_VERSION); } else { if ($behavior == ROLE_BEHAVIORS::MYSQL) { $data = new stdClass(); $data->logFile = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LOG_FILE); $data->logPos = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LOG_POS); $data->rootPassword = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_ROOT_PASSWORD); $data->replPassword = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_REPL_PASSWORD); $data->statPassword = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_STAT_PASSWORD); $data->replicationMaster = (int) $this->DBServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER); //TODO: Storage } else { try { $dbMsrInfo = Scalr_Db_Msr_Info::init($dbFarmRole, $this->DBServer, $behavior); $data = $dbMsrInfo->getMessageProperties(); } catch (Exception $e) { } } } } if ($data) { $bodyEl = $this->serialize($data, $behavior, $ResponseDOMDocument); $ResponseDOMDocument->documentElement->appendChild($bodyEl); } } return $ResponseDOMDocument; }
public function ApacheVhostCreate($DomainName, $FarmID, $FarmRoleID, $DocumentRootDir, $EnableSSL, $SSLPrivateKey = null, $SSLCertificate = null) { $this->restrictAccess(Acl::RESOURCE_SERVICES_APACHE); $validator = new Scalr_Validator(); if ($validator->validateDomain($DomainName) !== true) { $err[] = _("Domain name is incorrect"); } $DBFarm = DBFarm::LoadByID($FarmID); if ($DBFarm->EnvID != $this->Environment->id) { throw new Exception(sprintf("Farm #%s not found", $FarmID)); } $this->user->getPermissions()->validate($DBFarm); $DBFarmRole = DBFarmRole::LoadByID($FarmRoleID); if ($DBFarm->ID != $DBFarmRole->FarmID) { throw new Exception(sprintf("FarmRole #%s not found on Farm #%s", $FarmRoleID, $FarmID)); } if (!$DocumentRootDir) { throw new Exception(_("DocumentRootDir required")); } $options = serialize(array("document_root" => trim($DocumentRootDir), "logs_dir" => "/var/log", "server_admin" => $this->user->getEmail())); $httpConfigTemplateSSL = @file_get_contents(dirname(__FILE__) . "/../../templates/services/apache/ssl.vhost.tpl"); $httpConfigTemplate = @file_get_contents(dirname(__FILE__) . "/../../templates/services/apache/nonssl.vhost.tpl"); $vHost = Scalr_Service_Apache_Vhost::init(); $vHost->envId = (int) $this->Environment->id; $vHost->clientId = $this->user->getAccountId(); $vHost->domainName = $DomainName; $vHost->isSslEnabled = $EnableSSL ? true : false; $vHost->farmId = $FarmID; $vHost->farmRoleId = $FarmRoleID; $vHost->httpdConf = $httpConfigTemplate; $vHost->templateOptions = $options; //SSL stuff if ($vHost->isSslEnabled) { $cert = new Scalr_Service_Ssl_Certificate(); $cert->envId = $DBFarm->EnvID; $cert->name = $DomainName; $cert->privateKey = base64_decode($SSLPrivateKey); $cert->certificate = base64_decode($SSLCertificate); $cert->save(); $vHost->sslCertId = $cert->id; $vHost->httpdConfSsl = $httpConfigTemplateSSL; } else { $vHost->sslCertId = 0; } $vHost->save(); $servers = $DBFarm->GetServersByFilter(array('status' => array(SERVER_STATUS::INIT, SERVER_STATUS::RUNNING))); foreach ($servers as $DBServer) { if ($DBServer->GetFarmRoleObject()->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::NGINX) || $DBServer->GetFarmRoleObject()->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::APACHE)) { $DBServer->SendMessage(new Scalr_Messaging_Msg_VhostReconfigure()); } } $response = $this->CreateInitialResponse(); $response->Result = 1; return $response; }
function getScalingDecision() { $algo = Entity\ScalingMetric::getAlgorithm($this->getMetric()->algorithm); $sensor = Scalr_Scaling_Sensor::get($this->getMetric()->alias); $dbFarmRole = DBFarmRole::LoadByID($this->farmRoleId); if ($sensor) { try { $sensorValue = $sensor->getValue($dbFarmRole, $this); if ($sensorValue === false) { return Scalr_Scaling_Decision::NOOP; } } catch (Exception $e) { $this->logger->warn(new FarmLogMessage($dbFarmRole->FarmID, sprintf("Unable to read Scaling Metric (%s) on farmrole %s value: %s", $this->getMetric()->alias, $dbFarmRole->ID, $e->getMessage()))); return Scalr_Scaling_Decision::NOOP; } $this->logger->debug(sprintf(_("Raw sensor value (id: %s, metric_id: %s, metric name: %s): %s"), $this->id, $this->metricId, $this->getMetric()->name, json_encode($sensorValue))); switch ($this->getMetric()->calcFunction) { case Entity\ScalingMetric::CALC_FUNCTION_AVERAGE: $value = is_array($sensorValue) && count($sensorValue) != 0 ? @array_sum($sensorValue) / count($sensorValue) : 0; break; case Entity\ScalingMetric::CALC_FUNCTION_SUM: $value = @array_sum($sensorValue); break; case Entity\ScalingMetric::CALC_FUNCTION_MAXIMUM: $value = @max($sensorValue); break; case Entity\ScalingMetric::CALC_FUNCTION_MINIMUM: $value = @min($sensorValue); break; default: $value = $sensorValue[0]; } $this->lastValue = round($value, 5); // Sets the Server time to avoid differences between Database and Server time $this->dtLastPolled = time(); $this->save(false, ['settings', 'metric_id']); $invert = $sensor instanceof Scalr_Scaling_Sensors_Custom ? $this->getMetric()->isInvert : $sensor->isInvert; } else { $invert = false; } if ($this->getMetric()->name == 'DateAndTime') { $decision = $algo->makeDecision($dbFarmRole, $this, $invert); $this->instancesNumber = $algo->instancesNumber; $this->lastValue = isset($algo->lastValue) ? $algo->lastValue : null; return $decision; } elseif ($this->getMetric()->name == 'FreeRam') { if ($this->lastValue == 0) { return Scalr_Scaling_Decision::NOOP; } else { return $algo->makeDecision($dbFarmRole, $this, $invert); } } else { return $algo->makeDecision($dbFarmRole, $this, $invert); } }
public function Run() { $container = Scalr::getContainer(); $db = $container->adodb; $services = $db->Execute("SELECT * FROM farm_role_cloud_services"); while ($service = $services->FetchRow()) { $dbFarmRole = DBFarmRole::LoadByID($service['farm_role_id']); if (!$dbFarmRole->GetSetting(DBFarmRole::SETTING_AWS_ELB_ENABLED)) { $dbFarmRole->SetSetting(DBFarmRole::SETTING_AWS_ELB_ENABLED, 1); $dbFarmRole->SetSetting(DBFarmRole::SETTING_AWS_ELB_ID, $service['id']); } } }
function getScalingDecision() { $algo = Entity\ScalingMetric::getAlgorithm($this->getMetric()->algorithm); $sensor = Scalr_Scaling_Sensor::get($this->getMetric()->alias); $dbFarmRole = DBFarmRole::LoadByID($this->farmRoleId); if ($sensor) { try { $sensorValue = $sensor->getValue($dbFarmRole, $this); if ($sensorValue === false) { return Scalr_Scaling_Decision::NOOP; } } catch (Exception $e) { $this->logger->warn(new FarmLogMessage($dbFarmRole->FarmID, sprintf("Unable to read Scaling Metric (%s) on farmrole %s value: %s", $this->getMetric()->alias, $dbFarmRole->ID, $e->getMessage()))); return Scalr_Scaling_Decision::NOOP; } $this->logger->info(sprintf(_("Raw sensor value (id: %s, metric_id: %s, metric name: %s): %s"), $this->id, $this->metricId, $this->getMetric()->name, serialize($sensorValue))); switch ($this->getMetric()->calcFunction) { default: $value = $sensorValue[0]; break; case "avg": $value = is_array($sensorValue) && count($sensorValue) != 0 ? @array_sum($sensorValue) / count($sensorValue) : 0; break; case "sum": $value = @array_sum($sensorValue); break; case "max": $value = @max($sensorValue); break; } $this->lastValue = round($value, 5); $this->save(); $invert = $sensor->isInvert; } else { $invert = false; } if ($this->getMetric()->name == 'DateAndTime') { $decision = $algo->makeDecision($dbFarmRole, $this, $invert); $this->instancesNumber = $algo->instancesNumber; $this->lastValue = $algo->lastValue; return $decision; } elseif ($this->getMetric()->name == 'FreeRam') { if ($this->lastValue == 0) { return Scalr_Scaling_Decision::NOOP; } else { return $algo->makeDecision($dbFarmRole, $this, $invert); } } else { return $algo->makeDecision($dbFarmRole, $this, $invert); } }
/** * @param integer $envId * @param string $serviceId * @return \Scalr\Farm\Role\FarmRoleService|boolean */ public static function findFarmRoleService($envId, $serviceId) { $db = \Scalr::getDb(); $service = $db->GetRow("SELECT id, farm_role_id FROM farm_role_cloud_services WHERE id = ? AND env_id = ?", array($serviceId, $envId)); if ($service) { try { $dbFarmRole = \DBFarmRole::LoadByID($service['farm_role_id']); return new self($dbFarmRole, $service['id']); } catch (\Exception $e) { return false; } } return false; }
public function ListFarmRoleParamsJson() { $farmRoleId = $this->GetArg("farm-role-id"); if (!$farmRoleId) { throw new Exception("'farm-role-id' required"); } $dbFarmRole = DBFarmRole::LoadByID($farmRoleId); if ($dbFarmRole->FarmID != $this->DBServer->farmId) { throw new Exception("You can request this information ONLY for roles within server farm"); } $result = new stdClass(); // Base configuration if ($this->DBServer->farmRoleId == $farmRoleId) { $data = Scalr_Role_Behavior::loadByName(ROLE_BEHAVIORS::BASE)->getBaseConfiguration($this->DBServer); foreach ((array) $data as $k => $v) { $result->{$k} = $v; } } $role = $dbFarmRole->GetRoleObject(); $behaviors = $role->getBehaviors(); foreach ($behaviors as $behavior) { $data = null; if ($behavior == ROLE_BEHAVIORS::MONGODB || $behavior == ROLE_BEHAVIORS::CHEF || $behavior == ROLE_BEHAVIORS::HAPROXY || $behavior == ROLE_BEHAVIORS::NGINX || $behavior == ROLE_BEHAVIORS::RABBITMQ || $behavior == ROLE_BEHAVIORS::APACHE || $behavior == ROLE_BEHAVIORS::VPC_ROUTER) { $data = Scalr_Role_Behavior::loadByName($behavior)->getConfiguration($this->DBServer); } if ($data === null) { if ($behavior == ROLE_BEHAVIORS::MYSQL) { $data = new stdClass(); $data->logFile = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LOG_FILE); $data->logPos = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LOG_POS); $data->rootPassword = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_ROOT_PASSWORD); $data->replPassword = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_REPL_PASSWORD); $data->statPassword = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_STAT_PASSWORD); $data->replicationMaster = (int) $this->DBServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER); } else { try { $dbMsrInfo = Scalr_Db_Msr_Info::init($dbFarmRole, $this->DBServer, $behavior); $data = $dbMsrInfo->getMessageProperties(); } catch (Exception $e) { } } } if ($data) { $result->{$behavior} = $data; } } return $result; }
public function FarmGetDetails($FarmID) { $response = parent::FarmGetDetails($FarmID); foreach ($response->FarmRoleSet->Item as &$item) { $dbFarmRole = DBFarmRole::LoadByID($item->ID); $item->{"CloudLocation"} = $dbFarmRole->CloudLocation; if ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL)) { $item->{"MySQLProperties"} = new stdClass(); $item->{"MySQLProperties"}->{"LastBackupTime"} = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BCP_TS); $item->{"MySQLProperties"}->{"LastBundleTime"} = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BUNDLE_TS); $item->{"MySQLProperties"}->{"IsBackupRunning"} = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_IS_BCP_RUNNING); $item->{"MySQLProperties"}->{"IsBundleRunning"} = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_IS_BUNDLE_RUNNING); } } return $response; }
public function xListEipsAction() { $amazonEC2Client = Scalr_Service_Cloud_Aws::newEc2($this->getParam('cloudLocation'), $this->getEnvironment()->getPlatformConfigValue(Modules_Platforms_Ec2::PRIVATE_KEY), $this->getEnvironment()->getPlatformConfigValue(Modules_Platforms_Ec2::CERTIFICATE)); // Rows $aws_response = $amazonEC2Client->DescribeAddresses(); $rowz = $aws_response->addressesSet->item; if ($rowz instanceof stdClass) { $rowz = array($rowz); } foreach ($rowz as &$pv) { $item = array('ipaddress' => $pv->publicIp, 'instance_id' => $pv->instanceId); $info = $this->db->GetRow("SELECT * FROM elastic_ips WHERE ipaddress=?", array($pv->publicIp)); if ($info) { $item['farm_id'] = $info['farmid']; $item['farm_roleid'] = $info['farm_roleid']; $item['server_id'] = $info['server_id']; $item['indb'] = true; $item['server_index'] = $info['instance_index']; //WORKAROUND: EIPS not imported correclty from 1.2 to 2.0 if (!$item['server_id'] && $info['state'] == 1) { try { $DBServer = DBServer::LoadByPropertyValue(EC2_SERVER_PROPERTIES::INSTANCE_ID, $item['instance_id']); $item['server_id'] = $DBServer->serverId; } catch (Exception $e) { } } if ($item['farm_roleid']) { try { $DBFarmRole = DBFarmRole::LoadByID($item['farm_roleid']); $item['role_name'] = $DBFarmRole->GetRoleObject()->name; $item['farm_name'] = $DBFarmRole->GetFarmObject()->Name; } catch (Exception $e) { } } } else { try { $DBServer = DBServer::LoadByPropertyValue(EC2_SERVER_PROPERTIES::INSTANCE_ID, $pv->instanceId); $item['server_id'] = $DBServer->serverId; $item['farm_id'] = $DBServer->farmId; } catch (Exception $e) { } } $pv = $item; } $response = $this->buildResponseFromData($rowz); $this->response->data($response); }
public function xListAction($serverId = null, $farmId = null, $farmRoleId = null, $status = null) { $sql = "SELECT sa.* FROM server_alerts sa LEFT JOIN farms f ON f.id = sa.farm_id WHERE sa.env_id = ?"; $args = [$this->getEnvironmentId()]; if ($serverId) { $sql .= ' AND sa.server_id = ?'; $args[] = $serverId; } if ($farmId) { $sql .= ' AND sa.farm_id = ?'; $args[] = $farmId; if ($farmRoleId) { $sql .= ' AND sa.farm_roleid = ?'; $args[] = $farmRoleId; } } if ($status) { $sql .= ' AND sa.status = ?'; $args[] = $status; } list($sql, $args) = $this->request->prepareFarmSqlQuery($sql, $args, 'f'); $response = $this->buildResponseFromSql2($sql, ['metric', 'status', 'dtoccured', 'dtlastcheck', 'dtsolved', 'details'], ['server_id', 'details'], $args); foreach ($response['data'] as $i => $row) { $row['dtoccured'] = Scalr_Util_DateTime::convertTz($row['dtoccured']); if ($row['dtlastcheck']) { $row['dtlastcheck'] = Scalr_Util_DateTime::convertTz($row['dtlastcheck']); } else { $row['dtlastcheck'] = false; } if ($row['status'] == Alerts::STATUS_RESOLVED) { $row['dtsolved'] = Scalr_Util_DateTime::convertTz($row['dtsolved']); } else { $row['dtsolved'] = false; } $row['metric'] = Alerts::getMetricName($row['metric']); $row['farm_name'] = DBFarm::LoadByID($row['farm_id'])->Name; try { $row['role_name'] = DBFarmRole::LoadByID($row['farm_roleid'])->GetRoleObject()->name; $dbServer = DBServer::LoadByID($row['server_id']); $row['server_exists'] = $dbServer->status == SERVER_STATUS::RUNNING ? true : false; } catch (Exception $e) { } $response['data'][$i] = $row; } $this->response->data($response); }
public function xListShortcutsAction() { $this->request->defineParams(array('sort' => array('type' => 'string', 'default' => 'id'), 'dir' => array('type' => 'string', 'default' => 'DESC'))); $sql = "SELECT farm_role_scripts.*, scripts.name as scriptname from farm_role_scripts\r\n\t\tINNER JOIN scripts ON scripts.id = farm_role_scripts.scriptid\r\n\t\tWHERE ismenuitem='1' AND farmid IN (SELECT id FROM farms WHERE env_id='" . $this->getEnvironmentId() . "')"; $response = $this->buildResponseFromSql($sql); foreach ($response['data'] as &$row) { $row['farmname'] = $this->db->GetOne("SELECT name FROM farms WHERE id=?", array($row['farmid'])); if ($row['farm_roleid']) { try { $DBFarmRole = DBFarmRole::LoadByID($row['farm_roleid']); $row['rolename'] = $DBFarmRole->GetRoleObject()->name; } catch (Exception $e) { } } } $this->response->data($response); }
public function Run() { $container = Scalr::getContainer(); $db = $container->adodb; $time = microtime(true); //Get all farm_roles with defined Security groups $settings = $db->Execute("SELECT * FROM farm_role_settings WHERE `name`='dns.exclude_role'"); while ($setting = $settings->FetchRow()) { try { $dbFarmRole = DBFarmRole::LoadByID($setting['farm_roleid']); if ($setting['value'] == 1) { $dbFarmRole->SetSetting(DBFarmRole::SETTING_DNS_CREATE_RECORDS, 0); $dbFarmRole->SetSetting(DBFarmRole::SETTING_DNS_EXT_RECORD_ALIAS, null); $dbFarmRole->SetSetting(DBFarmRole::SETTING_DNS_EXT_RECORD_ALIAS, null); } else { $dbFarmRole->SetSetting(DBFarmRole::SETTING_DNS_CREATE_RECORDS, 1); if (!$dbFarmRole->GetSetting(DBFarmRole::SETTING_DNS_EXT_RECORD_ALIAS)) { $dbFarmRole->SetSetting(DBFarmRole::SETTING_DNS_EXT_RECORD_ALIAS, "ext-" . $dbFarmRole->GetRoleObject()->name); } if (!$dbFarmRole->GetSetting(DBFarmRole::SETTING_DNS_INT_RECORD_ALIAS)) { $dbFarmRole->SetSetting(DBFarmRole::SETTING_DNS_INT_RECORD_ALIAS, "int-" . $dbFarmRole->GetRoleObject()->name); } } $dbFarmRole->SetSetting(DBFarmRole::SETTING_EXCLUDE_FROM_DNS, null); } catch (Exception $e) { } } $settings = $db->Execute("SELECT * FROM farm_role_settings WHERE `name`='dns.create_records' AND value='1'"); while ($setting = $settings->FetchRow()) { try { $dbFarmRole = DBFarmRole::LoadByID($setting['farm_roleid']); if (!$dbFarmRole->GetSetting(DBFarmRole::SETTING_DNS_EXT_RECORD_ALIAS)) { $dbFarmRole->SetSetting(DBFarmRole::SETTING_DNS_EXT_RECORD_ALIAS, "ext-" . $dbFarmRole->GetRoleObject()->name); } if (!$dbFarmRole->GetSetting(DBFarmRole::SETTING_DNS_INT_RECORD_ALIAS)) { $dbFarmRole->SetSetting(DBFarmRole::SETTING_DNS_INT_RECORD_ALIAS, "int-" . $dbFarmRole->GetRoleObject()->name); } } catch (Exception $e) { } } $db->Execute("ALTER TABLE `farm_roles` ADD `alias` VARCHAR(50) NULL AFTER `farmid`"); print "Done.\n"; $t = round(microtime(true) - $time, 2); printf("Upgrade process took %0.2f seconds\n\n", $t); }
public function xListShortcutsAction() { $this->request->defineParams(array('sort' => array('type' => 'string', 'default' => 'id'), 'dir' => array('type' => 'string', 'default' => 'DESC'))); $allFarms = $this->request->isAllowed(Acl::RESOURCE_FARMS, Acl::PERM_FARMS_NOT_OWNED_FARMS); $sql = "\n SELECT farm_role_scripts.*, scripts.name as scriptname\n FROM farm_role_scripts\n JOIN scripts ON scripts.id = farm_role_scripts.scriptid\n WHERE ismenuitem='1'\n AND farmid IN (SELECT id FROM farms WHERE env_id='" . intval($this->getEnvironmentId()) . "'\n " . (!$allFarms ? " AND created_by_id = " . $this->db->qstr($this->user->getId()) : "") . ")\n "; $response = $this->buildResponseFromSql($sql); foreach ($response['data'] as &$row) { $row['farmname'] = $this->db->GetOne("\n SELECT name FROM farms\n WHERE id=?" . (!$allFarms ? " AND created_by_id = " . $this->db->qstr($this->user->getId()) : "") . "\n LIMIT 1\n ", array($row['farmid'])); if ($row['farm_roleid']) { try { $DBFarmRole = DBFarmRole::LoadByID($row['farm_roleid']); $row['rolename'] = $DBFarmRole->GetRoleObject()->name; } catch (Exception $e) { } } } $this->response->data($response); }
/** * @param JsonData $sort * @param int $start * @param int $limit */ public function xListAction(JsonData $sort, $start = 0, $limit = 20) { $result = ScriptShortcut::find(['farmId' => ['$in' => $this->getAllowedFarmId()]], null, Scalr\UI\Utils::convertOrder($sort, ['scriptId' => true], ['scriptId', 'farmId', 'farmRoleId']), $limit, $start, true); $data = []; foreach ($result as $shortcut) { /* @var $shortcut ScriptShortcut */ $s = get_object_vars($shortcut); $s['farmName'] = DBFarm::LoadByIDOnlyName($shortcut->farmId); $s['scriptName'] = $shortcut->getScriptName(); try { $farmRole = DBFarmRole::LoadByID($shortcut->farmRoleId); $s['farmRoleName'] = $farmRole->Alias ? $farmRole->Alias : $farmRole->GetRoleObject()->name; } catch (Exception $e) { } $data[] = $s; } $this->response->data(['total' => $result->totalNumber, 'data' => $data]); }
public function OnServiceConfigurationPresetChanged(ServiceConfigurationPresetChangedEvent $event) { $farmRolesPresetInfo = $this->DB->GetAll("SELECT * FROM farm_role_service_config_presets WHERE\n preset_id = ? AND behavior = ?\n ", array($event->ServiceConfiguration->id, $event->ServiceConfiguration->roleBehavior)); if (count($farmRolesPresetInfo) > 0) { $msg = new Scalr_Messaging_Msg_UpdateServiceConfiguration($event->ServiceConfiguration->roleBehavior, $event->ResetToDefaults, 1); foreach ($farmRolesPresetInfo as $farmRole) { try { $dbFarmRole = DBFarmRole::LoadByID($farmRole['farm_roleid']); foreach ($dbFarmRole->GetServersByFilter(array('status' => SERVER_STATUS::RUNNING)) as $dbServer) { if ($dbServer->IsSupported("0.6")) { $dbServer->SendMessage($msg, false, true); } } } catch (Exception $e) { } } } }
public function xListEipsAction() { $aws = $this->environment->aws($this->getParam('cloudLocation')); $addressList = $aws->ec2->address->describe(); $rowz = array(); /* @var $address Ec2DataType\AddressData */ foreach ($addressList as $address) { $item = array('ipaddress' => $address->publicIp, 'allocation_id' => $address->allocationId, 'domain' => $address->domain, 'instance_id' => $address->instanceId === null ? '' : $address->instanceId); $info = $this->db->GetRow("SELECT * FROM elastic_ips WHERE ipaddress=? LIMIT 1", array($address->publicIp)); if ($info) { $item['farm_id'] = $info['farmid']; $item['farm_roleid'] = $info['farm_roleid']; $item['server_id'] = $info['server_id']; $item['indb'] = true; $item['server_index'] = $info['instance_index']; //WORKAROUND: EIPS not imported correclty from 1.2 to 2.0 if (!$item['server_id'] && $info['state'] == 1) { try { $DBServer = DBServer::LoadByPropertyValue(EC2_SERVER_PROPERTIES::INSTANCE_ID, $item['instance_id']); $item['server_id'] = $DBServer->serverId; } catch (Exception $e) { } } if ($item['farm_roleid']) { try { $DBFarmRole = DBFarmRole::LoadByID($item['farm_roleid']); $item['role_name'] = $DBFarmRole->GetRoleObject()->name; $item['farm_name'] = $DBFarmRole->GetFarmObject()->Name; } catch (Exception $e) { } } } else { try { $DBServer = DBServer::LoadByPropertyValue(EC2_SERVER_PROPERTIES::INSTANCE_ID, $address->instanceId); $item['server_id'] = $DBServer->serverId; $item['farm_id'] = $DBServer->farmId; } catch (Exception $e) { } } $rowz[] = $item; } $response = $this->buildResponseFromData($rowz); $this->response->data($response); }
public function Run() { $container = Scalr::getContainer(); $db = $container->adodb; $time = microtime(true); //Get all farm_roles with defined Security groups $settings = $db->Execute("SELECT * FROM farm_role_settings WHERE `name`='aws.additional_security_groups'"); while ($setting = $settings->FetchRow()) { try { $dbFarmRole = DBFarmRole::LoadByID($setting['farm_roleid']); $dbFarmRole->SetSetting(DBFarmRole::SETTING_AWS_SG_LIST_APPEND, 1); $list = trim(trim(str_replace("scalr.ip-pool", "", $setting['value']), ",")); $dbFarmRole->SetSetting(DBFarmRole::SETTING_AWS_SG_LIST, $list); } catch (Exception $e) { } } print "Done.\n"; $t = round(microtime(true) - $time, 2); printf("Upgrade process took %0.2f seconds\n\n", $t); }
public function xDeployAction() { $this->request->defineParams(array('applicationId' => array('type' => 'int'), 'farmId' => array('type' => 'int'), 'farmRoleId' => array('type' => 'int'), 'remotePath')); $application = Scalr_Dm_Application::init()->loadById($this->getParam('applicationId')); $this->user->getPermissions()->validate($application); $dbFarmRole = DBFarmRole::LoadByID($this->getParam('farmRoleId')); $this->user->getPermissions()->validate($dbFarmRole); $servers = $dbFarmRole->GetServersByFilter(array('status' => SERVER_STATUS::RUNNING)); if (!$this->getParam('remotePath')) { throw new Exception("Remote path reuired for deployment"); } if (count($servers) == 0) { throw new Exception("There is no running servers on selected farm/role"); } foreach ($servers as $dbServer) { $deploymentTask = Scalr_Dm_DeploymentTask::init(); $deploymentTask->create($this->getParam('farmRoleId'), $this->getParam('applicationId'), $dbServer->serverId, Scalr_Dm_DeploymentTask::TYPE_MANUAL, $this->getParam('remotePath')); } $this->response->success('Deployment task created'); }
public function xListAlertsAction() { $this->request->defineParams(array('sort' => array('type' => 'string', 'default' => 'id'), 'dir' => array('type' => 'string', 'default' => 'DESC'))); $sql = "SELECT * FROM server_alerts WHERE env_id='" . $this->getEnvironmentId() . "'"; if ($this->getParam('serverId')) { $sql .= ' AND server_id = ' . $this->db->qstr($this->getParam('serverId')); } if ($this->getParam('farmId')) { $sql .= ' AND farm_id = ' . $this->db->qstr($this->getParam('farmId')); if ($this->getParam('farmRoleId')) { $sql .= ' AND farm_roleid = ' . $this->db->qstr($this->getParam('farmRoleId')); } } if ($this->getParam('status')) { $sql .= ' AND status = ' . $this->db->qstr($this->getParam('status')); } $response = $this->buildResponseFromSql($sql, array('server_id', 'details')); foreach ($response['data'] as $i => $row) { $row['dtoccured'] = Scalr_Util_DateTime::convertTz($row['dtoccured']); if ($row['dtlastcheck']) { $row['dtlastcheck'] = Scalr_Util_DateTime::convertTz($row['dtlastcheck']); } else { $row['dtlastcheck'] = false; } if ($row['status'] == Alerts::STATUS_RESOLVED) { $row['dtsolved'] = Scalr_Util_DateTime::convertTz($row['dtsolved']); } else { $row['dtsolved'] = false; } $row['metric'] = Alerts::getMetricName($row['metric']); $row['farm_name'] = DBFarm::LoadByID($row['farm_id'])->Name; try { $row['role_name'] = DBFarmRole::LoadByID($row['farm_roleid'])->GetRoleObject()->name; $dbServer = DBServer::LoadByID($row['server_id']); $row['server_exists'] = $dbServer->status == SERVER_STATUS::RUNNING ? true : false; } catch (Exception $e) { } $response['data'][$i] = $row; } $this->response->data($response); }
public function FarmGetDetails($FarmID) { $response = parent::FarmGetDetails($FarmID); foreach ($response->FarmRoleSet->Item as &$item) { $dbFarmRole = DBFarmRole::LoadByID($item->ID); $item->CloudLocation = $dbFarmRole->CloudLocation; if ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL)) { $item->MySQLProperties = new stdClass(); $item->MySQLProperties->LastBackupTime = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_LAST_BCP_TS); $item->MySQLProperties->LastBundleTime = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_LAST_BUNDLE_TS); $item->MySQLProperties->IsBackupRunning = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_IS_BCP_RUNNING); $item->MySQLProperties->IsBundleRunning = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::MYSQL_IS_BUNDLE_RUNNING); } $dbMsr = $dbFarmRole->GetRoleObject()->getDbMsrBehavior(); if ($dbMsr) { $item->DbMsrProperties = new stdClass(); $item->DbMsrProperties->LastBackupTime = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_LAST_TS); $item->DbMsrProperties->LastBundleTime = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_IS_RUNNING); $item->DbMsrProperties->IsBackupRunning = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_LAST_TS); $item->DbMsrProperties->IsBundleRunning = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_IS_RUNNING); } } return $response; }
/** * Release used elastic IPs if farm terminated * * @param FarmTerminatedEvent $event */ public function OnFarmTerminated(\FarmTerminatedEvent $event) { $this->Logger->info(sprintf(_("Keep elastic IPs: %s"), $event->KeepElasticIPs)); if ($event->KeepElasticIPs == 1) { return; } $DBFarm = \DBFarm::LoadByID($this->FarmID); $ips = $this->DB->GetAll("SELECT * FROM elastic_ips WHERE farmid=?", array($this->FarmID)); if (count($ips) > 0) { foreach ($ips as $ip) { try { $DBFarmRole = \DBFarmRole::LoadByID($ip['farm_roleid']); $aws = $DBFarm->GetEnvironmentObject()->aws($DBFarmRole->CloudLocation); $aws->ec2->address->release($ip["ipaddress"]); } catch (\Exception $e) { if (!stristr($e->getMessage(), "does not belong to you")) { $this->Logger->error(sprintf(_("Cannot release elastic IP %s from farm %s: %s"), $ip['ipaddress'], $DBFarm->Name, $e->getMessage())); continue; } } $this->DB->Execute("DELETE FROM elastic_ips WHERE ipaddress=?", array($ip['ipaddress'])); } } }
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); 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", 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", 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", 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", array($data['backupServerId'], 'MySQL backup')); } if ($opId) { $data['backupOperationId'] = $opId; } } try { $conn =& NewADOConnection("mysqli"); $conn->Connect($dbServer->remoteIp, 'scalr_stat', $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_STAT_PASSWORD), null); $conn->SetFetchMode(ADODB_FETCH_ASSOC); if ($dbServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) == 1) { $r = $conn->GetRow("SHOW MASTER STATUS"); $MasterPosition = $r['Position']; $master_ip = $dbServer->remoteIp; $master_iid = $dbServer->serverId; } else { $r = $conn->GetRow("SHOW SLAVE STATUS"); $num = ++$slaveNumber; $SlavePosition = $r['Exec_Master_Log_Pos']; } $data["replicationStatus"][] = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "data" => $r, "masterPosition" => $MasterPosition, "slavePosition" => $SlavePosition, "replicationRole" => $dbServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) ? 'Master' : "Slave #{$num}"); } catch (Exception $e) { $data["replicationStatus"][] = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "error" => $e->msg ? $e->msg : $e->getMessage(), "replicationRole" => $dbServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) ? 'Master' : 'Slave'); } } } else { $data['dbType'] = $dbFarmRole->GetRoleObject()->getDbMsrBehavior(); if (!$data['dbType']) { $this->response->failure("Unknown db type"); } $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)) { $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::MASTER_PASSWORD); $name = 'Redis'; } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL2)) { $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Mysql2::ROOT_PASSWORD); $name = 'MySQL'; } $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", 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", 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", 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", array($data['backupServerId'], "{$name} backup")); } if ($opId) { $data['backupOperationId'] = $opId; } } try { if ($dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) == 1) { //TODO: } else { $num = ++$slaveNumber; } $data["replicationStatus"][] = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "data" => array(), "replicationRole" => $dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) ? 'Master' : "Slave #{$num}"); } catch (Exception $e) { $data["replicationStatus"][] = array("serverId" => $dbServer->serverId, "error" => $e->msg ? $e->msg : $e->getMessage(), "replicationRole" => $dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) ? 'Master' : 'Slave'); } } } $this->response->page('ui/dbmsr/status.js', $data); }
public function getFarmRoleElasticIps($platform, $cloudLocation, $farmRoleId) { $cs = $this->getEnvironment()->cloudstack($platform); $map = array(); if ($farmRoleId) { $dbFarmRole = DBFarmRole::LoadByID($farmRoleId); $this->user->getPermissions()->validate($dbFarmRole); $maxInstances = $dbFarmRole->GetSetting(Entity\FarmRoleSetting::SCALING_MAX_INSTANCES); for ($i = 1; $i <= $maxInstances; $i++) { $map[] = array('serverIndex' => $i); } $servers = $dbFarmRole->GetServersByFilter(); for ($i = 0, $c = count($servers); $i < $c; $i++) { if ($servers[$i]->status != SERVER_STATUS::TERMINATED && $servers[$i]->index) { $map[$servers[$i]->index - 1]['serverIndex'] = $servers[$i]->index; $map[$servers[$i]->index - 1]['serverId'] = $servers[$i]->serverId; $map[$servers[$i]->index - 1]['remoteIp'] = $servers[$i]->remoteIp; $map[$servers[$i]->index - 1]['instanceId'] = $servers[$i]->GetProperty(CLOUDSTACK_SERVER_PROPERTIES::SERVER_ID); } } $ips = $this->db->GetAll('SELECT ipaddress, instance_index FROM elastic_ips WHERE farm_roleid = ?', array($dbFarmRole->ID)); for ($i = 0, $c = count($ips); $i < $c; $i++) { $map[$ips[$i]['instance_index'] - 1]['elasticIp'] = $ips[$i]['ipaddress']; } } $ccProps = $this->environment->keychain($platform)->properties; $accountName = $ccProps[Entity\CloudCredentialsProperty::CLOUDSTACK_ACCOUNT_NAME]; $domainId = $ccProps[Entity\CloudCredentialsProperty::CLOUDSTACK_DOMAIN_ID]; $requestObject = new ListIpAddressesData(); $requestObject->account = $accountName; $requestObject->domainid = $domainId; $requestObject->zoneid = $cloudLocation; $ipAddresses = $cs->listPublicIpAddresses($requestObject); $ips = array(); if (count($ipAddresses) > 0) { /* @var $ip \Scalr\Service\Aws\Ec2\DataType\AddressData */ foreach ($ipAddresses as $address) { if ($address->purpose != '' && !$address->isstaticnat) { continue; } if ($address->issystem) { continue; } $itm = array('ipAddress' => $address->ipaddress, 'ipAddressId' => (string) $address->id, 'instanceId' => $address->virtualmachineid); $info = $this->db->GetRow("\n SELECT * FROM elastic_ips WHERE ipaddress = ? LIMIT 1\n ", array($itm['ipAddress'])); if ($info) { try { if ($info['server_id'] && $itm['instanceId']) { $dbServer = DBServer::LoadByID($info['server_id']); if ($dbServer->GetProperty(CLOUDSTACK_SERVER_PROPERTIES::SERVER_ID) != $itm['instanceId']) { for ($i = 0, $c = count($map); $i < $c; $i++) { if ($map[$i]['elasticIp'] == $itm['ipAddress']) { $map[$i]['warningInstanceIdDoesntMatch'] = true; } } } } $farmRole = DBFarmRole::LoadByID($info['farm_roleid']); $this->user->getPermissions()->validate($farmRole); $itm['roleName'] = $farmRole->GetRoleObject()->name; $itm['farmName'] = $farmRole->GetFarmObject()->Name; $itm['serverIndex'] = $info['instance_index']; } catch (Exception $e) { } } //TODO: Mark System EIP ad USED $ips[] = $itm; } } return array('map' => $map, 'ips' => $ips); }