GameLiftPlugin/Source/GameLiftCore/Private/Containers/GameLiftContainersHandler.cpp (237 lines of code) (raw):

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #include "GameLiftContainersHandler.h" #include "aws/gamelift/core/exports.h" #include "aws/gamelift/GameLiftClient.h" #include "GameLiftCoreConstants.h" #include "GameLiftCoreLog.h" #include "IGameLiftCoreModule.h" #include "Utils/StringConvertors.h" #include <Utils/StringPaths.h> using namespace Aws::GameLift::Model::ContainerFleetBillingTypeMapper; using namespace Aws::GameLift::Model::ContainerFleetStatusMapper; #define LOCTEXT_NAMESPACE "GameLiftContainersHandler" namespace GameLiftContainersHandlerInternal { ECRFuncErrorCallback ErrorCallback = [](DISPATCH_RECEIVER_HANDLE ErrorReceiver, ECR_ERROR_INFO* ErrorInfo) -> void { FString* Error = reinterpret_cast<FString*>(ErrorReceiver); *Error = ErrorInfo->errorMessage; }; FuncErrorCallback GameLiftErrorCallback = [](DISPATCH_RECEIVER_HANDLE ErrorReceiver, GAMELIFT_ERROR_INFO* ErrorInfo) -> void { FString* Error = reinterpret_cast<FString*>(ErrorReceiver); *Error = ErrorInfo->errorMessage; }; } // namespace GameLiftContainersHandlerInternal void GameLiftContainersHandler::SetupContainersDirectory(const FString BuildDirectory, const FString GameExecutable, const FString ContainersDestinationDirectory) { UE_LOG(GameLiftCoreLog, Log, TEXT("Setting up containers directory")); // Unreal file I/O interface IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); // Prepare directory FString BuildDestinationDirectory = FPaths::Combine(*ContainersDestinationDirectory, TEXT("gamebuild")); if (FPaths::DirectoryExists(*ContainersDestinationDirectory)) { PlatformFile.DeleteDirectoryRecursively(*ContainersDestinationDirectory); } PlatformFile.CreateDirectoryTree(*ContainersDestinationDirectory); PlatformFile.CreateDirectoryTree(*BuildDestinationDirectory); // Copy the build directory to destination folder FString BuildDirectoryName = FPaths::GetCleanFilename(BuildDirectory); BuildDestinationDirectory = FPaths::Combine(*BuildDestinationDirectory, *BuildDirectoryName); PlatformFile.CreateDirectoryTree(*BuildDestinationDirectory); PlatformFile.CopyDirectoryTree(*BuildDestinationDirectory, *BuildDirectory, true); // Copy Dockerfile auto DockerfileTemplatePath = Paths::ContainersTemplatePath(); PlatformFile.CopyFile(*FPaths::Combine(*ContainersDestinationDirectory, TEXT("Dockerfile")), *DockerfileTemplatePath); } GameLiftECRCreateRepositoryResult GameLiftContainersHandler::CreateRepository(const FString& InRepositoryName) { IAWSAccountInstance* AccountInstance = IGameLiftCoreModule::Get().GetProfileBootstrap().GetAccountInstance(); check(AccountInstance); check(AccountInstance->GetInstance()); std::string StdRepositoryName = Convertors::FSToStdS(InRepositoryName); GAMELIFT_ECR_REPO_URI ECRRepoUri; GAMELIFT_ECR_CREATE_REPO_REQUEST Request; Request.repositoryName = StdRepositoryName.c_str(); FString ErrorMessageReceiver; Request.errorCb = GameLiftContainersHandlerInternal::ErrorCallback; Request.errorReceiver = &ErrorMessageReceiver; GameLiftECRCreateRepositoryResult Result; Result.bIsSuccessful = GameLiftECRCreateRepository(AccountInstance->GetInstance(), &Request, &ECRRepoUri); Result.ErrorMessage = ErrorMessageReceiver; if (Result.bIsSuccessful) { UE_LOG(GameLiftCoreLog, Log, TEXT("Successfully created ECR Repository: %s"), *InRepositoryName); Result.RepoUri = FString(ECRRepoUri.repoUri); Result.RepositoryName = InRepositoryName; } else { UE_LOG(GameLiftCoreLog, Error, TEXT("Failed to create ECR Repository '%s' - %s"), *InRepositoryName, *(Result.ErrorMessage)); } return Result; } GameLiftECRDescribeRepositoriesResult GameLiftContainersHandler::DescribeRepositories() { IAWSAccountInstance* AccountInstance = IGameLiftCoreModule::Get().GetProfileBootstrap().GetAccountInstance(); check(AccountInstance); check(AccountInstance->GetInstance()); GAMELIFT_ECR_DESCRIBE_REPOSITORIES_REQUEST Request; FString ErrorMessageReceiver; Request.errorCb = GameLiftContainersHandlerInternal::ErrorCallback; Request.errorReceiver = &ErrorMessageReceiver; GAMELIFT_ECR_DESCRIBE_REPO_INFO DescribeReposInfo; GameLiftECRDescribeRepositoriesResult Result; if (AccountInstance->GetInstance()) { Result.bIsSuccessful = GameLiftECRDescribeRepositories(AccountInstance->GetInstance(), &Request, &DescribeReposInfo); Result.ErrorMessage = ErrorMessageReceiver; } else { Result.bIsSuccessful = false; } if (Result.bIsSuccessful) { for (int i = 0; i < DescribeReposInfo.numRepos; i++) { auto& repoInfo = DescribeReposInfo.repos[i]; Result.Repos.Add({ FString(repoInfo.repoName), FString(repoInfo.repoUri) }); } UE_LOG(GameLiftCoreLog, Log, TEXT("Successfully retrieved ECR Repositories info")); } else { UE_LOG(GameLiftCoreLog, Error, TEXT("Failed to retrieve ECR Repositories info - %s"), *(Result.ErrorMessage)); } return Result; } GameLiftECRListImagesResult GameLiftContainersHandler::ListImages(const FString& InRepositoryName) { IAWSAccountInstance* AccountInstance = IGameLiftCoreModule::Get().GetProfileBootstrap().GetAccountInstance(); check(AccountInstance); check(AccountInstance->GetInstance()); std::string StdRepositoryName = Convertors::FSToStdS(InRepositoryName); GAMELIFT_ECR_LIST_IMAGES_REQUEST Request; Request.repositoryName = StdRepositoryName.c_str(); FString ErrorMessageReceiver; Request.errorCb = GameLiftContainersHandlerInternal::ErrorCallback; Request.errorReceiver = &ErrorMessageReceiver; GAMELIFT_ECR_LIST_IMAGES_INFO ListImagesInfo; GameLiftECRListImagesResult Result; if (AccountInstance->GetInstance()) { Result.bIsSuccessful = GameLiftECRListImages(AccountInstance->GetInstance(), &Request, &ListImagesInfo); Result.ErrorMessage = ErrorMessageReceiver; } else { Result.bIsSuccessful = false; } if (Result.bIsSuccessful) { for (int i = 0; i < ListImagesInfo.numImages; i++) { auto& imageInfo = ListImagesInfo.images[i]; Result.Images.Add({ FString(imageInfo.imageDigest), FString(imageInfo.imageTag) }); } UE_LOG(GameLiftCoreLog, Log, TEXT("Successfully listed ECR Images info")); } else { UE_LOG(GameLiftCoreLog, Error, TEXT("Failed to list ECR iamges info - %s"), *(Result.ErrorMessage)); } return Result; } GameLiftContainersListCgdsResult GameLiftContainersHandler::ListCgds() { IAWSAccountInstance* AccountInstance = IGameLiftCoreModule::Get().GetProfileBootstrap().GetAccountInstance(); check(AccountInstance); check(AccountInstance->GetInstance()); GAMELIFT_CONTAINERS_LIST_CGDS_REQUEST Request; FString ErrorMessageReceiver; Request.errorCb = GameLiftContainersHandlerInternal::GameLiftErrorCallback; Request.errorReceiver = &ErrorMessageReceiver; GAMELIFT_CONTAINERS_LIST_CGD_INFO ListCgdInfo; GameLiftContainersListCgdsResult Result; if (AccountInstance->GetInstance()) { Result.bIsSuccessful = GameLiftContainersListCgds(AccountInstance->GetInstance(), &Request, &ListCgdInfo); Result.ErrorMessage = ErrorMessageReceiver; } else { Result.bIsSuccessful = false; } if (Result.bIsSuccessful) { for (int i = 0; i < ListCgdInfo.numCgds; i++) { auto& cgdInfo = ListCgdInfo.cgds[i]; Result.Cgds.Add({ FString(cgdInfo.cgdName) }); } UE_LOG(GameLiftCoreLog, Log, TEXT("Successfully retrieved container group definitions info")); } else { UE_LOG(GameLiftCoreLog, Error, TEXT("Failed to retrieve container group definitions info - %s"), *(Result.ErrorMessage)); } return Result; } GameLiftDescribeCgdResult GameLiftContainersHandler::DescribeCgd(const FString& InCgdName) { IAWSAccountInstance* AccountInstance = IGameLiftCoreModule::Get().GetProfileBootstrap().GetAccountInstance(); check(AccountInstance); check(AccountInstance->GetInstance()); std::string StdCgdName = Convertors::FSToStdS(InCgdName); GAMELIFT_CONTAINERS_DESCRIBE_CGD_INFO DescribeCgdInfo; GAMELIFT_CONTAINERS_DESCRIBE_CGD_REQUEST Request; Request.cgdName = StdCgdName.c_str(); FString ErrorMessageReceiver; Request.errorCb = GameLiftContainersHandlerInternal::GameLiftErrorCallback; Request.errorReceiver = &ErrorMessageReceiver; GameLiftDescribeCgdResult Result; Result.bIsSuccessful = GameLiftContainersDescribeCgd(AccountInstance->GetInstance(), &Request, &DescribeCgdInfo); Result.ErrorMessage = ErrorMessageReceiver; if (Result.bIsSuccessful) { UE_LOG(GameLiftCoreLog, Log, TEXT("Successfully described container group definition: %s"), *InCgdName); Result.CgdVersion = FString::FromInt(DescribeCgdInfo.cgdVersion); Result.CgdStatus = FString(DescribeCgdInfo.cgdStatus); UE_LOG(GameLiftCoreLog, Log, TEXT("Container group definition status is: %s"), *Result.CgdStatus); } else { UE_LOG(GameLiftCoreLog, Error, TEXT("Failed to described container group definition '%s' - %s"), *InCgdName, *(Result.ErrorMessage)); } return Result; } GameLiftDescribeContainerFleetResult GameLiftContainersHandler::DescribeContainerFleet(const FString& GameName) { IAWSAccountInstance* AccountInstance = IGameLiftCoreModule::Get().GetProfileBootstrap().GetAccountInstance(); check(AccountInstance); check(AccountInstance->GetInstance()); auto AccountHandle = AccountInstance->GetInstance(); GAMELIFT_CONTAINERS_DESCRIBE_CONTAINER_FLEET_INFO DescribeContainerFleetInfo; GAMELIFT_CONTAINERS_DESCRIBE_CONTAINER_FLEET_REQUEST Request; FString ErrorMessageReceiver; Request.errorCb = GameLiftContainersHandlerInternal::GameLiftErrorCallback; Request.errorReceiver = &ErrorMessageReceiver; GameLiftDescribeContainerFleetResult Result; std::string StdGameName = Convertors::FSToStdS(GameName); GameLiftAccountSetGameName(AccountHandle, StdGameName.c_str()); // game name needed to get the stack name Result.bIsSuccessful = GameLiftContainersDescribeContainerFleet(AccountHandle, &Request, &DescribeContainerFleetInfo); Result.ErrorMessage = ErrorMessageReceiver; if (Result.bIsSuccessful) { auto fleetStatusStd = GetNameForContainerFleetStatus(DescribeContainerFleetInfo.containerFleetStatus); auto FleetTypeStd = GetNameForContainerFleetBillingType(DescribeContainerFleetInfo.containerFleetBillingType); auto InstanceTypeStd = DescribeContainerFleetInfo.instanceType; Result.FleetId = FString(DescribeContainerFleetInfo.fleetId); Result.FleetStatus = FString(fleetStatusStd.c_str()); Result.FleetType = FString(FleetTypeStd.c_str()); Result.InstanceType = FString(InstanceTypeStd.c_str()); UE_LOG(GameLiftCoreLog, Log, TEXT("Successfully described container fleet: %s"), *Result.FleetId); } else { UE_LOG(GameLiftCoreLog, Error, TEXT("Failed to described container fleet - %s"), *(Result.ErrorMessage)); } return Result; }