/** * Fill information about Farm/FarmRole for each object based on cloudServerId. * cloudServerId could be empty or didn't exist in our database. * * @param array[] $data Array of arrays */ private function applyFarmRoleInfo(&$data) { $cloudServerIds = []; foreach ($data as $row) { if ($row['cloudServerId']) { $cloudServerIds[] = $row['cloudServerId']; } } if (empty($cloudServerIds)) { return; } $server = new Entity\Server(); $history = new Entity\Server\History(); $farm = new Entity\Farm(); $farmRole = new Entity\FarmRole(); $cloudServerIds = join(",", array_map(function ($serverId) { return $this->db->qstr($serverId); }, $cloudServerIds)); $sql = "\n SELECT {$farm->columnId} AS farmId, {$farm->columnName} AS farmName, {$farmRole->columnId} AS farmRoleId,\n {$farmRole->columnAlias} AS farmRoleName, {$server->columnServerId} AS serverId, {$server->columnIndex} AS serverIndex,\n {$history->columnCloudServerId} AS cloudServerId FROM {$server->table()}\n JOIN {$history->table()} ON {$server->columnServerId} = {$history->columnServerId}\n JOIN {$farm->table()} ON {$server->columnFarmId} = {$farm->columnId}\n JOIN {$farmRole->table()} ON {$server->columnFarmRoleId} = {$farmRole->columnId}\n WHERE {$server->columnEnvId} = ? AND {$history->columnCloudServerId} IN ({$cloudServerIds})\n "; $result = []; foreach ($this->db->Execute($sql, [$this->getEnvironmentId()]) as $row) { $result[$row['cloudServerId']] = $row; } foreach ($data as &$row) { if (!empty($row['cloudServerId']) && !empty($result[$row['cloudServerId']])) { $row = array_merge($row, $result[$row['cloudServerId']]); } } }
/** * Gets Default search criteria for the Environment scope * * @return array Returns array of the default search criteria for the Environment scope */ private function getDefaultCriteria() { $server = new Server(); $defaultCondition = sprintf("{$server->columnAccountId()} = %d AND {$server->columnEnvId()} = %d ", $this->getUser()->accountId, $this->getEnvironment()->id); $and = " AND {$server->columnFarmId()} IS NOT NULL "; if (!$this->hasPermissions(Acl::RESOURCE_FARMS)) { $where = []; $farm = new Farm(); $farmTeam = new FarmTeam(); $join[] = " LEFT JOIN {$farm->table('f')} ON {$farm->columnId('f')} = {$server->columnFarmId()}"; if ($this->hasPermissions(Acl::RESOURCE_OWN_FARMS)) { $where[] = "{$farm->columnOwnerId('f')} = " . $farm->qstr('ownerId', $this->getUser()->id); } if ($this->hasPermissions(Acl::RESOURCE_TEAM_FARMS)) { $join[] = "\n LEFT JOIN {$farmTeam->table('ft')} ON {$farmTeam->columnFarmId('ft')} = {$farm->columnId('f')}\n LEFT JOIN `account_team_users` `atu` ON `atu`.`team_id` = {$farmTeam->columnTeamId('ft')}\n LEFT JOIN `account_team_envs` `ate` ON `ate`.`team_id` = {$farmTeam->columnTeamId('ft')} AND `ate`.`env_id` = {$farm->columnEnvId('f')}\n "; $where[] = "`atu`.`user_id` = " . $farmTeam->db()->qstr($this->getUser()->id) . " AND `ate`.`team_id` IS NOT NULL"; } if (!empty($where)) { $criteria[Farm::STMT_WHERE] = '(' . $defaultCondition . $and . ' AND ' . join(' OR ', $where) . ')'; } $criteria[Farm::STMT_FROM] = $server->table() . implode(' ', $join); } // add Temporary and Importing Servers to response if ($this->hasPermissions(Acl::RESOURCE_IMAGES_ENVIRONMENT, Acl::PERM_IMAGES_ENVIRONMENT_MANAGE)) { $extraCondition = sprintf("({$defaultCondition} AND {$server->columnFarmId()} IS NULL AND {$server->columnStatus()} IN ('%s', '%s'))", Server::STATUS_IMPORTING, Server::STATUS_TEMPORARY); if (empty($criteria[Farm::STMT_WHERE]) && $this->hasPermissions(Acl::RESOURCE_FARMS)) { $criteria[Farm::STMT_WHERE] = "(({$defaultCondition}{$and}) OR {$extraCondition})"; } else { if (empty($criteria[Farm::STMT_WHERE])) { $criteria[Farm::STMT_WHERE] = "{$extraCondition}"; } else { $criteria[Farm::STMT_WHERE] = "({$criteria[Farm::STMT_WHERE]} OR {$extraCondition})"; } } } if (empty($criteria[Farm::STMT_WHERE])) { $criteria[Farm::STMT_WHERE] = $defaultCondition; } return $criteria; }
/** * @param string $query * @throws Scalr_Exception_Core */ public function xSearchResourcesAction($query) { if (trim($query) == '') { $this->response->data(['data' => []]); return; } $environments = $this->request->getScope() == ScopeInterface::SCOPE_ACCOUNT ? array_map(function ($r) { return $r['id']; }, $this->user->getEnvironments()) : [$this->getEnvironmentId()]; $f = new Entity\Farm(); $s = new Entity\Server(); $fr = new Entity\FarmRole(); $e = new Entity\Account\Environment(); $at = new Entity\Account\Team(); $sp = new Entity\Server\Property(); $farmSql = []; $serverSql = []; $queryEnc = "%{$query}%"; foreach ($environments as $envId) { $acl = $this->user->getAclRolesByEnvironment($envId); $isTermporaryServerPerm = $acl->isAllowed(Acl::RESOURCE_IMAGES_ENVIRONMENT, Acl::PERM_IMAGES_ENVIRONMENT_BUILD) || $acl->isAllowed(Acl::RESOURCE_IMAGES_ENVIRONMENT, Acl::PERM_IMAGES_ENVIRONMENT_IMPORT); if ($acl->isAllowed(Acl::RESOURCE_FARMS)) { $farmSql[] = "{$f->columnEnvId} = {$envId}"; if ($isTermporaryServerPerm) { $serverSql[] = "{$s->columnEnvId} = {$envId}"; } else { $serverSql[] = "{$s->columnEnvId} = {$envId} AND {$s->columnFarmId} IS NOT NULL"; } } else { $q = []; if ($acl->isAllowed(Acl::RESOURCE_TEAM_FARMS)) { $t = array_map(function ($t) { return $t['id']; }, $this->user->getTeams()); if (count($t)) { $q[] = "{$f->columnTeamId} IN (" . join(',', $t) . ")"; } } if ($acl->isAllowed(Acl::RESOURCE_OWN_FARMS)) { $q[] = "{$f->columnCreatedById} = {$this->user->getId()}"; } if (count($q)) { $farmSql[] = "{$f->columnEnvId} = {$envId} AND (" . join(" OR ", $q) . ")"; } if ($isTermporaryServerPerm) { $q[] = "{$s->columnStatus} IN ('" . Entity\Server::STATUS_IMPORTING . "', '" . Entity\Server::STATUS_TEMPORARY . "') AND {$s->columnFarmId} IS NULL"; } if (count($q)) { $serverSql[] = "{$s->columnEnvId} = {$envId} AND (" . join(" OR ", $q) . ")"; } } } $farms = []; if (count($farmSql)) { $farmStmt = $this->db->Execute("\n SELECT {$f->columnId} AS id, {$f->columnName} AS name, {$f->columnEnvId} AS envId, {$f->columnStatus} AS status,\n {$f->columnAdded} AS added, {$f->columnCreatedByEmail} AS createdByEmail, {$at->columnName} AS teamName, {$e->columnName} AS `envName`\n FROM {$f->table()}\n LEFT JOIN {$at->table()} ON {$at->columnId} = {$f->columnTeamId}\n LEFT JOIN {$e->table()} ON {$f->columnEnvId} = {$e->columnId}\n WHERE ({$f->columnName} LIKE ?) AND (" . join(" OR ", $farmSql) . ")", [$queryEnc]); while ($farm = $farmStmt->FetchRow()) { $farm['status'] = Entity\Farm::getStatusName($farm['status']); $farm['added'] = Scalr_Util_DateTime::convertTz($farm['added'], 'M j, Y H:i'); $farms[] = ['entityName' => 'farm', 'envId' => $farm['envId'], 'envName' => $farm['envName'], 'matchField' => 'Name', 'matchValue' => $farm['name'], 'data' => $farm]; } } $servers = []; if (count($serverSql)) { $serverStmt = $this->db->Execute("\n SELECT {$s->columnServerId} AS serverId, {$s->columnFarmId} AS farmId, {$s->columnFarmRoleId} AS farmRoleId,\n {$s->columnEnvId} AS envId, {$s->columnPlatform} AS platform, {$s->columnInstanceTypeName} AS instanceTypeName,\n {$s->columnStatus} AS status, {$s->columnCloudLocation} AS cloudLocation, {$s->columnRemoteIp} AS publicIp,\n {$s->columnLocalIp} AS privateIp, {$s->columnAdded} AS added, {$f->columnName} AS farmName,\n {$fr->columnAlias} AS farmRoleName, {$e->columnName} AS `envName`, {$fr->columnRoleId} AS roleId,\n {$sp->columnValue('sp1', 'hostname')}\n FROM {$s->table()}\n LEFT JOIN {$f->table()} ON {$f->columnId} = {$s->columnFarmId}\n LEFT JOIN {$fr->table()} ON {$fr->columnId} = {$s->columnFarmRoleId}\n LEFT JOIN {$e->table()} ON {$e->columnId} = {$s->columnEnvId}\n LEFT JOIN {$sp->table('sp1')} ON {$sp->columnServerId('sp1')} = {$s->columnServerId} AND {$sp->columnName('sp1')} = ?\n WHERE ({$s->columnRemoteIp} LIKE ? OR {$s->columnLocalIp} LIKE ? OR {$sp->columnValue('sp1')} LIKE ?) AND (" . join(" OR ", $serverSql) . ")\n GROUP BY {$s->columnServerId}", [Scalr_Role_Behavior::SERVER_BASE_HOSTNAME, $queryEnc, $queryEnc, $queryEnc]); $names = ['publicIp' => 'Public IP', 'privateIp' => 'Private IP', 'hostname' => 'Hostname']; while ($server = $serverStmt->FetchRow()) { $server['added'] = Scalr_Util_DateTime::convertTz($server['added'], 'M j, Y H:i'); if (strstr($server['publicIp'], $query)) { $m = 'publicIp'; } else { if (strstr($server['privateIp'], $query)) { $m = 'privateIp'; } else { $m = 'hostname'; } } $servers[] = ['entityName' => 'server', 'envId' => $server['envId'], 'envName' => $server['envName'], 'matchField' => $names[$m], 'matchValue' => $server[$m], 'data' => $server]; } } $this->response->data(['data' => array_merge($farms, $servers)]); }