/** * 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']]); } } }
/** * xChangeInstanceType * Resizes Ec2 instance * * @param string $serverId * @param string $instanceType * @throws \Scalr\Exception\ModelException * @throws InvalidArgumentException */ public function xChangeInstanceTypeAction($serverId, $instanceType) { $dbServer = DBServer::LoadByID($serverId); $this->user->getPermissions()->validate($dbServer); if (empty($instanceType)) { throw new InvalidArgumentException('Instance type cannot be empty.'); } if ($dbServer->getType() == $instanceType) { throw new InvalidArgumentException(sprintf("The server is already of %s type.", $instanceType)); } $dbServer->GetEnvironmentObject()->aws($dbServer->GetCloudLocation())->ec2->instance->modifyAttribute($dbServer->GetCloudServerID(), InstanceAttributeType::TYPE_INSTANCE_TYPE, $instanceType); // NOTE: instance type name equals to instance type id for ec2 platform $dbServer->update(['type' => $instanceType, 'instanceTypeName' => $instanceType]); $serverHistory = Entity\Server\History::findPk($serverId); /* @var $serverHistory Entity\Server\History */ $serverHistory->instanceTypeName = $instanceType; $serverHistory->type = $instanceType; $serverHistory->save(); $this->response->success("Server's instance type has been successfully modified."); }
/** * Gets server history object * * @return \Scalr\Model\Entity\Server\History Returns server history object */ public function getServerHistory() { $bSave = false; $mapping = ['envId' => 'envId', 'farmId' => 'farmId', 'farmRoleId' => 'farmRoleId', 'serverIndex' => 'index', 'cloudLocation' => 'cloudLocation']; if (!isset($this->serverHistory)) { $entity = Entity\Server\History::findPk($this->serverId); if (!$entity) { $this->serverHistory = new Entity\Server\History(); $this->serverHistory->clientId = $this->clientId; $this->serverHistory->serverId = $this->serverId; $this->serverHistory->platform = $this->platform; $this->serverHistory->cloudLocation = $this->cloudLocation; $this->serverHistory->instanceTypeName = $this->instanceTypeName; $this->serverHistory->roleId = $this->GetProperty(SERVER_PROPERTIES::ROLE_ID); $this->serverHistory->farmCreatedById = $this->GetProperty(SERVER_PROPERTIES::FARM_CREATED_BY_ID); $this->serverHistory->osType = $this->osType; $bSave = true; } else { $this->serverHistory = $entity; } if ($this->GetEnvironmentObject()->analytics->enabled) { $this->serverHistory->projectId = $this->GetProperty(SERVER_PROPERTIES::FARM_PROJECT_ID); $this->serverHistory->ccId = $this->GetProperty(SERVER_PROPERTIES::ENV_CC_ID); $bSave = true; } if (!$this->serverHistory->cloudServerId) { $this->serverHistory->cloudServerId = $this->GetCloudServerID(); $this->serverHistory->type = $this->type; $bSave = true; } } foreach ($mapping as $prop => $key) { if ($this->serverHistory->{$prop} != $this->{$key}) { $this->serverHistory->{$prop} = $this->{$key}; $bSave = true; } } if (!empty($bSave)) { $this->serverHistory->save(); } return $this->serverHistory; }
/** * {@inheritdoc} * @see ServerImportInterface::import() */ public function import($instanceId, $tags = []) { $instances = PlatformFactory::NewPlatform($this->farmRole->platform)->getOrphanedServers($this->farmRole->getFarm()->getEnvironment(), $this->farmRole->cloudLocation, [$instanceId]); if (count($instances) != 1) { throw new ValidationErrorException("Instance was not found"); } $this->orphaned = $instances[0]; $this->tags = $tags; $this->validate(); $farm = $this->farmRole->getFarm(); $server = $this->server = new Entity\Server(); try { $server->serverId = \Scalr::GenerateUID(false); // DBServer::Create, startWithLetter $server->platform = $this->farmRole->platform; $server->cloudLocation = $this->farmRole->cloudLocation; $server->accountId = $farm->accountId; $server->envId = $farm->envId; $server->farmId = $farm->id; $server->farmRoleId = $this->farmRole->id; $server->imageId = $this->orphaned->imageId; $server->status = Entity\Server::STATUS_RUNNING; $server->type = $this->orphaned->instanceType; $server->remoteIp = $this->orphaned->publicIp; $server->localIp = $this->orphaned->privateIp; $server->added = new DateTime(); $server->initialized = new DateTime(); // initialized is used in billing, so we set current time as start point $server->scalarized = 0; $server->setFreeFarmIndex(); $server->setFreeFarmRoleIndex(); $server->properties[Entity\Server::SZR_KEY] = \Scalr::GenerateRandomKey(40); $server->properties[Entity\Server::SZR_KEY_TYPE] = SZR_KEY_TYPE::ONE_TIME; $server->properties[Entity\Server::SZR_VESION] = ''; $server->properties[Entity\Server::LAUNCHED_BY_ID] = $this->user->id; $server->properties[Entity\Server::LAUNCHED_BY_EMAIL] = $this->user->email; $server->properties[Entity\Server::LAUNCH_REASON_ID] = DBServer::LAUNCH_REASON_IMPORT; $server->properties[Entity\Server::LAUNCH_REASON] = DBServer::getLaunchReason(DBServer::LAUNCH_REASON_IMPORT); $server->properties[Entity\Server::FARM_ROLE_ID] = $this->farmRole->id; $server->properties[Entity\Server::ROLE_ID] = $this->farmRole->roleId; $server->properties[Entity\Server::FARM_CREATED_BY_ID] = $farm->ownerId ?: $farm->settings[Entity\FarmSetting::CREATED_BY_ID]; $server->properties[Entity\Server::FARM_CREATED_BY_EMAIL] = $farm->ownerId ? Entity\Account\User::findPk($farm->ownerId)->email : $farm->settings[Entity\FarmSetting::CREATED_BY_EMAIL]; // projectId, ccId $projectId = $farm->settings[Entity\FarmSetting::PROJECT_ID]; $ccId = null; if (!empty($projectId)) { try { $projectEntity = ProjectEntity::findPk($projectId); if ($projectEntity instanceof ProjectEntity) { /* @var $projectEntity ProjectEntity */ $ccId = $projectEntity->ccId; } else { $projectId = null; } } catch (Exception $e) { $projectId = null; } } $server->properties[Entity\Server::FARM_PROJECT_ID] = $projectId; if (empty($ccId)) { $ccId = Entity\Account\Environment::findPk($farm->envId)->getProperty(Entity\Account\EnvironmentProperty::SETTING_CC_ID); } $server->properties[Entity\Server::ENV_CC_ID] = $ccId; if (!empty($server->getImage())) { $server->getImage()->update(['dtLastUsed' => new DateTime()]); } if (!empty($this->farmRole->getRole())) { $this->farmRole->getRole()->update(['lastUsed' => new DateTime()]); } $this->importServer(); $server->save(); $server->setTimeLog('ts_created'); $server->setTimeLog('ts_launched', time()); $history = $server->getHistory(); $history->markAsLaunched($server->properties[Entity\Server::LAUNCH_REASON], $server->properties[Entity\Server::LAUNCH_REASON_ID]); $history->update(['cloudServerId' => $this->orphaned->cloudServerId, 'scuCollecting' => 1]); $this->applyTags(); return $server; } catch (Exception $e) { if (!empty($server->serverId)) { // cleanup $server->deleteBy([['serverId' => $server->serverId]]); Entity\ServerProperty::deleteBy([['serverId' => $server->serverId]]); Entity\Server\History::deletePk($server->serverId); $this->db->Execute("DELETE FROM `servers_launch_timelog` WHERE server_id = ?", [$server->serverId]); } throw new ServerImportException(sprintf("Server create was failed with error: %s", $e->getMessage()), $e->getCode(), $e); } }